1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-10 12:36:01 +01:00
nix/tests/functional/dyn-drv/non-trivial.nix
John Ericson 9d7229a2a4 Make the JSON format for derivation use basename store paths
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
2025-09-17 16:38:17 -04:00

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"