From 594d26420594acf458e5a8ab75229a2147d9194f Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 26 Apr 2017 00:06:11 -0400 Subject: 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 --- doc/stdenv.xml | 10 +++++++ pkgs/applications/video/mplayer/default.nix | 6 ++-- pkgs/applications/video/omxplayer/default.nix | 2 +- pkgs/development/compilers/ghc/head.nix | 2 +- pkgs/development/compilers/rust/rustc.nix | 4 ++- pkgs/development/libraries/ffmpeg-full/default.nix | 2 +- pkgs/development/libraries/ffmpeg/generic.nix | 2 +- pkgs/development/libraries/libav/default.nix | 2 +- pkgs/development/libraries/libvpx/default.nix | 2 +- pkgs/development/libraries/libvpx/git.nix | 2 +- pkgs/development/libraries/qt-4.x/4.8/default.nix | 2 +- pkgs/development/libraries/zlib/default.nix | 2 +- pkgs/stdenv/adapters.nix | 33 +++++++++++++++++----- pkgs/stdenv/cross/default.nix | 15 ++++++---- pkgs/top-level/all-packages.nix | 9 +++--- 15 files changed, 66 insertions(+), 29 deletions(-) diff --git a/doc/stdenv.xml b/doc/stdenv.xml index 9ec14d5a7828..e637962fbb7d 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 37b424d922ba..9ae1b99f86fd 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 449190cfaa17..01a85f3d9528 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 53069619ffb0..70200b2fa01b 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 4e0d0971cb66..717c0092c946 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 d5b2632a3716..3f847bc752f0 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 57ac086368f4..762a4c9503fb 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 6aa88a524c0e..785e3599bf17 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 7efff3412a39..09fc3a2a9da9 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 1dafd4a124dc..ceda1c263893 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 18f2e7611a9e..dee83306cc6e 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 5d96299380ed..dc6f0a455d86 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 fc332dff3aa3..7fd283ca8230 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 f9c23078cd30..125c4300975a 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 b499b623a8c2..c201715dfef3 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: -- cgit 1.4.1