빌드 스크립트
여기선 (pkgs/applications/misc/hello/ex-1/builder.sh
에 저장된) Hello 닉스 표현식에 의해 참조되는 빌더를 살펴보겠습니다:
source $stdenv/setup ①
PATH=$perl/bin:$PATH ②
tar xvfz $src ③
cd hello-*
./configure --prefix=$out ④
make ⑤
make install
빌더 자체는 stdenv
가 제공하는 일반 빌더를 활용하면 훨씬 짧아질 수 있지만,
여기에서는 빌더가 하는 일을 확인하고자 모든 것을 적습니다. 빌더는 아래의 단계를 수행합니다:
-
닉스가 빌더를 실행하면 (제작물에서 선언한 특성들을 제외하고) 환경을 완전히 새로 시작합니다. 이는 빌드 과정에서 선언하지 않은 인뭇이 포함되는 것을 방지합니다. 예를 들어
PATH
가/usrbin
에 포함되는 경우, 실수로/usr/bin/gcc
를 사용하게 될 수도 있습니다.따라서 첫 단계는 환경을 구성하는 것입니다. 이는 표준 환경의
setup
스크립트를 실행함으로써 완성됩니다. 환경 변수stdenv
는 사용되고 있는 표준 환경의 위치를 가리킵니다. (Hello의 닉스 표현식에서는 명시적으로 표현되지 않고 있지만,mkDerivation
이 자동적으로 추가합니다.) -
Hello가 Perl을 필요로 하기 때문에, Perl이
PATH
에 존재하는지 확실시 해야 합니다.perl
환경 변수는 Perl 패키지의 위치를 가리킵니다. (제작물 특성에 포함되어있기 때문에), 그러므로$perl/bin
은 perl 인터프리터를 포함하는 디렉터리입니다. -
이제 소스를 풀어야 합니다.
src
특성은 네트워크로부터 다운 받은 Hello의 소스 압축 파일에 연계되어 있으므로,src
환경 변수는 압축 파일이 다운로드된 닉스 저장소 위치를 가리킵니다. 압축 해제한 이후,cd
를 통해 결과물이 있는 소스 디렉터리로 들어갑니다.참고로, 모든 빌드는
/tmp
디렉터리에서 수행됩니다. 이 디렉터리는 빌더가 일을 완료한 이후 삭제되기 대문에 소스를 후에 정리할 필요가 없습니다. 또한, 임시 디렉터리는 항상 새로 생성되기 때문에 현재 빌드가 이전 빌드로부터 방해를 받을 것은 걱정하지 않아도 됩니다. -
GNU Hello는 통상 Autoconf 기반 패키지이므로
configure
스크립트를 실행해야 합니다. 닉스에서는 모든 패키지가 닉스 저장소 내 각자 위치에 저장됩니다. 예를 들자면,/nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1
와 같습니다. 닉스는 제작물의 모든 특성을 암호화 해쉬 처리하여 이 경로를 계산합니다. 이 경로는 빌더에게out
환경 변수를 통해 전달됩니다. 따라서configure
파라미터에--prefix=$out
를 전달하면 Hello가 예상한 지점에 설치됩니다. -
마지막으로 Hello를 빌드(
make
)하고out
에 의해 안내되는 위치에 설치(make install
)합니다.
아마도 빌더 호출과 관련한 다양한 명령에서 에러 체킹이 되고 있지 않다는 점을
걱정할 수도 있습니다: 이는 쉘 스크립트가 배쉬의 -e
옵션과 함께 실행되기 때문입니다.
해당 옵션은 별도의 에러 체크가 없더라도 실패한 명령이 하나라도 있으면 쉘이 멈추도록 하므로 안전합니다.