FreeBSD 핸드북 : 어플리케이션 설치하기: 포트 콜렉션 : 직접 포트 만들기 : 느린 포팅
Previous: 빠른 포팅
Next: Makefile 설정하기

4.7.2. 느린 포팅

예, 포팅은 그렇게 간단하지 안고, 동작하기 위해서는 몇가지 변경이 필요합니다. 이 섹션에서는 단계별로 포트 패러다임에 맞게 작업하기 위해 어떻게 고쳐야 하는지를 설명합니다.

4.7.2.1. 동작원리

먼저 설명할 것은 여러분의 포트 디렉토리에서 사용자가 처음에 `make'를 입력할 때 나타나는 일련의 사건입니다. 이 글을 읽는 동안 다른 창에서 bsd.port.mk를 보고 있으면 이해하는데 많은 도움이 될 것입니다.

하지만 bsd.port.mk이 어떻게 돌아가는지를 실제로 이해하지 못했다고 걱정하지 말기를 바랍니다. 아는 사람은 많지 않으니까요.. :>

  1. fetch 타겟을 실행합니다. fetch 타겟은 tarball이 ${DISTDIR}에 지역적으로 존재하는지를 확인하는 일을 합니다. fetch가 ${DISTDIR} 에서 필요한 파일을 찾을 수 없으면 Makefile에 지정된 URL ${MASTER_SITES}과 백업으로 허가받은 백업을 놓는 장소인 우리의 주 FTP사이트인 ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/ 를 찾습니다. 그리고 나서 파일을 요청하고 있는 사이트가 인터넷에 직접 접속되어 있다는 가정 하에 ${FETCH}을 사용하여 해당 이름의 배포본 파일을 받으려 합니다. 이 작업이 성공하면, ${DISTDIR}에 나중에 쓸 때를 대비하여 파일을 저장하고 다음 순서로 갑니다.
  2. extract 타겟을 실행합니다. 이는 ${DISTDIR}에서 포트의 배포 파일을 찾고(보통 gzip으로 압축된 tarball), ${WRKDIR}에 지정된 임시 부디렉토리에 풀어넣습니다(기본값은 work).
  3. patch 타겟을 실행합니다. 먼저 ${PATCHFILES}에 정의된 패치를 적용합니다. 두번째로 ${PATCHDIR}(기본값은 patches 부디렉토리)에서 패치를 찾을 수 있다면 지금 알파벳 순서에 의해 적용합니다.
  4. configure 타겟을 실행합니다. 이는 여러가지 다른 일 중 하나를 합니다.
    1. scripts/configure가 존재한다면 실행합니다.
    2. ${HAS_CONFIGURE} 또는 ${GNU_CONFIGURE} 가 지정되어 있다면, ${WRKSRC}/configure 를 실행합니다.
    3. ${USE_IMAKE} 가 지정되면, ${XMKMF} (기본값: `xmkmf -a') 을 실행합니다.
  5. build 타겟을 실행합니다. 포트의 사적 작업 디렉토리 (${WRKSRC})로 디렉토리를 옮기고 프로그램을 컴파일합니다. ${USE_GMAKE}가 지정되어 있으면, GNU make가 사용되며, 다른 경우에는 시스템의 make가 사용됩니다.

위의 내용은 기본 동작입니다. 추가로, `pre-<어쩌구>' 나 `post-<어쩌구>' 타겟을 정의할 수 있고, scripts 부디렉토리에 이런 이름의 스크립트를 만들 수 있으며, 기본 동작이 수행되기 이전이나 이후에 수행될 것입니다.

예를 들어, Makefile에 post-extract 타겟이 정의되어 있으며 scripts 부디렉토리에 pre-build 파일이 있으면, post-extract 타겟은 보통의 풀어넣기 동작 후에 수행될 것이며, pre-build 스크립트는 기본 컴파일 규칙이 수행되기 전에 수행됩니다. 동작이 간단하다면 Makefile 타겟을 쓸 것을 권장하는데, 포트가 필요로 하는 기본이 아닌 동작의 종류를 쉽게 알아낼 수 있도록 하기 위해서입니다.

기본 동작은 bsd.port.mk에 의해서 `do-<어쩌구>'타겟을 수행하는 것입니다. 예를 들면, 포트를 풀어넣는 명령은 `do-extract' 타겟에 있습니다. 기본 타겟이 마음에 들지 않으면 Makefile에서 `do-<어쩌구>' 를 재정의하여 고칠 수 있습니다.

`주' 타겟(e.g., extract, configure 등등)은 이전까지의 모든 과정이 완료되었는지를 검사하고 실제 타겟이나 스크립트를 부르는 것만 하며, 바뀌어서는 안된다는 것에 주의하세요. 풀어넣기 과정을 고치고 싶으면 do-extract를 고치고, extract에는 손대지 마세요!

이제 사용자가 `make' 를 입력하면 어떻게 되는지 이해하였으므로, 완벽한 포트를 만들기 위한 권장 단계를 알아봅시다.

4.7.2.2. 원본 소스 얻기

(보통)원본 소스는 압축된 tarball (<foo>.tar.gz 또는 <foo>.tar.Z)로 받아서 ${DISTDIR}에 복사해 넣습니다. 가능하다면 언제나 원본 소스를 사용합시다.

