FreeBSD 핸드북 : 어플리케이션 설치하기: 포트 콜렉션 : 직접 포트 만들기 : Makefile 설정하기
Previous: 느린 포팅
Next: 특별히 생각해야 할 것들

4.7.3. Makefile 설정하기

Makefile을 설정하는 것은 아주 쉽습니다. 그리고 시작하기 전에 기존의 예제를 살펴볼 것을 권장합니다. 또한 이 핸드북에 예제 Makefile이 있으므로, 한번 살펴보고 다른 사람들이 여러분의 포트를 읽기 쉽도록 그 템플리트에 있는 변수와 섹션의 순서를 따라 주세요.

이제, 여러분이 새 Makefile을 디자인하는 순서대로 다음 문제들을 생각해 봅시다:

4.7.3.1. 원본 소스

소스가 표준적인 gzip으로 묶인 tarball의형태로 ${DISTDIR}에 있습니까?, 그렇다면, 다음 단계로 나아갑시다. 그렇지 않다면, 여러분의 포트의 배포본 파일의 형식이 얼마나 다른지에 따라 ${EXTRACT_CMD}, ${EXTRACT_BEFORE_ARGS}, ${EXTRACT_AFTER_ARGS}, ${EXTRACT_SUFX}, or ${DISTFILES} 변수 중 하나를 다시 정의해야 합니다. (가장 많은 경우는 gzip이 아니라 일반적인 compress로 묶인 `EXTRACT_SUFX=.tar.Z'입니다).

최악의 경우, 기본 동작을 대신하기 위해 여러분만의 `do-extract' 타겟을 만들 수 있습니다. 하지만 이런 경우는 매우 드물어야 하고, 꼭 필요할 때만 하세요.

4.7.3.2. DISTNAME

여러분의 포트의 기본 이름으로 ${DISTNAME}를 지정해야 합니다. 기본 규칙은 배포본 파일 목록(${DISTFILES})이 ${DISTNAME}${EXTRACT_SUFX} 가 되는 것입니다. 보통의 tarball이라면 다음과 같습니다.

	
foozolix-1.0.tar.gz

위 경우는 `DISTNAME=foozolix-1.0' 로 지정할 때입니다.

또한 기본 규칙은 tarball을 work/${DISTNAME}이라는 부디렉토리에 풀어넣는다고 생각합니다. 예를 들면, 다음과 같습니다:

	
work/foozolix-1.0/

이런 모든 행동 방식도 물론 다시 만들 수 있습니다. 위는 단지 가장 흔하고 시간을 절약할 수 있는 기본값을 나타냅니다. 여러개의 배포본 파일을 필요로 하는 포트의 경우, 명시적으로 ${DISTFILES}를 지정하세요. ${DISTFILES}의 일부만을 실제로 풀어넣을 것이라면, 그런 것들은 ${EXTRACT_ONLY}에 지정하세요. 실제로 풀어넣을 때가 되면 이것이 ${DISTFILES}의 목록을 대신하며, 남은 것들은 나중에 사용할 수 있도록 ${DISTDIR}에 남아있게 됩니다.

4.7.3.3. PKGNAME

${DISTNAME}가 우리의 좋은 패키지 이름의 가이드라인에 맞지 않는다면, ${PKGNAME}변수를 더 나은 것으로 지정해야 합니다. 더 자세한 것은 언급한 가이드라인을 보세요.

4.7.3.4. CATEGORIES

패키지를 만들어지면, 이것들은 /usr/ports/packages/All 아래에 놓이며 /usr/ports/packages의 하나 이상의 부디렉토리에서 링크가 만들어지게 됩니다. 이 부디렉토리의 이름은 ${CATEGORIES} 변수에 의해 지정됩니다. 이것은 사용자가 FTP 사이트나 CD-ROM에서 수많은 패키지들 사이를 돌아다닐 때 좀 더 편하게 하기 위한 것입니다. 기존 카테고리를 먼저 살펴보고, 여러분의 포트에 알맞는 것들을 고르세요.

또한 이 목록은 포트를 들여올 때 포트 트리의 어디에 놓을 지를 결정합니다. 여기 하나 이상의 카테고리를 사용하면, 포트 파일은 첫번째 카테고리의 이름으로 된 부디렉토리에 놓여진다고 가정합니다. 카테고리 섹션에서 올바른 카테고리를 얻는 방법에 대한 더 많은 정보를 볼 수 있습니다.

여러분의 포트가 정말 기존의 모든 카테고리에 속하지 않는 어떤 것이라면, 새 카테고리 이름을 만들 수도 있습니다. 그 경우에는 FreeBSD 포트 메일링 리스트 <freebsd-ports@FreeBSD.ORG>로 새 카테고리를 제안하는 전자우편을 보내 주세요.

카테고리 이름은 오류 검사를 하지 않는다는 점을 주의하세요. `make package'는 카테고리 이름을 잘못 쓴다면 새 디렉토리를 만들게 될 것이므로, 꼭 주의하세요!

4.7.3.5. MASTER_SITES

원본 tarball을 가리키는 ftp/http-URL의 디렉토리 부분을 ${MASTER_SITES}에 기록하세요. 끝부분의 슬래시(/)를 잊어서는 안됩니다!

make 매크로는 이 스펙을 이용하여 이미 시스템에 존재하지 않은 경우에 배포본 파일을 ${FETCH}로 얻는데 사용하려 합니다.

이 목록에 서로 다른 대륙의 여러 사이트를 넣는 것을 권장합니다. 이는 광역 네트워크 문제에 대한 안전 장치이며, 우리는 가장 가까운 마스터 사이트를 자동적으로 결정하여 그곳에서 파일을 갖고 오는 지원 방법을 추가하려고도 계획하고 있습니다!

만약 원본 tarball이 X-contrib, GNU, Perl CPAN, TeX CTAN, Linux Sunsite와 같은 인기있는 사이트 중 하나의 일부라면 이런 사이트들을 MASTER_SITE_XCONTRIB, MASTER_SITE_GNU, MASTER_SITE_PERL_CPAN, MASTER_SITE_TEX_CTAN, MASTER_SITE_SUNSITE를 사용하여 쉽고 간단하게 지정할 수 있습니다. 그리고 나서 사이트 내의 경로명을 MASTER_SITE_SUBDIR에 적으세요. 다음의 예를 봅시다.

MASTER_SITES=         ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR=   applications

또한 사용자는 여러분의 선택을 바꾸기 위해 /etc/make.conf에서 MASTER_SITE_* 변수를 지정할 수 있습니다. 인기있는 사이트의 좋아하는 미러 사이트를 대신 사용하세요.

4.7.3.6. PATCHFILES

여러분의 포트가 ftp나 http상에서 얻을 수 있는 몇가지 추가적인 패치를 필요로 한다면, ${PATCHFILES}에 파일의 이름을 지정하고 ${PATCH_SITES}에 파일이 있는 디렉토리의 URL을 지정하세요(형식은 ${MASTER_SITES}와 같습니다).

패치가 별도의 경로명을 포함하고 있어서 소스 트리의 최상위에 상대적이지 않다면(예. ${WKRSRC}), ${PATCH_DIST_STRIP}도 지정하세요. 예를 들어, 패치 안의 모든 경로명이 파일 이름 앞에 `foozolix-1.0/'이 붙는다면, `PATCH_DIST_STRIP=-p1'로 지정하세요.

패치가 압축되어 있어도 걱정하시 마세요. `.gz'나 `.Z'로 끝나는 파일명은 자동적으로 풀어집니다.

패치가 문서와 같은 다른 파일과 같이 gzip으로 묶인 tarball로 배포된다면, 단순히 ${PATCHFILES}을 사용할 수 없습니다. 이런 경우에는 패치 tarball의 위치와 이름을 ${DISTFILES} 과 ${MASTER_SITES}에 적어주세요. 그러면, pre-patch 타겟에서 직접 패치 명령을 실행하여 패치를 적용하거나 패치 파일을 ${PATCHDIR} 디렉토리에 patch-<xx>라는 이름으로 복사하면 됩니다. (tarball은 이 때 보통 소스와 같이 압축이 풀림, 따라서 이 파일이 보통의 gzip으로 묶인 것이거나 압축된 tarball일 경우 명시적으로 압축을 풀 필요는 없습니다.) 나중에 패치를 하고 싶다면, 그 디렉토리에 이미 존재하는 것을 덮어 쓰지 않도록 별도의 주의를 기울이세요. 또한 pre-clean 타겟에서 복사한 패치 파일을 지우는 명령을 넣으세요.

4.7.3.7. MAINTAINER

여러분의 전자우편 주소를 쓰세요. 꼭. :)

