すべての引用はEelco Dolstra の博士論文からのものです。
ストア派生
ストアの 派生 は、 すべての可変性が削除さ れ、代替形式に変換されたNix 式です。この中間表現は、「ソフトウェア コンポーネントに組み込むことができる、単一の静的で一定のビルド アクションを記述します」 。
" Nix 式は通常、ストア派生のグラフに変換されます。 "
別の言い方をすれば、
*------------------------------------------------------*
| |
| NIX EXPRESSION == function |
| |
| ( Describes how to build a component. That is, how ) |
| ( to compose its input parameters, which can be ) |
| ( other components as well. ) |
| |
| STORE DERIVATION == function application |
| |
| ( Result of a Nix expression called with concrete arguments. ) |
| ( Corollary: a single Nix expression can produce ) |
| ( different derivations depending on the inputs. ) |
| |
*------------------------------------------------------*
コンテキスト:
セクション「2.4 ストアの派生」から取得した画像。
この論文では、Nix 式を「ビルド アクションのファミリー」として説明しており、派生が「 1 つのビルド アクション」であるのとは対照的です。
ARG_1, ..., ARG_N
| ---(aaa, ...)---> DERIVATION_1
NIX EXPRESSION | ---(bbb, ...)---> DERIVATION_2
| :
function( | :
param_1, | :
..., | :
param_N | :
) | :
| ---(zzz, ...)---> DERIVATION_N
上記の派生物は同じアプリケーションを生成する可能性がありますが、たとえば、異なる構成オプションでビルドします。(APT パッケージvim-nox
、
vim-gtk
、vim-gtk3
、vim-tiny
などを参照)
なぜ「派生」と呼ばれるのですか?
その名前は " 2.2 Nix 式" に由来します。
関数 [つまり、Nix 式] の結果は derivationです。 これは、入力からコンポーネントを 派生させるコンポーネント ビルド アクションの Nix 用語
です。
なぜ「ストア派生」が必要なのですか?
セクション「2.4 Store derivations」にすべての詳細がありますが、要点は次のとおりです。
Nix 式は直接構築されません。むしろ、単一コンポーネントのビルド アクションをエンコードするストア派生のより原始的な言語に変換されます。これは、コンパイラが一般的に、すべての複雑さを備えた本格的な言語ではなく、コンパイルされるコードのより単純な中間表現で作業の大部分を行う方法に似ています。
ストア派生の形式
セクション「5.4. Nix 式をストア派生物に変換する」から:
ストア派生の抽象構文は、図 5.5 に Haskell のような [135] 構文で示されています (セクション 1.7 を参照)。図 2.13 に示すストアの派生例は、このデータ型の値です。
図 5.5.: ストア派生の抽象構文
data StoreDrv = StoreDrv {
output : Path,
outputHash : String,
outputHashAlgo : String,
inputDrvs : [Path],
inputSrcs : [Path],
system : String,
builder : Path,
args : [String],
envVars : [(String,String)]
}
例
たとえば、Hello
図 2.6 のパッケージをビルドする Nix 式は、
図 2.6
{stdenv, fetchurl, perl}:
stdenv.mkDerivation {
name = "hello-2.1.1";
builder = ./builder.sh;
src = fetchurl {
url = http://ftp.gnu.org/pub/gnu/hello/hello-2.1.1.tar.gz;
md5 = "70c9ccf9fac07f762c24f2df2290784d";
};
inherit perl;
}
図 2.13 のような中間表現が得られます。
図 2.13 ストアの派生
{ output = "/nix/store/bwacc7a5c5n3...-hello-2.1.1" 25
, inputDrvs = { 26
"/nix/store/7mwh9alhscz7...-bash-3.0.drv",
"/nix/store/fi8m2vldnrxq...-hello-2.1.1.tar.gz.drv",
"/nix/store/khllx1q519r3...-stdenv-linux.drv",
"/nix/store/mjdfbi6dcyz7...-perl-5.8.6.drv" 27 }
}
, inputSrcs = {"/nix/store/d74lr8jfsvdh...-builder.sh"} 28
, system = "i686-linux" 29
, builder = "/nix/store/3nca8lmpr8gg...-bash-3.0/bin/sh" 30
, args = ["-e","/nix/store/d74lr8jfsvdh...-builder.sh"] 31
, envVars = { 32
("builder","/nix/store/3nca8lmpr8gg...-bash-3.0/bin/sh"),
("name","hello-2.1.1"),
("out","/nix/store/bwacc7a5c5n3...-hello-2.1.1"),
("perl","/nix/store/h87pfv8klr4p...-perl-5.8.6"), 33
("src","/nix/store/h6gq0lmj9lkg...-hello-2.1.1.tar.gz"),
("stdenv","/nix/store/hhxbaln5n11c...-stdenv-linux"),
("system","i686-linux"),
("gtk","/store/8yzprq56x5fa...-gtk+-2.6.6"),
}
}
ストア派生の抽象構文は、図 5.5 に Haskell のような [135] 構文で示されています (セクション 1.7 を参照)。図 2.13 に示すストアの派生例は、このデータ型の値です。
図 5.5.: ストア派生の抽象構文
data StoreDrv = StoreDrv {
output : Path,
outputHash : String,
outputHashAlgo : String,
inputDrvs : [Path],
inputSrcs : [Path],
system : String,
builder : Path,
args : [String],
envVars : [(String,String)]
}