mirror of
https://github.com/NixOS/nix.git
synced 2025-11-10 20:46:01 +01:00
See #13570 for details --- the idea is that included the store dir in store paths makes systematic JSON parting with e.g. Serde, Aeson, nlohmann, or similiar harder. After talking to Eelco, we are changing the `Derivation` format right away because not only is `nix derivation` technically experimental, we think it is also less widely used in practice than, say, `nix path-info`. Progress on #13570
80 lines
2.1 KiB
Nix
80 lines
2.1 KiB
Nix
with import ./config.nix;
|
|
|
|
builtins.outputOf
|
|
(mkDerivation {
|
|
name = "make-derivations.drv";
|
|
|
|
requiredSystemFeatures = [ "recursive-nix" ];
|
|
|
|
buildCommand = ''
|
|
set -e
|
|
set -u
|
|
|
|
PATH=${builtins.getEnv "NIX_BIN_DIR"}:$PATH
|
|
|
|
export NIX_CONFIG='extra-experimental-features = nix-command ca-derivations dynamic-derivations'
|
|
|
|
declare -A deps=(
|
|
[a]=""
|
|
[b]="a"
|
|
[c]="a"
|
|
[d]="b c"
|
|
[e]="b c d"
|
|
)
|
|
|
|
# Cannot just literally include this, or Nix will think it is the
|
|
# *outer* derivation that's trying to refer to itself, and
|
|
# substitute the string too soon.
|
|
placeholder=$(nix eval --raw --expr 'builtins.placeholder "out"')
|
|
|
|
declare -A drvs=()
|
|
for word in a b c d e; do
|
|
inputDrvs=""
|
|
for dep in ''${deps[$word]}; do
|
|
if [[ "$inputDrvs" != "" ]]; then
|
|
inputDrvs+=","
|
|
fi
|
|
read -r -d "" line <<EOF || true
|
|
"''${drvs[$dep]}": {
|
|
"outputs": ["out"],
|
|
"dynamicOutputs": {}
|
|
}
|
|
EOF
|
|
inputDrvs+="$line"
|
|
done
|
|
read -r -d "" json <<EOF || true
|
|
{
|
|
"args": ["-c", "set -xeu; echo \"word env vav $word is \$$word\" >> \"\$out\""],
|
|
"builder": "${shell}",
|
|
"env": {
|
|
"out": "$placeholder",
|
|
"$word": "hello, from $word!",
|
|
"PATH": ${builtins.toJSON path}
|
|
},
|
|
"inputDrvs": {
|
|
$inputDrvs
|
|
},
|
|
"inputSrcs": [],
|
|
"name": "build-$word",
|
|
"outputs": {
|
|
"out": {
|
|
"method": "nar",
|
|
"hashAlgo": "sha256"
|
|
}
|
|
},
|
|
"system": "${system}",
|
|
"version": 3
|
|
}
|
|
EOF
|
|
drvPath=$(echo "$json" | nix derivation add)
|
|
storeDir=$(dirname "$drvPath")
|
|
drvs[$word]="$(basename "$drvPath")"
|
|
done
|
|
cp "''${storeDir}/''${drvs[e]}" $out
|
|
'';
|
|
|
|
__contentAddressed = true;
|
|
outputHashMode = "text";
|
|
outputHashAlgo = "sha256";
|
|
}).outPath
|
|
"out"
|