네트워크에 잘 연결된 ftp/http 사이트를 찾을 수 없거나 귀찮은 비표준 포맷으로 압축되어 있는 사이트만을 찾았다면 여러분이 제어할 수 있는 믿을 수 있는 http나 ftp서버에 복사본을 놓고 싶을 것입니다. (예: 여러분의 홈페이지) 이와 같은 선택을 반영하기 위해 MASTER_SITES를 지정하였는지 확인하세요.

배포 파일을 놓을만한 편리하고 믿을 만한 곳을 찾지 못했다면 (여러분이 FreeBSD 커미터라면, freefall의 public_html 디렉토리에 놓으면 됩니다) 다음 장소에 놓아서 우리가 스스로 `관리'할 수 있습니다.

ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/LOCAL_PORTS/

이 위치는 ${MASTER_SITE_LOCAL}로 지정됩니다. 어떻게 해야 할 지 모르겠다면 FreeBSD 포트 메일링 리스트 <freebsd-ports@FreeBSD.ORG> 로 전자우편을 보내세요.

포트의 원본 소스가 별로 좋지 않는 이유로 인해 항상 바뀌고 있다면 배포 파일을 여러분의 홈페이지에 놓고 이를 첫번째의 MASTER_SITES에 기록하세요. 이는 사용자들이 `체크섬 맞지 않음' 오류를 내지 않도록 하고, 우리 ftp 사이트 관리자의 작업량을 줄일 수 있습니다. 또한, 포트에 대해 마스터 사이트가 하나라면, 여러분의 사이트에 백업을 만들고 두번째의 MASTER_SITES로 기록하세요.

여러분의 포트가 인터넷에서 찾을 수 있는 몇가지 추가 `패치'를 필요로 한다면, 그것도 같이 받아서 ${DISTDIR} 에 넣으세요. 주 소스 tarball을 받는 곳이 아니라도 좋습니다. 우리는 이런 경우를 다룰 수 있는 방법이 있습니다(아래의 ${PATCHFILES} 의 설명을 보세요).

4.7.2.3. 포트를 고치기

tarball의 복사본을 개인 디렉토리에 풀어넣고 FreeBSD의 현재 버전에서 적절하게 컴파일할 수 있도록 필요한 변경을 합니다. 쉽게 자동화할 수 있도록 여러분이 하는 일을 잘 따라가도록 하세요. 모든 것 - 파일의 삭제, 추가, 변경 - 은 포트를 다 만들었을 때 자동화된 스크립트나 패치 파일로 다시 할 수 있어야 합니다.

포트가 컴파일이나 설치하기 위해 중요한 사용자 입력/맞춤 작업을 필요로 할 때에는 Larry Wall의 고전적인 Configure 스크립트중 하나를 살펴보거나 스스로 비슷한 일을 해야 할 것입니다. 새 포트 콜렉션의 목적은 최소한의 디스크 공간을 사용하여 최종 사용자에게 가능한 한 `플러그-앤-플레이'하도록 포트를 만드는 것입니다.

참고: 명시적으로 언급되지 않았다면, 여러분이 만들어서 FreeBSD 포트 콜렉션에 기증한 패치 파일, 스크립트, 다른 파일은 표준 BSD 저작권에 따릅니다.

4.7.2.4. 패치하기

포트를 준비하면서, 추가되거나 변경된 파일은 나중에 패치하도록 재귀적 diff로 만들 수 있습니다. 적용할 패치의 집합은 `patch-<xx>' 라는 이름의 파일에 모아야 합니다. <xx> 는 패치가 적용될 순서를 나타냅니다 -- 패치는 알파벳 순서로 적용되므로, `aa'가 가장 먼저이고, 그 다음은 `ab'의 순서입니다. 이 파일들은 ${PATCHDIR}에 저장되어야 하며, 여기 있는 것들은 자동적으로 적용됩니다. 모든 패치는 ${WRKSRC}에 상대적이야 합니다(일반적으로 포트의 tarball을 풀어넣는 곳이며, 컴파일을 하는 곳입니다). 수정과 업그레이드를 편리하게 하도록, 같은 파일을 고치는 패치가 두개 이상 있어서는 안됩니다(예. patch-aa와 patch-ab가 모두 ${WRKSRC}/foobar.c를 바꾸는 경우).

4.7.2.5. 설정하기

추가적인 맞춤 작업용 명령들을 configure 스크립트에 포함하고 `scripts' 부디렉토리에 저장합니다. 앞에서도 말했듯이, 이 작업은 Makefile 타겟으로도 할 수 있고 pre-configure나 post-configure라는 이름의 스크립트로도 할 수 있습니다.

4.7.2.6. 사용자 입력 다루기

여러분의 포트가 컴파일이나 설정 또는 설치하기 위해 사용자 입력을 필요로 하면, Makefile에서 IS_INTERACTIVE를 설정하세요. 이는 사용자가 자신의 환경에서 BATCH 변수를 지정한 경우 여러분의 포트를 넘어가므로 `밤새 포트 컴파일하기'를 가능하도록 합니다(그리고 사용자가 INTERACTIVE 변수를 지정하면 사용자 입력을 필요로하는 포트만 만들어집니다).

질문에 대한 합리적인 기본 대답을 할 수 있으면, PACKAGE_BUILDING 변수를 지정하고 대화식 스크립트가 지정되어 있다면 끄세요. 이는 CD-ROM이나 ftp용의 패키지를 만들 수 있도록 합니다.


FreeBSD 핸드북 : 어플리케이션 설치하기: 포트 콜렉션 : 직접 포트 만들기 : 느린 포팅
Previous: 빠른 포팅
Next: Makefile 설정하기