* Move functions like `runCommand' out of all-packages.nix and into

build-support/.

svn path=/nixpkgs/trunk/; revision=18465
This commit is contained in:
Eelco Dolstra 2009-11-19 16:07:47 +00:00
parent 5fca80982a
commit aa392c3aa7
3 changed files with 80 additions and 61 deletions

View File

@ -0,0 +1,71 @@
{ stdenv, lndir }:
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"
}:
runCommand name {inherit text executable; }
''
n=$out${destination}
mkdir -p "$(dirname "$n")"
echo -n "$text" > "$n"
(test -n "$executable" && chmod +x "$n") || true
'';
# Shorthands for `writeTextFile'.
writeText = name: text: writeTextFile {inherit name text;};
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.
makeSetupHook = script:
runCommand "hook" {}
''
ensureDir $out/nix-support
cp ${script} $out/nix-support/setup-hook
'';
# 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
'';
}

View File

@ -198,7 +198,7 @@ rec {
/* Does the same as the update operator '//' except that attributes are /* Does the same as the update operator '//' except that attributes are
merged until the given pedicate is verified. The predicate should merged until the given pedicate is verified. The predicate should
except 3 arguments which are the path to reach the attribute, a part of accept 3 arguments which are the path to reach the attribute, a part of
the first attribute set and a part of the second attribute set. When the first attribute set and a part of the second attribute set. When
the predicate is verified, the value of the first attribute set is the predicate is verified, the value of the first attribute set is
replaced by the value of the second attribute set. replaced by the value of the second attribute set.

View File

@ -75,6 +75,12 @@ let
getConfig = attrPath: default: lib.attrByPath attrPath default config; getConfig = attrPath: default: lib.attrByPath attrPath default config;
# Helper functions that are exported through `pkgs'.
helperFunctions =
(import ../stdenv/adapters.nix { inherit (pkgs) dietlibc fetchurl runCommand; }) //
(import ../build-support/trivial-builders.nix { inherit (pkgs) stdenv; inherit (pkgs.xorg) lndir; });
# Allow packages to be overriden globally via the `packageOverrides' # Allow packages to be overriden globally via the `packageOverrides'
# configuration option, which must be a function that takes `pkgs' # configuration option, which must be a function that takes `pkgs'
# as an argument and returns a set of new or overriden packages. # as an argument and returns a set of new or overriden packages.
@ -88,11 +94,11 @@ let
pkgsOrig = pkgsFun {}; # the un-overriden packages, passed to packageOverrides pkgsOrig = pkgsFun {}; # the un-overriden packages, passed to packageOverrides
pkgsOverriden = pkgsFun __overrides; # the overriden, final packages pkgsOverriden = pkgsFun __overrides; # the overriden, final packages
pkgs = pkgsOverriden; pkgs = pkgsOverriden // helperFunctions;
# The package compositions. Yes, this isn't properly indented. # The package compositions. Yes, this isn't properly indented.
pkgsFun = __overrides: rec { pkgsFun = __overrides: with helperFunctions; rec {
inherit __overrides; inherit __overrides;
@ -198,12 +204,6 @@ let
else else
stdenv; stdenv;
inherit (import ../stdenv/adapters.nix {inherit (pkgs) dietlibc fetchurl runCommand;})
overrideGCC overrideInStdenv overrideSetup
useDietLibC useKlibc makeStaticBinaries addAttrsToDerivation
keepBuildTree cleanupBuildTree addCoverageInstrumentation
replaceMaintainersField;
### BUILD SUPPORT ### BUILD SUPPORT
@ -288,11 +288,6 @@ let
inherit stdenv perl cpio contents; inherit stdenv perl cpio contents;
}; };
makeSetupHook = script: runCommand "hook" {} ''
ensureDir $out/nix-support
cp ${script} $out/nix-support/setup-hook
'';
makeWrapper = makeSetupHook ../build-support/make-wrapper/make-wrapper.sh; makeWrapper = makeSetupHook ../build-support/make-wrapper/make-wrapper.sh;
makeModulesClosure = {kernel, rootModules, allowMissing ? false}: makeModulesClosure = {kernel, rootModules, allowMissing ? false}:
@ -303,38 +298,6 @@ let
pathsFromGraph = ../build-support/kernel/paths-from-graph.pl; pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;
# Run the shell command `buildCommand' to produce a store object
# 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);
symlinkJoin = name: paths: runCommand name {inherit paths;} "mkdir -p $out; for i in $paths; do ${xorg.lndir}/bin/lndir $i $out; done";
# 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"
}:
runCommand name {inherit text executable; } ''
n=$out${destination}
mkdir -p "$(dirname "$n")"
echo -n "$text" > "$n"
(test -n "$executable" && chmod +x "$n") || true
'';
# Shorthands for `writeTextFile'.
writeText = name: text: writeTextFile {inherit name text;};
writeScript = name: text: writeTextFile {inherit name text; executable = true;};
writeScriptBin = name: text: writeTextFile {inherit name text; executable = true; destination = "/bin/${name}";};
# entries is a list of attribute sets like { name = "name" ; path = "/nix/store/..."; }
linkFarm = name: entries: runCommand name {} ("mkdir -p $out; cd $out; \n" +
(lib.concatMapStrings (x: "ln -s '${x.path}' '${x.name}';\n") entries));
srcOnly = args: (import ../build-support/src-only) ({inherit stdenv; } // args); srcOnly = args: (import ../build-support/src-only) ({inherit stdenv; } // args);
substituteAll = import ../build-support/substitute/substitute-all.nix { substituteAll = import ../build-support/substitute/substitute-all.nix {
@ -357,21 +320,6 @@ let
inherit pkgs lib; inherit pkgs lib;
}; };
# 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
'';
### TOOLS ### TOOLS