관리자의 책임에 대한 자세한 설명은 Makefiles의 MAINTAINER 섹션을 참고하세요.

4.7.3.8. 의존성

많은 포트는 다른 포트에 의존합니다. 필요한 모든 것이 여러분의 PC에 있는지 확인하기 위해 사용할 수 있는 다섯가지의 변수가 있습니다. 공통적인 경우에 미리 지원하는 의존성 변수가 몇가지 있으며, 의존성의 동작을 제어하기 위해 몇가지가 더 있습니다.

LIB_DEPENDS

이 변수는 이 포트가 의존하는 공유 라이브러리를 지정합니다. 이는 `lib:dir[:타겟]' 의 쌍인데, lib는 공유 라이브러리의 이름이며, dir는 라이브러리가 없을 경우 찾는 디렉토리이고, target은 그 디렉토리에서 부르는 타겟입니다. 예를 들면

LIB_DEPENDS=    jpeg.9:${PORTSDIR}/graphics/jpeg:install

은 주 버전 9의 공유 jpeg 라이브러리를 검사할 것이며, 찾지 못한 경우 포트 트리의 graphics/jpeg 부디렉토리를 찾아가 컴파일하고 설치합니다. `:타겟' 부분은 ${DEPENDS_TARGET}(`install'이 기본값) 고 같다면 생략할 수 있습니다.

