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
This commit is contained in:
parent
9bfd03eff7
commit
594d264205
15 changed files with 66 additions and 29 deletions
|
@ -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…
Reference in a new issue