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

View file

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

View file

@ -869,4 +869,10 @@ genericBuild() {
runHook postHook 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 dumpVars

View file

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

View file

@ -1,4 +1,4 @@
{ system, allPackages ? import ../../.. }: { system, allPackages ? import ../../.., config }:
rec { rec {
@ -98,7 +98,7 @@ rec {
fetchurlBoot = fetchurl; 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 { import ../generic rec {
inherit config;
preHook = preHook =
'' ''
export NIX_ENFORCE_PURITY=1 export NIX_ENFORCE_PURITY=1

View file

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