2014-10-27 09:25:35 +00:00
|
|
|
{ lib, stdenv, lndir }:
|
2009-11-19 16:07:47 +00:00
|
|
|
|
|
|
|
rec {
|
|
|
|
|
|
|
|
# Run the shell command `buildCommand' to produce a store path named
|
|
|
|
# `name'. The attributes in `env' are added to the environment
|
|
|
|
# prior to running the command.
|
|
|
|
runCommand = name: env: buildCommand:
|
|
|
|
stdenv.mkDerivation ({
|
|
|
|
inherit name buildCommand;
|
|
|
|
} // env);
|
|
|
|
|
|
|
|
|
|
|
|
# Create a single file.
|
|
|
|
writeTextFile =
|
|
|
|
{ name # the name of the derivation
|
|
|
|
, text
|
|
|
|
, executable ? false # run chmod +x ?
|
|
|
|
, destination ? "" # relative path appended to $out eg "/bin/foo"
|
|
|
|
}:
|
2012-04-26 16:01:41 +01:00
|
|
|
runCommand name
|
|
|
|
{ inherit text executable;
|
2015-02-18 00:08:03 +00:00
|
|
|
passAsFile = [ "text" ];
|
2012-04-26 16:01:41 +01:00
|
|
|
# Pointless to do this on a remote machine.
|
|
|
|
preferLocalBuild = true;
|
2015-07-07 14:01:36 +01:00
|
|
|
allowSubstitutes = false;
|
2012-04-26 16:01:41 +01:00
|
|
|
}
|
2009-11-19 16:07:47 +00:00
|
|
|
''
|
|
|
|
n=$out${destination}
|
|
|
|
mkdir -p "$(dirname "$n")"
|
2015-12-31 21:14:44 +00:00
|
|
|
|
2015-02-18 00:08:03 +00:00
|
|
|
if [ -e "$textPath" ]; then
|
|
|
|
mv "$textPath" "$n"
|
|
|
|
else
|
|
|
|
echo -n "$text" > "$n"
|
|
|
|
fi
|
2015-12-31 21:14:44 +00:00
|
|
|
|
2009-11-19 16:07:47 +00:00
|
|
|
(test -n "$executable" && chmod +x "$n") || true
|
|
|
|
'';
|
|
|
|
|
2014-10-27 09:25:35 +00:00
|
|
|
|
2009-11-19 16:07:47 +00:00
|
|
|
# Shorthands for `writeTextFile'.
|
|
|
|
writeText = name: text: writeTextFile {inherit name text;};
|
2014-03-23 10:03:28 +00:00
|
|
|
writeTextDir = name: text: writeTextFile {inherit name text; destination = "/${name}";};
|
2009-11-19 16:07:47 +00:00
|
|
|
writeScript = name: text: writeTextFile {inherit name text; executable = true;};
|
|
|
|
writeScriptBin = name: text: writeTextFile {inherit name text; executable = true; destination = "/bin/${name}";};
|
|
|
|
|
|
|
|
|
|
|
|
# Create a forest of symlinks to the files in `paths'.
|
|
|
|
symlinkJoin = name: paths:
|
|
|
|
runCommand name { inherit paths; }
|
|
|
|
''
|
|
|
|
mkdir -p $out
|
|
|
|
for i in $paths; do
|
|
|
|
${lndir}/bin/lndir $i $out
|
|
|
|
done
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
|
|
# Make a package that just contains a setup hook with the given contents.
|
2011-03-29 16:19:59 +01:00
|
|
|
makeSetupHook = { deps ? [], substitutions ? {} }: script:
|
|
|
|
runCommand "hook" substitutions
|
2011-03-28 17:33:33 +01:00
|
|
|
(''
|
2012-01-18 20:16:00 +00:00
|
|
|
mkdir -p $out/nix-support
|
2009-11-19 16:07:47 +00:00
|
|
|
cp ${script} $out/nix-support/setup-hook
|
2014-10-27 09:25:35 +00:00
|
|
|
'' + lib.optionalString (deps != []) ''
|
2012-12-28 18:20:09 +00:00
|
|
|
echo ${toString deps} > $out/nix-support/propagated-native-build-inputs
|
2014-10-27 09:25:35 +00:00
|
|
|
'' + lib.optionalString (substitutions != {}) ''
|
2011-03-29 16:19:59 +01:00
|
|
|
substituteAll ${script} $out/nix-support/setup-hook
|
2011-03-28 17:33:33 +01:00
|
|
|
'');
|
2009-11-19 16:07:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Write the references (i.e. the runtime dependencies in the Nix store) of `path' to a file.
|
|
|
|
writeReferencesToFile = path: runCommand "runtime-deps"
|
|
|
|
{
|
|
|
|
exportReferencesGraph = ["graph" path];
|
|
|
|
}
|
|
|
|
''
|
|
|
|
touch $out
|
|
|
|
while read path; do
|
|
|
|
echo $path >> $out
|
|
|
|
read dummy
|
|
|
|
read nrRefs
|
|
|
|
for ((i = 0; i < nrRefs; i++)); do read ref; done
|
|
|
|
done < graph
|
|
|
|
'';
|
|
|
|
|
2009-11-23 19:18:53 +00:00
|
|
|
# Quickly create a set of symlinks to derivations.
|
|
|
|
# entries is a list of attribute sets like { name = "name" ; path = "/nix/store/..."; }
|
|
|
|
linkFarm = name: entries: runCommand name {} ("mkdir -p $out; cd $out; \n" +
|
2014-10-27 09:25:35 +00:00
|
|
|
(lib.concatMapStrings (x: "ln -s '${x.path}' '${x.name}';\n") entries));
|
2009-11-23 19:18:53 +00:00
|
|
|
|
2010-05-03 10:13:17 +01:00
|
|
|
# Require file
|
2015-07-08 11:24:38 +01:00
|
|
|
requireFile = { name ? null
|
|
|
|
, sha256 ? null
|
|
|
|
, sha1 ? null
|
|
|
|
, url ? null
|
|
|
|
, message ? null
|
|
|
|
} :
|
2010-05-03 10:13:17 +01:00
|
|
|
assert (message != null) || (url != null);
|
2015-07-08 11:24:38 +01:00
|
|
|
assert (sha256 != null) || (sha1 != null);
|
|
|
|
assert (name != null) || (url != null);
|
2010-05-03 10:13:17 +01:00
|
|
|
let msg =
|
|
|
|
if message != null then message
|
|
|
|
else ''
|
2015-07-08 11:24:38 +01:00
|
|
|
Unfortunately, we may not download file ${name_} automatically.
|
2016-01-15 16:36:42 +00:00
|
|
|
Please, go to ${url} to download it yourself, and add it to the Nix store
|
2010-05-03 10:13:17 +01:00
|
|
|
using either
|
2015-07-08 11:24:38 +01:00
|
|
|
nix-store --add-fixed ${hashAlgo} ${name_}
|
2010-05-03 10:13:17 +01:00
|
|
|
or
|
2016-01-14 13:13:51 +00:00
|
|
|
nix-prefetch-url --type ${hashAlgo} file:///path/to/${name_}
|
2010-05-03 10:13:17 +01:00
|
|
|
'';
|
2015-07-08 11:24:38 +01:00
|
|
|
hashAlgo = if sha256 != null then "sha256" else "sha1";
|
|
|
|
hash = if sha256 != null then sha256 else sha1;
|
|
|
|
name_ = if name == null then baseNameOf (toString url) else name;
|
2010-05-03 10:13:17 +01:00
|
|
|
in
|
|
|
|
stdenv.mkDerivation {
|
2015-07-08 11:24:38 +01:00
|
|
|
name = name_;
|
|
|
|
outputHashAlgo = hashAlgo;
|
|
|
|
outputHash = hash;
|
2016-02-19 12:46:21 +00:00
|
|
|
preferLocalBuild = true;
|
2010-05-03 10:13:17 +01:00
|
|
|
builder = writeScript "restrict-message" ''
|
2016-02-19 12:46:21 +00:00
|
|
|
source ${stdenv}/setup
|
|
|
|
cat <<_EOF_
|
2010-05-03 10:13:17 +01:00
|
|
|
|
2016-02-19 12:46:21 +00:00
|
|
|
***
|
|
|
|
${msg}
|
|
|
|
***
|
2010-05-03 10:13:17 +01:00
|
|
|
|
2016-02-19 12:46:21 +00:00
|
|
|
_EOF_
|
2010-05-03 10:13:17 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2010-01-03 11:08:45 +00:00
|
|
|
# Search in the environment if the same program exists with a set uid or
|
|
|
|
# set gid bit. If it exists, run the first program found, otherwise run
|
|
|
|
# the default binary.
|
|
|
|
useSetUID = drv: path:
|
|
|
|
let
|
2012-03-19 18:13:47 +00:00
|
|
|
name = baseNameOf path;
|
2010-01-03 11:08:45 +00:00
|
|
|
bin = "${drv}${path}";
|
|
|
|
in assert name != "";
|
|
|
|
writeScript "setUID-${name}" ''
|
|
|
|
#!${stdenv.shell}
|
|
|
|
inode=$(stat -Lc %i ${bin})
|
|
|
|
for file in $(type -ap ${name}); do
|
|
|
|
case $(stat -Lc %a $file) in
|
|
|
|
([2-7][0-7][0-7][0-7])
|
|
|
|
if test -r "$file".real; then
|
|
|
|
orig=$(cat "$file".real)
|
|
|
|
if test $inode = $(stat -Lc %i "$orig"); then
|
|
|
|
exec "$file" "$@"
|
|
|
|
fi
|
|
|
|
fi;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
exec ${bin} "$@"
|
|
|
|
'';
|
|
|
|
|
2015-12-16 21:00:44 +00:00
|
|
|
# Copy a path to the Nix store.
|
2016-03-01 14:26:01 +00:00
|
|
|
# Nix automatically copies files to the store before stringifying paths.
|
|
|
|
# If you need the store path of a file, ${copyPathToStore <path>} can be
|
|
|
|
# shortened to ${<path>}.
|
2015-12-16 21:00:44 +00:00
|
|
|
copyPathToStore = builtins.filterSource (p: t: true);
|
|
|
|
|
|
|
|
# Copy a list of paths to the Nix store.
|
|
|
|
copyPathsToStore = builtins.map copyPathToStore;
|
|
|
|
|
2009-11-19 16:07:47 +00:00
|
|
|
}
|