lib 부분은 `ldconfig -r | grep -wF'에 주는 인수입니다. 이 변수에는 정규식을 써서는 안됩니다.

의존성은 extract 타겟에서 한번 검사하고 install 타겟에서 한번 더 검사합니다. (이는 포트가 컴파일된 것과 다른 PC에 설치되더라도 라이브러리가 있는지 확인하기 위한 것입니다.) 또한, 의존성의 이름은 패키지에 포함되므로 pkg_add는 의존하는 패키지가 사용자의 시스템에 없을 경우 자동적으로 설치하려 합니다. 는 프로그램을 자동적으로 설치할 것입니다.

RUN_DEPENDS

이 변수는 포트가 실행 시간에 의존하는 실행 파일이나 일반 파일을 지정합니다. 이는 `path:dir[:타겟]'의 쌍이며, path는 실행파일이나 일반 파일의 이름이고, dir는 찾을 수 없을 경우 찾아볼 디렉토리이고, `타겟'은 그 디렉토리에서 부르는 타겟입니다. path가 슬래시(/)로 시작하면, 이는 파일로 처리되며 그 존재는 `test -e'로 검사합니다; 그렇지 않으면 실행 파일로 간주하고 `which -s' 가 사용자의 검색 경로에 프로그램이 존재하는지 검사하기 위해 사용합니다.

예를 들어,

RUN_DEPENDS=	${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
                wish8.0:${PORTSDIR}/x11-toolkits/tk80

는 파일이나 디렉토리 `/usr/local/etc/innd'이 존재하는지 검사하고, 없다면 포트 트리의 news/inn 부디렉토리에서 컴파일하여 설치합니다. 또한 여러분의 검색 경로에 `wish8.0'이 있는지 보고, 없다면 x11-toolkits/tk80 부디렉토리에서 컴파일하고 설치합니다. (이 경우, `innd'는 실제로 실행 파일입니다; 만약 실행 파일이 보통 사용자의 검색 경로에 있지 않을 것 같다면 전체 경로명을 사용해야 합니다.)

의존성은 install 타겟 내에서 검사합니다. 또한 의존성의 이름은 패키지에 들어가므로 pkg_add는 사용자의 시스템에 없는 경우 자동적으로 설치합니다. `:타겟' 부분은 ${DEPENDS_TARGET}과 같다면 생략할 수 있습니다.

BUILD_DEPENDS

이 변수는 이 포트를 컴파일하는데 필요한 실행 파일이나 일반 파일을 지정합니다. 이는 RUN_DEPENDS와 같이 `path:dir[:타겟]'쌍의 목록입니다. 예를 들면,

BUILD_DEPENDS=  unzip:${PORTSDIR}/archivers/unzip
는 `unzip'라는 실행 파일을 검사하고 찾을 수 없다면 포트 트리의 archivers/unzip 부디렉토리에서 프로그램을 작성하고 설치합니다.

여기서의 `작성'는 압축 풀기부터 컴파일까지의 모든 것을 말합니다. 의존성은 extract 타겟 내에서 검사합니다. `:타겟' 부분은 ${DEPENDS_TARGET}과 같다면 생략할 수 있습니다.

FETCH_DEPENDS

이 변수는 이 포트가 fetch타겟을 실행하는데 필요한 실행 파일이나 일반 파일을 지정합니다. 앞의 두가지와 같이, 이것은 `path:dir[:타겟]'의 쌍의 목록입니다. 예를 들면,

FETCH_DEPENDS=   ncftp2:${PORTSDIR}/net/ncftp2
는 `ncftp2'이라는 실행 파일을 찾고, 없다면 포트 트리의 net/ncftp2 부디렉토리에서 컴파일하고 설치합니다.

의존성은 fetch 타겟에서 검사합니다. `:타겟' 부분은 ${DEPENDS_TARGET}과 같다면 생략할 수 있습니다.

DEPENDS

앞의 네가지 카테고리의 어느 쪽에도 속하지 않는 의존성이 있거나, 설치된 것 말고도 포트가 압축을 푼 다른 포트의 소스를 필요로 한다면 이 변수를 사용하세요. 이는 단지 `dir[:타겟]'의 목록일 뿐이며, 앞의 네가지 카테고리와 달리 검사할 것은 없는 디렉토리 목록입니다. `:타겟' 부분은 ${DEPENDS_TARGET}과 같다면 생략할 수 있습니다.

