Add an option ‘stdenv.userHook’ to set a global stdenv setup hook

This allows various applications.  It allows users to set global
optimisation flags, e.g.

  stdenv.userHook = ''NIX_CFLAGS_COMPILE+=" -funroll-loops"'';

But the impetus is as an alternative to issue #229, allowing impure
stdenv setup for people who want to use distcc:

  stdenv.userHook = "source /my/impure/setup-script.sh";

This is probably a bad idea, but at least now it's a bad idea in
people's configuration and not in Nixpkgs. :-)
This commit is contained in:
Eelco Dolstra 2012-12-28 16:36:09 +01:00
parent 6fd4f63530
commit cf8daf6312
7 changed files with 21 additions and 11 deletions

View File

@ -10,7 +10,7 @@
# system, e.g., cygwin and mingw builds on i686-cygwin. Most people
# can ignore it.
{system, stdenvType ? system, allPackages ? import ../.., platform}:
{ system, stdenvType ? system, allPackages ? import ../.., platform, config }:
assert system != "i686-cygwin" -> system == stdenvType;
@ -24,7 +24,7 @@ rec {
# be used with care, since many Nix packages will not build properly
# with it (e.g., because they require GNU Make).
stdenvNative = (import ./native {
inherit system allPackages;
inherit system allPackages config;
}).stdenv;
stdenvNativePkgs = allPackages {
@ -35,13 +35,14 @@ rec {
# The Nix build environment.
stdenvNix = import ./nix {
inherit config;
stdenv = stdenvNative;
pkgs = stdenvNativePkgs;
};
# Linux standard environment.
stdenvLinux = (import ./linux {inherit system allPackages platform;}).stdenvLinux;
stdenvLinux = (import ./linux { inherit system allPackages platform config;}).stdenvLinux;
# MinGW/MSYS standard environment.

View File

@ -1,5 +1,5 @@
{ system, name ? "stdenv", preHook ? "", initialPath, gcc, shell
, extraAttrs ? {}, overrides ? (pkgs: {})
, extraAttrs ? {}, overrides ? (pkgs: {}), config
, # The `fetchurl' to use for downloading curl and its dependencies
# (see all-packages.nix).
@ -58,6 +58,7 @@ let
args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)];
stdenv = result;
system = result.system;
userHook = config.stdenv.userHook or null;
# Inputs built by the cross compiler.
buildInputs = lib.optionals (crossConfig != null) buildInputs;

View File

@ -869,4 +869,10 @@ genericBuild() {
runHook postHook
# Execute the global user hook (defined through the Nixpkgs
# configuration option stdenv.userHook). This can be used to set
# global compiler optimisation flags, for instance.
runHook userHook
dumpVars

View File

@ -7,7 +7,7 @@
# The function defaults are for easy testing.
{ system ? builtins.currentSystem
, allPackages ? import ../../top-level/all-packages.nix
, platform ? null }:
, platform ? null, config }:
rec {
@ -81,7 +81,7 @@ rec {
{gcc, extraAttrs ? {}, overrides ? (pkgs: {}), extraPath ? [], fetchurl}:
import ../generic {
inherit system;
inherit system config;
name = "stdenv-linux-boot";
preHook =
''
@ -261,7 +261,7 @@ rec {
# dependency (`nix-store -qR') on bootstrapTools or the
# first binutils built.
stdenvLinux = import ../generic rec {
inherit system;
inherit system config;
preHook = commonPreHook;

View File

@ -1,4 +1,4 @@
{ system, allPackages ? import ../../.. }:
{ system, allPackages ? import ../../.., config }:
rec {
@ -98,7 +98,7 @@ rec {
fetchurlBoot = fetchurl;
inherit system shell gcc overrides;
inherit system shell gcc overrides config;
};

View File

@ -1,6 +1,8 @@
{ stdenv, pkgs }:
{ stdenv, pkgs, config }:
import ../generic rec {
inherit config;
preHook =
''
export NIX_ENFORCE_PURITY=1

View File

@ -196,7 +196,7 @@ let
allStdenvs = import ../stdenv {
inherit system stdenvType platform;
inherit system stdenvType platform config;
allPackages = args: import ./all-packages.nix ({ inherit config system; } // args);
};