Skip to content

표현식 문법

GNU Hello를 위한 닉스 표현식입니다:

{ stdenv, fetchurl, perl }: 

stdenv.mkDerivation { 
  name = "hello-2.1.1"; 
  builder = ./builder.sh; 
  src = fetchurl { 
    url = "ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz";
    sha256 = "1md7jsfd8pa45z73bz1kszpp01yw6x5ljkjk2hx7wl800any6465";
  };
  inherit perl; 
}

이 파일은 사실 pkgs/applications/misc/hello/ex-1/default.nix로 패키지 모음에 존재합니다. 각 패키지는 개려 디렉터리에 넣고 해당 디렉터리에서 default.nix로 칭하는 것이 관습적입니다. 파일은 다음 요소들을 가지고 있습니다 (그림의 각 숫자에 대응):

  1. 이는 표현식이 3가지 인자를 받는 함수임을 보입니다. 각 인자는 stdenv, fetchurl, perl입니다. 인자들이 Hello를 빌드하는데 필요하지만, 어떻게 빌드해야하는지는 여기서 아직 알 수 없습니다; 함수의 인자인 이유가 바로 그것입니다. stdenv는 거의 모든 닉스 패키지에서 사용됩니다; 이것이 C/C++ 컴파일러 (엄밀히 말하면, GCC), 배쉬 쉘, 그리고 cp, grep, tar와 같은 기본적인 유닉스 도구 등 기본 유닉스 환경에서 기대할만한 "표준" 환경을 구성하는데 도움을 줍니다. fetchurl은 파일을 다운로드받는데 도움을 줍니다. perl은 Perl 인터프리터입니다.

    닉스 함수는 일반적으로 { x, y, ..., z}: e의 형태를 가지는데 x, y, 등은 기대하는 인자 이름이고 e는 함수의 본문입니다. 따라서, 파일의 남은 모든 부분이 함수의 본문에 해당합니다; 요구되는 인자가 주어졌을 때, 본문에서 Hello 패키지 하나를 빌드하는 방법을 묘사합니다.

  2. 패키지를 빌드할 겁니다. 바깥 물건들을 통해 무언가를 만들어내는 것을 닉스에서는 제작물이라고 부릅니다(컴퓨터가 아니라 사람에 의해 생성된 소스 코드와 반대입니다). 제작은 stdenv.mkDerivation을 호출함으로써 수행합니다. mkDerivationstdenv에 의해 제공되는 함수이며 특성집합으로부터 패키지를 빌드합니다. 집합은 단순히 키/값 리스트 쌍이고 각 키는 문자열, 각 값은 임의의 닉스 표현식입니다. 일반적으로 { name1 = expr1; ... nameN = exprN; }의 형태를 갖습니다.

  3. name 특성은 패키지의 상징적 이름과 버전을 특칭합니다. 닉스는 그런 것들을 신경 쓰지 않지만, nix-env -q등을 통해 패키지 이름 등 "인간이 읽을 수 있는" 결과물을 보여주는데 사용됩니다. 이 특성은 mkDerivation에 의해 요구되는 사항입니다.

  4. builder 특성은 븰더를 특칭합니다. 이 특성은 간혹 생략될 수 있지만, 그 경우 mkDerivation이 기본 빌더로 채워줍니다 (해당 기본 빌더는 본질적으로 configure; make; make install입니다). Hello의 경우 기본 빌더로도 충분할만큼 단순하지만, 이 경우에서는 실제 빌더를 교육적인 목적으로 보이고 있습니다. ./builder.sh다음 섹션에서 보여줄 쉘 스크립트를 지칭합니다.

  5. 빌더는 패키지의 소스 코드가 무엇인지 알아야합니다. 여기서, src 특성은 fetchurl 함수의 결과에 연계됩니다. URL과 해당 URL의 파일 내용물로부터 산출될 SHA-256이 주어졌을 때, 이 함수는 파일을 다운로드받아 해쉬값을 체크하는 제작물을 빌드합니다. 따라서 소스 코드는 다른 모든 의존성과 마찬가지로 Hello 자체를 빌드하기 전에 빌드되는 의존성인 셈입니다.

    src대신 다른 무슨 이름이든 사용될 수 있고 실제로 몇 개의 소스 코드를 필요로 할 수 있습니다(각기 다른 특성에 연계하여). 그러나, src는 관습적이고, (이 예시에서는 사용하고 있지 않지만) 기본 빌더에 의해 예상되는 값입니다.

  6. 제작물이 Perl을 요구사항으로 하기 때문에, perl 함수 인자를 빌더에게 넘겨 주어야 합니다. 집합의 모든 특성은 실제로 빌더에게 환경 변수로 제공되므로 아래와 같이 특성을 선언하는 것으로

    perl = perl;
    

    충분합니다: 이는 특성 perl을 어쩌다 보니 또 perl이라는 이름을 갖게된 함수 인자와 연계합니다. 그러나, 좀 불필요해 보이므로 더 짧은 문법이 존재합니다. inherit 키워드는 특정한 특성이 구역(scope) 내에서, 하여튼 같은 이름을 갖는 또 다른 변수에 연계되도록 합니다.


Last update: November 4, 2021
Back to top