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
wip/yesman
John Ericson 7 years ago committed by John Ericson
parent 9bfd03eff7
commit 594d264205
  1. 10
      doc/stdenv.xml
  2. 6
      pkgs/applications/video/mplayer/default.nix
  3. 2
      pkgs/applications/video/omxplayer/default.nix
  4. 2
      pkgs/development/compilers/ghc/head.nix
  5. 4
      pkgs/development/compilers/rust/rustc.nix
  6. 2
      pkgs/development/libraries/ffmpeg-full/default.nix
  7. 2
      pkgs/development/libraries/ffmpeg/generic.nix
  8. 2
      pkgs/development/libraries/libav/default.nix
  9. 2
      pkgs/development/libraries/libvpx/default.nix
  10. 2
      pkgs/development/libraries/libvpx/git.nix
  11. 2
      pkgs/development/libraries/qt-4.x/4.8/default.nix
  12. 2
      pkgs/development/libraries/zlib/default.nix
  13. 33
      pkgs/stdenv/adapters.nix
  14. 15
      pkgs/stdenv/cross/default.nix
  15. 9
      pkgs/top-level/all-packages.nix

@ -640,6 +640,16 @@ script) if it exists.</para>
true.</para></listitem>
</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

@ -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"
'';

@ -44,7 +44,7 @@ let
enableParallelBuilding = true;
crossAttrs = {
dontSetConfigureCross = true;
configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"

@ -114,7 +114,7 @@ in stdenv.mkDerivation (rec {
buildInputs = commonBuildInputs ++ [ stdenv.ccCross stdenv.binutils ];
dontSetConfigureCross = true;
configurePlatforms = [];
passthru = {
inherit bootPkgs cross;

@ -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

@ -446,7 +446,7 @@ stdenv.mkDerivation rec {
fi
'';
in {
dontSetConfigureCross = true;
configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"

@ -187,7 +187,7 @@ stdenv.mkDerivation rec {
fi
'';
in {
dontSetConfigureCross = true;
configurePlatforms = [];
configureFlags = configureFlags ++ [
"--cross-prefix=${stdenv.cross.config}-"
"--enable-cross-compile"

@ -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"

@ -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="

@ -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="

@ -209,7 +209,7 @@ stdenv.mkDerivation rec {
postInstall = ''
cp bin/qmake* $out/bin
'';
dontSetConfigureCross = true;
configurePlatforms = [];
dontStrip = true;
} // optionalAttrs isMingw {
propagatedBuildInputs = [ ];

@ -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"

@ -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 {});
};

@ -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;
};
})
]

@ -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:

Loading…
Cancel
Save