58204a3c39
nar.nix's builder depends on coreutils and nix itself being in $PATH. Unfortunately, there's no good way to ensure that these packages exist in the same place on the remote machine: The local machine may have nix installed in /usr, and the remote machine in /usr/local, but the generated nar.sh builder will refer to /usr and thus fail on the remote machine. This ensures that nar.sh is run on the same machine that instantiates it. Signed-off-by: Shea Levy <shea@shealevy.com>
50 lines
1.1 KiB
Nix
50 lines
1.1 KiB
Nix
with import <nix/config.nix>;
|
||
|
||
let
|
||
|
||
builder = builtins.toFile "nar.sh"
|
||
''
|
||
export PATH=${nixBinDir}:${coreutils}
|
||
|
||
if [ $compressionType = xz ]; then
|
||
ext=.xz
|
||
compressor="| ${xz} -9"
|
||
elif [ $compressionType = bzip2 ]; then
|
||
ext=.bz2
|
||
compressor="| ${bzip2}"
|
||
else
|
||
ext=
|
||
compressor=
|
||
fi
|
||
|
||
echo "packing ‘$storePath’..."
|
||
mkdir $out
|
||
dst=$out/tmp.nar$ext
|
||
|
||
set -o pipefail
|
||
eval "nix-store --dump \"$storePath\" $compressor > $dst"
|
||
|
||
hash=$(nix-hash --flat --type $hashAlgo --base32 $dst)
|
||
echo -n $hash > $out/nar-compressed-hash
|
||
|
||
mv $dst $out/$hash.nar$ext
|
||
'';
|
||
|
||
in
|
||
|
||
{ storePath, hashAlgo, compressionType }:
|
||
|
||
derivation {
|
||
name = "nar";
|
||
system = builtins.currentSystem;
|
||
builder = shell;
|
||
args = [ "-e" builder ];
|
||
inherit storePath hashAlgo compressionType;
|
||
|
||
# Don't build in a chroot because Nix's dependencies may not be there.
|
||
__noChroot = true;
|
||
|
||
# Remote machines may not have ${nixBinDir} or ${coreutils} in the same prefixes
|
||
preferLocalBuild = true;
|
||
}
|