예, 포팅은 그렇게 간단하지 안고, 동작하기 위해서는 몇가지 변경이 필요합니다. 이 섹션에서는 단계별로 포트 패러다임에 맞게 작업하기 위해 어떻게 고쳐야 하는지를 설명합니다.
먼저 설명할 것은 여러분의 포트 디렉토리에서 사용자가 처음에
`make'를 입력할 때 나타나는 일련의 사건입니다. 이 글을 읽는
동안 다른 창에서 bsd.port.mk를 보고 있으면 이해하는데 많은
도움이 될 것입니다.
하지만 bsd.port.mk이 어떻게 돌아가는지를 실제로 이해하지
못했다고 걱정하지 말기를 바랍니다. 아는 사람은 많지
않으니까요.. :>
${DISTDIR}에 지역적으로 존재하는지를 확인하는 일을
합니다. fetch가 ${DISTDIR} 에서 필요한 파일을 찾을 수
없으면 Makefile에 지정된 URL ${MASTER_SITES}과
백업으로 허가받은 백업을 놓는 장소인 우리의
주 FTP사이트인 ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/ 를
찾습니다. 그리고 나서 파일을 요청하고 있는 사이트가 인터넷에 직접
접속되어 있다는 가정 하에 ${FETCH}을 사용하여 해당
이름의 배포본 파일을 받으려 합니다. 이 작업이 성공하면,
${DISTDIR}에 나중에 쓸 때를 대비하여 파일을 저장하고
다음 순서로 갑니다.
${DISTDIR}에서 포트의
배포 파일을 찾고(보통 gzip으로 압축된 tarball),
${WRKDIR}에 지정된 임시 부디렉토리에
풀어넣습니다(기본값은 work).
${PATCHFILES}에 정의된
패치를 적용합니다. 두번째로 ${PATCHDIR}(기본값은
patches 부디렉토리)에서 패치를 찾을 수 있다면 지금 알파벳
순서에 의해 적용합니다.
scripts/configure가 존재한다면 실행합니다.
${HAS_CONFIGURE} 또는
${GNU_CONFIGURE} 가 지정되어 있다면,
${WRKSRC}/configure 를 실행합니다.
${USE_IMAKE} 가 지정되면,
${XMKMF} (기본값: `xmkmf
-a') 을 실행합니다.
${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' 를 입력하면 어떻게 되는지
이해하였으므로, 완벽한 포트를 만들기 위한 권장 단계를 알아봅시다.
(보통)원본 소스는 압축된 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} 의 설명을 보세요).
tarball의 복사본을 개인 디렉토리에 풀어넣고 FreeBSD의 현재 버전에서 적절하게 컴파일할 수 있도록 필요한 변경을 합니다. 쉽게 자동화할 수 있도록 여러분이 하는 일을 잘 따라가도록 하세요. 모든 것 - 파일의 삭제, 추가, 변경 - 은 포트를 다 만들었을 때 자동화된 스크립트나 패치 파일로 다시 할 수 있어야 합니다.
포트가 컴파일이나 설치하기 위해 중요한 사용자 입력/맞춤 작업을 필요로 할 때에는 Larry Wall의 고전적인 Configure 스크립트중 하나를 살펴보거나 스스로 비슷한 일을 해야 할 것입니다. 새 포트 콜렉션의 목적은 최소한의 디스크 공간을 사용하여 최종 사용자에게 가능한 한 `플러그-앤-플레이'하도록 포트를 만드는 것입니다.
참고: 명시적으로 언급되지 않았다면, 여러분이 만들어서 FreeBSD 포트 콜렉션에 기증한 패치 파일, 스크립트, 다른 파일은 표준 BSD 저작권에 따릅니다.
포트를 준비하면서, 추가되거나 변경된 파일은 나중에 패치하도록 재귀적
diff로 만들 수 있습니다. 적용할 패치의 집합은
`patch-<xx>' 라는 이름의 파일에 모아야
합니다. <xx> 는 패치가 적용될 순서를 나타냅니다 --
패치는 알파벳 순서로 적용되므로, `aa'가 가장
먼저이고, 그 다음은 `ab'의 순서입니다. 이 파일들은
${PATCHDIR}에 저장되어야 하며, 여기 있는 것들은
자동적으로 적용됩니다. 모든 패치는 ${WRKSRC}에
상대적이야 합니다(일반적으로 포트의 tarball을 풀어넣는 곳이며,
컴파일을 하는 곳입니다). 수정과 업그레이드를 편리하게 하도록, 같은
파일을 고치는 패치가 두개 이상 있어서는 안됩니다(예. patch-aa와
patch-ab가 모두 ${WRKSRC}/foobar.c를 바꾸는 경우).
추가적인 맞춤 작업용 명령들을 configure 스크립트에 포함하고
`scripts' 부디렉토리에 저장합니다. 앞에서도 말했듯이, 이
작업은 Makefile 타겟으로도 할 수 있고 pre-configure나
post-configure라는 이름의 스크립트로도 할 수 있습니다.
여러분의 포트가 컴파일이나 설정 또는 설치하기 위해 사용자 입력을
필요로 하면, Makefile에서 IS_INTERACTIVE를 설정하세요. 이는
사용자가 자신의 환경에서 BATCH 변수를 지정한 경우 여러분의
포트를 넘어가므로 `밤새 포트 컴파일하기'를 가능하도록 합니다(그리고
사용자가 INTERACTIVE 변수를 지정하면 사용자 입력을 필요로하는
포트만 만들어집니다).
질문에 대한 합리적인 기본 대답을 할 수 있으면, PACKAGE_BUILDING
변수를 지정하고 대화식 스크립트가 지정되어 있다면 끄세요. 이는
CD-ROM이나 ftp용의 패키지를 만들 수 있도록 합니다.