공통 의존성 변수

포트가 X윈도우 시스템의 설치를 필요로 한다면 `USE_XLIB=yes'를 정의하세요(이는 USE_IMAKE에 의해 지정됩니다). 포트가 BSD make 대신 GNU make를 필요로 한다면 `USE_GMAKE=yes'를 정의하세요. 포트가 최신의 Qt 툴킷을 사용하면 `USE_QT=yes'를 정의하세요. 포트가 버전 5의 perl 언어를 필요로 하면 `USE_PERL5=yes'를 사용하세요(마지막 것은 매우 중요한데, FreeBSD의 어떤 버전은 perl5를 기본 시스템의 일부로 포함하지만 다른 것들은 그렇지 않습니다)

의존성에 대한 참고사항

앞에서 언급하였듯이, 의존성이 필요할 때 부르는 기본 타겟은 ${DEPENDS_TARGET}입니다. 기본값은 `install' 입니다. 이것은 사용자 변수입니다. 포트의 Makefile에서는 절대 정의하면 안됩니다. 포트가 의존성을 특별하게 다루고 싶다면, ${DEPENDS_TARGET}을 다시 정의하는 대신 *_DEPENDS 변수의 `:타겟' 부분을 사용하세요.

`make clean'를 입력하면, 의존하는 패키지도 같이 자동적으로 청소합니다. 그렇게 하고 싶지 않다면, NOCLEANDEPENDS를 환경변수에 정의하세요.

다른 포트에 무조건 의존하게 하고 싶다면, BUILD_DEPENDS나 RUN_DEPENDS의 첫번째 필드에 `nonexistent' 문자열을 지정하는 것이 관례입니다. 다른 포트의 소스를 얻을 필요가 있을 때에만 사용하세요. 타겟을 정의해서 컴파일 시간을 아낄 수도 있습니다. 예를 들면,

BUILD_DEPENDS=   /nonexistent:${PORTSDIR}/graphics/jpeg:extract

은 항상 JPEG 포트로 가서 소스를 풀어놓습니다.

`DEPENDS'는 여러분의 원하는 다른 방법이 없을 때에만 사용하세요. 이는 다른 포트가 항상 컴파일되도록(그리고 기본적으로 설치되도록) 하며, 그 의존성도 패키지에 포함됩니다. 정말 이것이 필요하다면, 대신 BUILD_DEPENDS와 RUN_DEPENDS라고 쓰는 것을 권장합니다 -- 적어도 그 의도는 명백해 질 것입니다.

4.7.3.9. 컴파일 메카니즘

여러분의 패키지가 GNU make를 사용한다면 `USE_GMAKE=yes'를 지정하세요. 패키지가 configure를 사용한다면 `HAS_CONFIGURE=yes'를 지정하세요. 패키지가 GNU configure를 사용한다면 `GNU_CONFIGURE=yes'를 지정하세요(이는 HAS_CONFIGURE를 기본적으로 지정하였다고 생각합니다). configure에 별도의 인수를 주고 싶다면(GNU configure의 기본값은 `--prefix=${PREFIX}' 이고 비 GNU configure의 기본값은 없습니다), 별도의 인수들을 ${CONFIGURE_ARGS}에 지정하세요. 패키지가 GNU autoconf를 사용한다면, `USE_AUTOCONF=yes'를 지정하세요. 이는 GNU_CONFIGURE를 지정한다고 생각하고, autoconf를 configure 보다 먼저 실행하도록 합니다.

여러분의 패키지가 imake를 사용하여 Imakefile에서 Makefile들을 생성하는 X 어플리케이션이라면, `USE_IMAKE=yes'를 지정하세요. 이것은 설정 단계에서 자동적으로 xmkmf -a를 실행합니다. `-a' 플래그가 여러분의 포트에서 문제가 된다면 `XMKMF=xmkmf'를 지정하세요.

포트가 imake를 사용하지만 `install.man' 타겟을 이해하지 못한다면, `NO_INSTALL_MANPAGES=yes'을 지정해야 합니다. 추가로 원래 패키지의 저자에게도 알려야 합니다. :>

포트의 소스 Makefile이 주 컴파일 타겟으로 `all'이외에 다른 것을 지정해야 한다면, ${ALL_TARGET}를 지정하세요. `install'와 ${INSTALL_TARGET} 도 마찬가지 관계입니다.


FreeBSD 핸드북 : 어플리케이션 설치하기: 포트 콜렉션 : 직접 포트 만들기 : Makefile 설정하기
Previous: 느린 포팅
Next: 특별히 생각해야 할 것들