diff --git a/doc/stdenv.xml b/doc/stdenv.xml
index 9ec14d5a782..e637962fbb7 100644
--- a/doc/stdenv.xml
+++ b/doc/stdenv.xml
@@ -640,6 +640,16 @@ script) if it exists.
true.
+
+ configurePlatforms
+
+ By default, when cross compiling, the configure script has and passed.
+ Packages can instead pass [ "build" "host" "target" ] or a subset to control exactly which platform flags are passed.
+ Compilers and other tools should use this to also pass the target platform, for example.
+ Note eventually these will be passed when in native builds too, to improve determinism: build-time guessing, as is done today, is a risk of impurity.
+
+
+
preConfigure
Hook executed at the start of the configure
diff --git a/pkgs/applications/video/mplayer/default.nix b/pkgs/applications/video/mplayer/default.nix
index 37b424d922b..9ae1b99f86f 100644
--- a/pkgs/applications/video/mplayer/default.nix
+++ b/pkgs/applications/video/mplayer/default.nix
@@ -25,6 +25,7 @@
, libjpegSupport ? true, libjpeg ? null
, useUnfreeCodecs ? false
, darwin ? null
+, hostPlatform
}:
assert fontconfigSupport -> (fontconfig != null);
@@ -185,13 +186,14 @@ stdenv.mkDerivation rec {
'';
crossAttrs = {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
# Some things (vidix) are nanonote specific. Once someone cares, we can make options from them.
+ # Note, the `target` vs `host` confusion is intensional.
preConfigure = ''
configureFlags="`echo $configureFlags |
sed -e 's/--codecsdir[^ ]\+//' \
-e 's/--enable-runtime-cpudetection//' `"
- configureFlags="$configureFlags --target=${stdenv.cross.arch}-linux
+ configureFlags="$configureFlags --target=${hostPlatform.arch}-linux
--enable-cross-compile --cc=$crossConfig-gcc --as=$crossConfig-as
--disable-vidix-pcidb --with-vidix-drivers=no --host-cc=gcc"
'';
diff --git a/pkgs/applications/video/omxplayer/default.nix b/pkgs/applications/video/omxplayer/default.nix
index 449190cfaa1..01a85f3d952 100644
--- a/pkgs/applications/video/omxplayer/default.nix
+++ b/pkgs/applications/video/omxplayer/default.nix
@@ -44,7 +44,7 @@ let
enableParallelBuilding = true;
crossAttrs = {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"
diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix
index 53069619ffb..70200b2fa01 100644
--- a/pkgs/development/compilers/ghc/head.nix
+++ b/pkgs/development/compilers/ghc/head.nix
@@ -114,7 +114,7 @@ in stdenv.mkDerivation (rec {
buildInputs = commonBuildInputs ++ [ stdenv.ccCross stdenv.binutils ];
- dontSetConfigureCross = true;
+ configurePlatforms = [];
passthru = {
inherit bootPkgs cross;
diff --git a/pkgs/development/compilers/rust/rustc.nix b/pkgs/development/compilers/rust/rustc.nix
index 4e0d0971cb6..717c0092c94 100644
--- a/pkgs/development/compilers/rust/rustc.nix
+++ b/pkgs/development/compilers/rust/rustc.nix
@@ -10,6 +10,7 @@
, targetPatches
, targetToolchains
, doCheck ? true
+, buildPlatform, hostPlatform
} @ args:
let
@@ -137,7 +138,8 @@ stdenv.mkDerivation {
inherit doCheck;
- dontSetConfigureCross = true;
+ ${if buildPlatform == hostPlatform then "dontSetConfigureCross" else null} = true;
+ ${if buildPlatform != hostPlatform then "configurePlatforms" else null} = [];
# https://github.com/NixOS/nixpkgs/pull/21742#issuecomment-272305764
# https://github.com/rust-lang/rust/issues/30181
diff --git a/pkgs/development/libraries/ffmpeg-full/default.nix b/pkgs/development/libraries/ffmpeg-full/default.nix
index d5b2632a371..3f847bc752f 100644
--- a/pkgs/development/libraries/ffmpeg-full/default.nix
+++ b/pkgs/development/libraries/ffmpeg-full/default.nix
@@ -446,7 +446,7 @@ stdenv.mkDerivation rec {
fi
'';
in {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"
diff --git a/pkgs/development/libraries/ffmpeg/generic.nix b/pkgs/development/libraries/ffmpeg/generic.nix
index 57ac086368f..762a4c9503f 100644
--- a/pkgs/development/libraries/ffmpeg/generic.nix
+++ b/pkgs/development/libraries/ffmpeg/generic.nix
@@ -187,7 +187,7 @@ stdenv.mkDerivation rec {
fi
'';
in {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"
diff --git a/pkgs/development/libraries/libav/default.nix b/pkgs/development/libraries/libav/default.nix
index 6aa88a524c0..785e3599bf1 100644
--- a/pkgs/development/libraries/libav/default.nix
+++ b/pkgs/development/libraries/libav/default.nix
@@ -105,7 +105,7 @@ let
installCheckTarget = "check"; # tests need to be run *after* installation
crossAttrs = {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"
diff --git a/pkgs/development/libraries/libvpx/default.nix b/pkgs/development/libraries/libvpx/default.nix
index 7efff3412a3..09fc3a2a9da 100644
--- a/pkgs/development/libraries/libvpx/default.nix
+++ b/pkgs/development/libraries/libvpx/default.nix
@@ -148,7 +148,7 @@ stdenv.mkDerivation rec {
isCygwin = stdenv.cross.libc == "msvcrt";
isDarwin = stdenv.cross.libc == "libSystem";
in {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
#"--extra-cflags="
#"--extra-cxxflags="
diff --git a/pkgs/development/libraries/libvpx/git.nix b/pkgs/development/libraries/libvpx/git.nix
index 1dafd4a124d..ceda1c26389 100644
--- a/pkgs/development/libraries/libvpx/git.nix
+++ b/pkgs/development/libraries/libvpx/git.nix
@@ -156,7 +156,7 @@ stdenv.mkDerivation rec {
isCygwin = stdenv.cross.libc == "msvcrt";
isDarwin = stdenv.cross.libc == "libSystem";
in {
- dontSetConfigureCross = true;
+ configurePlatforms = [];
configureFlags = configureFlags ++ [
#"--extra-cflags="
#"--prefix="
diff --git a/pkgs/development/libraries/qt-4.x/4.8/default.nix b/pkgs/development/libraries/qt-4.x/4.8/default.nix
index 18f2e7611a9..dee83306cc6 100644
--- a/pkgs/development/libraries/qt-4.x/4.8/default.nix
+++ b/pkgs/development/libraries/qt-4.x/4.8/default.nix
@@ -209,7 +209,7 @@ stdenv.mkDerivation rec {
postInstall = ''
cp bin/qmake* $out/bin
'';
- dontSetConfigureCross = true;
+ configurePlatforms = [];
dontStrip = true;
} // optionalAttrs isMingw {
propagatedBuildInputs = [ ];
diff --git a/pkgs/development/libraries/zlib/default.nix b/pkgs/development/libraries/zlib/default.nix
index 5d96299380e..dc6f0a455d8 100644
--- a/pkgs/development/libraries/zlib/default.nix
+++ b/pkgs/development/libraries/zlib/default.nix
@@ -53,7 +53,7 @@ stdenv.mkDerivation rec {
crossAttrs = {
dontStrip = static;
- dontSetConfigureCross = true;
+ configurePlatforms = [];
} // stdenv.lib.optionalAttrs (stdenv.cross.libc == "msvcrt") {
installFlags = [
"BINARY_PATH=$(out)/bin"
diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix
index fc332dff3aa..7fd283ca823 100644
--- a/pkgs/stdenv/adapters.nix
+++ b/pkgs/stdenv/adapters.nix
@@ -56,8 +56,15 @@ rec {
# Return a modified stdenv that adds a cross compiler to the
# builds.
- makeStdenvCross = stdenvOrig: cross: cc: let
- stdenv = stdenvOrig.override {
+ makeStdenvCross = { stdenv
+ , cc
+ , buildPlatform, hostPlatform, targetPlatform
+ } @ overrideArgs: let
+ stdenv = overrideArgs.stdenv.override {
+ # TODO(@Ericson2314): Cannot do this for now because then Nix thinks the
+ # resulting derivation should be built on the host platform.
+ #hostPlatform = buildPlatform;
+ #targetPlatform = hostPlatform;
inherit cc;
allowedRequisites = null;
@@ -70,7 +77,12 @@ rec {
mkDerivation =
{ name ? "", buildInputs ? [], nativeBuildInputs ? []
, propagatedBuildInputs ? [], propagatedNativeBuildInputs ? []
- , selfNativeBuildInput ? false, ...
+ , configureFlags ? []
+ , # Target is not included by default because most programs don't care.
+ # Including it then would cause needless massive rebuilds.
+ configurePlatforms ? args.crossAttrs.configurePlatforms or [ "build" "host" ]
+ , selfNativeBuildInput ? args.crossAttrs.selfNativeBuildInput or false
+ , ...
} @ args:
let
@@ -93,16 +105,23 @@ rec {
nativeInputsFromBuildInputs = stdenv.lib.filter hostAsNativeDrv buildInputsNotNull;
in
stdenv.mkDerivation (args // {
- name = name + "-" + cross.config;
+ name = name + "-" + hostPlatform.config;
nativeBuildInputs = nativeBuildInputs
++ nativeInputsFromBuildInputs
++ stdenv.lib.optional selfNativeBuildInput nativeDrv
# without proper `file` command, libtool sometimes fails
# to recognize 64-bit DLLs
- ++ stdenv.lib.optional (cross.config == "x86_64-w64-mingw32") pkgs.file
- ++ stdenv.lib.optional (cross.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook
+ ++ stdenv.lib.optional (hostPlatform.config == "x86_64-w64-mingw32") pkgs.file
+ ++ stdenv.lib.optional (hostPlatform.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook
;
+ # This parameter is sometimes a string and sometimes a list, yuck
+ configureFlags = let inherit (stdenv.lib) optional elem; in
+ (if stdenv.lib.isString configureFlags then [configureFlags] else configureFlags)
+ ++ optional (elem "build" configurePlatforms) "--build=${buildPlatform.config}"
+ ++ optional (elem "host" configurePlatforms) "--host=${hostPlatform.config}"
+ ++ optional (elem "target" configurePlatforms) "--target=${targetPlatform.config}";
+
# Cross-linking dynamic libraries, every buildInput should
# be propagated because ld needs the -rpath-link to find
# any library needed to link the program dynamically at
@@ -111,7 +130,7 @@ rec {
propagatedBuildInputs = propagatedBuildInputs ++ buildInputs;
propagatedNativeBuildInputs = propagatedNativeBuildInputs;
- crossConfig = cross.config;
+ crossConfig = hostPlatform.config;
} // args.crossAttrs or {});
};
diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix
index f9c23078cd3..125c4300975 100644
--- a/pkgs/stdenv/cross/default.nix
+++ b/pkgs/stdenv/cross/default.nix
@@ -31,12 +31,15 @@ in bootStages ++ [
targetPlatform = crossSystem;
inherit config overlays;
selfBuild = false;
- stdenv = buildPackages.makeStdenvCross
- buildPackages.stdenv
- crossSystem
- (if crossSystem.useiOSCross or false
- then buildPackages.darwin.ios-cross
- else buildPackages.gccCrossStageFinal);
+ stdenv = buildPackages.makeStdenvCross {
+ inherit (buildPackages) stdenv;
+ buildPlatform = localSystem;
+ hostPlatform = crossSystem;
+ targetPlatform = crossSystem;
+ cc = if crossSystem.useiOSCross or false
+ then buildPackages.darwin.ios-cross
+ else buildPackages.gccCrossStageFinal;
+ };
})
]
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index b499b623a8c..c201715dfef 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -7802,10 +7802,11 @@ with pkgs;
installLocales = config.glibc.locales or false;
# Can't just overrideCC, because then the stdenv-cross mkDerivation will be
# thrown away. TODO: find a better solution for this.
- stdenv = buildPackages.makeStdenvCross
- buildPackages.buildPackages.stdenv
- buildPackages.targetPlatform
- buildPackages.gccCrossStageStatic;
+ stdenv = buildPackages.makeStdenvCross {
+ inherit (buildPackages.buildPackages) stdenv;
+ inherit buildPlatform hostPlatform targetPlatform;
+ cc = buildPackages.gccCrossStageStatic;
+ };
};
# We can choose: