summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Ericson <Ericson2314@Yahoo.com>2017-04-26 00:06:11 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2017-06-22 17:52:28 -0400
commit594d26420594acf458e5a8ab75229a2147d9194f (patch)
tree9211ca90764bdb1810aa4c2a5fb0e5fd51f78a76
parent9bfd03eff78aa37bff9a7f4cb12c6bed1f04e764 (diff)
downloadnixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar.gz
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar.bz2
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar.lz
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar.xz
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.tar.zst
nixpkgs-594d26420594acf458e5a8ab75229a2147d9194f.zip
cross stdenv adaptor: Support --host --build --target across the board
Packages get --host and --target by default, but can explicitly request
any subset to be passed as needed. See docs for more info.

rustc: Avoid hash breakage by using the old (ignored)
dontSetConfigureCross when not cross building
-rw-r--r--doc/stdenv.xml10
-rw-r--r--pkgs/applications/video/mplayer/default.nix6
-rw-r--r--pkgs/applications/video/omxplayer/default.nix2
-rw-r--r--pkgs/development/compilers/ghc/head.nix2
-rw-r--r--pkgs/development/compilers/rust/rustc.nix4
-rw-r--r--pkgs/development/libraries/ffmpeg-full/default.nix2
-rw-r--r--pkgs/development/libraries/ffmpeg/generic.nix2
-rw-r--r--pkgs/development/libraries/libav/default.nix2
-rw-r--r--pkgs/development/libraries/libvpx/default.nix2
-rw-r--r--pkgs/development/libraries/libvpx/git.nix2
-rw-r--r--pkgs/development/libraries/qt-4.x/4.8/default.nix2
-rw-r--r--pkgs/development/libraries/zlib/default.nix2
-rw-r--r--pkgs/stdenv/adapters.nix33
-rw-r--r--pkgs/stdenv/cross/default.nix15
-rw-r--r--pkgs/top-level/all-packages.nix9
15 files changed, 66 insertions, 29 deletions
diff --git a/doc/stdenv.xml b/doc/stdenv.xml
index 9ec14d5a782..e637962fbb7 100644
--- a/doc/stdenv.xml
+++ b/doc/stdenv.xml
@@ -641,6 +641,16 @@ script) if it exists.</para>
   </varlistentry>
 
   <varlistentry>
+    <term><varname>configurePlatforms</varname></term>
+    <listitem><para>
+      By default, when cross compiling, the configure script has <option>--build=...</option> and <option>--host=...</option> passed.
+      Packages can instead pass <literal>[ "build" "host" "target" ]</literal> 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.
+    </para></listitem>
+  </varlistentry>
+
+  <varlistentry>
     <term><varname>preConfigure</varname></term>
     <listitem><para>Hook executed at the start of the configure
     phase.</para></listitem>
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: