Skip to content

빌드 스크립트

여기선 (pkgs/applications/misc/hello/ex-1/builder.sh에 저장된) Hello 닉스 표현식에 의해 참조되는 빌더를 살펴보겠습니다:

source $stdenv/setup ①

PATH=$perl/bin:$PATH ②

tar xvfz $srccd hello-*
./configure --prefix=$out ④
make ⑤
make install

빌더 자체는 stdenv가 제공하는 일반 빌더를 활용하면 훨씬 짧아질 수 있지만, 여기에서는 빌더가 하는 일을 확인하고자 모든 것을 적습니다. 빌더는 아래의 단계를 수행합니다:

  1. 닉스가 빌더를 실행하면 (제작물에서 선언한 특성들을 제외하고) 환경을 완전히 새로 시작합니다. 이는 빌드 과정에서 선언하지 않은 인뭇이 포함되는 것을 방지합니다. 예를 들어 PATH/usrbin에 포함되는 경우, 실수로 /usr/bin/gcc를 사용하게 될 수도 있습니다.

    따라서 첫 단계는 환경을 구성하는 것입니다. 이는 표준 환경의 setup 스크립트를 실행함으로써 완성됩니다. 환경 변수 stdenv는 사용되고 있는 표준 환경의 위치를 가리킵니다. (Hello의 닉스 표현식에서는 명시적으로 표현되지 않고 있지만, mkDerivation이 자동적으로 추가합니다.)

  2. Hello가 Perl을 필요로 하기 때문에, Perl이 PATH에 존재하는지 확실시 해야 합니다. perl 환경 변수는 Perl 패키지의 위치를 가리킵니다. (제작물 특성에 포함되어있기 때문에), 그러므로 $perl/bin은 perl 인터프리터를 포함하는 디렉터리입니다.

  3. 이제 소스를 풀어야 합니다. src특성은 네트워크로부터 다운 받은 Hello의 소스 압축 파일에 연계되어 있으므로, src 환경 변수는 압축 파일이 다운로드된 닉스 저장소 위치를 가리킵니다. 압축 해제한 이후, cd를 통해 결과물이 있는 소스 디렉터리로 들어갑니다.

    참고로, 모든 빌드는 /tmp 디렉터리에서 수행됩니다. 이 디렉터리는 빌더가 일을 완료한 이후 삭제되기 대문에 소스를 후에 정리할 필요가 없습니다. 또한, 임시 디렉터리는 항상 새로 생성되기 때문에 현재 빌드가 이전 빌드로부터 방해를 받을 것은 걱정하지 않아도 됩니다.

  4. GNU Hello는 통상 Autoconf 기반 패키지이므로 configure 스크립트를 실행해야 합니다. 닉스에서는 모든 패키지가 닉스 저장소 내 각자 위치에 저장됩니다. 예를 들자면, /nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1와 같습니다. 닉스는 제작물의 모든 특성을 암호화 해쉬 처리하여 이 경로를 계산합니다. 이 경로는 빌더에게 out 환경 변수를 통해 전달됩니다. 따라서 configure 파라미터에 --prefix=$out를 전달하면 Hello가 예상한 지점에 설치됩니다.

  5. 마지막으로 Hello를 빌드(make)하고 out에 의해 안내되는 위치에 설치(make install)합니다.

아마도 빌더 호출과 관련한 다양한 명령에서 에러 체킹이 되고 있지 않다는 점을 걱정할 수도 있습니다: 이는 쉘 스크립트가 배쉬의 -e 옵션과 함께 실행되기 때문입니다. 해당 옵션은 별도의 에러 체크가 없더라도 실패한 명령이 하나라도 있으면 쉘이 멈추도록 하므로 안전합니다.


Last update: November 4, 2021
Back to top