diff --git a/pkgs/build-support/gcc-cross-wrapper/setup-hook.sh b/pkgs/build-support/gcc-cross-wrapper/setup-hook.sh index 506cca7fb55c..8edfa1ac92b1 100644 --- a/pkgs/build-support/gcc-cross-wrapper/setup-hook.sh +++ b/pkgs/build-support/gcc-cross-wrapper/setup-hook.sh @@ -8,7 +8,7 @@ addCVars () { fi } -envHooksHost=(${envHooksHost[@]} addCVars) +crossEnvHooks=(${crossEnvHooks[@]} addCVars) # Note: these come *after* $out in the PATH (see setup.sh). @@ -25,4 +25,3 @@ if test -n "@glibc@"; then fi configureFlags="$configureFlags --build=$system --host=$crossConfig" -dontStrip=1 diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix index 1b739f851686..f6939f57e62c 100644 --- a/pkgs/stdenv/adapters.nix +++ b/pkgs/stdenv/adapters.nix @@ -111,20 +111,34 @@ rec { # builds. makeStdenvCross = stdenv: cross: binutilsCross: gccCross: stdenv // { mkDerivation = {name, buildInputs ? [], buildNativeInputs ? [], - propagatedBuildInputs ? [], ...}@args: let - # propagatedBuildInputs exists temporarily as another name for - # propagatedHostInputs. + propagatedBuildInputs ? [], propagatedBuildNativeInputs ? [], ...}@args: let + + # *BuildInputs exists temporarily as another name for + # *HostInputs. + getBuildDrv = drv : if (drv ? buildDrv) then drv.buildDrv else drv; - buildInputsDrvs = map (getBuildDrv) buildNativeInputs; - hostInputsDrvs = map (drv: drv.hostDrv) buildInputs; - hostInputsDrvsAsBuildInputs = map (getBuildDrv) buildInputs; - propagatedHostInputsDrvs = map (drv: drv.buildDrv) (propagatedBuildInputs); + buildNativeInputsDrvs = map (getBuildDrv) buildNativeInputs; + buildInputsDrvs = map (drv: drv.hostDrv) buildInputs; + buildInputsDrvsAsBuildInputs = map (getBuildDrv) buildInputs; + propagatedBuildInputsDrvs = map (drv: drv.hostDrv) (propagatedBuildInputs); + propagatedBuildNativeInputsDrvs = map (drv: drv.buildDrv) + (propagatedBuildNativeInputs); + + # The base stdenv already knows that buildNativeInputs and + # buildInputs should be built with the usual gcc-wrapper + # And the same for propagatedBuildInputs. buildDrv = stdenv.mkDerivation args; + + # We should overwrite the input attributes in hostDrv, to overwrite + # the defaults for only-native builds in the base stdenv hostDrv = if (cross == null) then buildDrv else stdenv.mkDerivation (args // { name = name + "-" + cross.config; - buildInputs = buildInputsDrvs + buildNativeInputs = buildNativeInputsDrvs ++ [ gccCross binutilsCross ]; + buildInputs = buildInputsDrvs; + propagatedBuildInputs = propagatedBuildInputsDrvs; + propagatedBuildNativeInputs = propagatedBuildNativeInputsDrvs; crossConfig = cross.config; }); diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index d9ce8d6f825d..0755ee46904b 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -48,8 +48,13 @@ let // (let buildInputs = if attrs ? buildInputs then attrs.buildInputs else []; - buildNativeInputs = if attrs ? buildNativeInputs then attrs.buildNativeInputs - else []; + buildNativeInputs = if attrs ? buildNativeInputs then + attrs.buildNativeInputs else []; + propagatedBuildInputs = if attrs ? propagatedBuildInputs then + attrs.propagatedBuildInputs else []; + propagatedBuildNativeInputs = if attrs ? + propagatedBuildNativeInputs then + attrs.propagatedBuildNativeInputs else []; in { builder = if attrs ? realBuilder then attrs.realBuilder else shell; @@ -57,7 +62,14 @@ let ["-e" (if attrs ? builder then attrs.builder else ./default-builder.sh)]; stdenv = result; system = result.system; - buildInputs = buildInputs ++ buildNativeInputs; + + # That build by the cross compiler + buildInputs = []; + propagatedBuildInputs = []; + # That build by the usual native compiler + buildNativeInputs = buildInputs ++ buildNativeInputs; + propagatedBuildNativeInputs = propagatedBuildInputs ++ + propagatedBuildNativeInputs; })) ) # The meta attribute is passed in the resulting attribute set, diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index efd1abbe02a9..ac0a0b69e64d 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -153,6 +153,7 @@ runHook addInputsHook findInputs() { local pkg=$1 local var=$2 + local propagatedBuildInputsFile=$3 case ${!var} in *\ $pkg\ *) @@ -166,27 +167,26 @@ findInputs() { source $pkg/nix-support/setup-hook fi - if test -f $pkg/nix-support/propagated-build-inputs; then - for i in $(cat $pkg/nix-support/propagated-build-inputs); do + if test -f $pkg/nix-support/$propagatedBuildInputsFile; then + for i in $(cat $pkg/nix-support/$propagatedBuildInputsFile); do findInputs $i $var done fi } -pkgs="" +crossPkgs="" for i in $buildInputs $propagatedBuildInputs; do - findInputs $i pkgs + findInputs $i crossPkgs propagated-build-inputs done -hostPkgs="" -for i in $hostInputs $propagatedBuildInputs; do - findInputs $i hostPkgs +nativePkgs="" +for i in $buildNativeInputs $propagatedBuildNativeInputs; do + findInputs $i nativePkgs propagated-build-native-inputs done # Set the relevant environment variables to point to the build inputs # found above. -envHostHooks=() -addToEnv() { +addToNativeEnv() { local pkg=$1 if test -d $1/bin; then @@ -199,21 +199,22 @@ addToEnv() { done } -for i in $pkgs; do - addToEnv $i +for i in $nativePkgs; do + addToNativeEnv $i done -addToEnvHost() { +crossEnvHooks=() +addToCrossEnv() { local pkg=$1 # Run the package-specific hooks set by the setup-hook scripts. - for i in "${envHostHooks[@]}"; do + for i in "${crossEnvHooks[@]}"; do $i $pkg done } -for i in $hostPkgs; do - addToEnvHost $i +for i in $crossPkgs; do + addToCrossEnv $i done @@ -716,6 +717,11 @@ fixupPhase() { echo "$propagatedBuildInputs" > "$out/nix-support/propagated-build-inputs" fi + if test -n "$propagatedBuildNativeInputs"; then + ensureDir "$out/nix-support" + echo "$propagatedBuildNativeInputs" > "$out/nix-support/propagated-build-native-inputs" + fi + if test -n "$setupHook"; then ensureDir "$out/nix-support" substituteAll "$setupHook" "$out/nix-support/setup-hook" diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a5466a9b116e..f1a5ff3e5377 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4195,7 +4195,7 @@ let }; ncurses = makeOverridable (composedArgsAndFun (import ../development/libraries/ncurses)) { - inherit fetchurl stdenv; + inherit fetchurl stdenv ncurses; # The "! (stdenv ? cross)" is for the cross-built arm ncurses, which # don't build for me in unicode. unicode = (system != "i686-cygwin" && ! (stdenv ? cross));