top-level: Make cross compiling slightly saner

Removes the weird stdenv cycle used to match the old infrastructure.
It turns out that matching it so precisely is not needed.
This commit is contained in:
John Ericson 2016-11-11 06:34:24 -08:00 committed by Nicolas B. Pierron
parent 645e2b55e5
commit f68e16f023
2 changed files with 16 additions and 15 deletions

View file

@ -8,24 +8,22 @@ rec {
};
vanillaStdenv = (import ../. (args // argClobber // {
allPackages = args: allPackages (argClobber // args);
})).stdenv;
})).stdenv // {
# Needed elsewhere as a hacky way to pass the target
cross = crossSystem;
};
# Yeah this isn't so cleanly just build-time packages yet. Notice the
# buildPackages <-> stdenvCross cycle. Yup, it's very weird.
#
# This works because the derivation used to build `stdenvCross` are in
# fact using `forceNativeDrv` to use the `nativeDrv` attribute of the resulting
# derivation built with `vanillaStdenv` (second argument of `makeStdenvCross`).
#
# Eventually, `forceNativeDrv` should be removed and the cycle broken.
# For now, this is just used to build the native stdenv. Eventually, it should
# be used to build compilers and other such tools targeting the cross
# platform. Then, `forceNativeDrv` can be removed.
buildPackages = allPackages {
# It's OK to change the built-time dependencies
allowCustomOverrides = true;
bootStdenv = stdenvCross;
bootStdenv = vanillaStdenv;
inherit system platform crossSystem config;
};
stdenvCross = buildPackages.makeStdenvCross
vanillaStdenv crossSystem
buildPackages.stdenv crossSystem
buildPackages.binutilsCross buildPackages.gccCrossStageFinal;
}

View file

@ -46,10 +46,13 @@ in
callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);
forceNativeDrv = drv : if crossSystem == null then drv else
(drv // { crossDrv = drv.nativeDrv; });
stdenvCross = lowPrio (makeStdenvCross defaultStdenv crossSystem binutilsCross gccCrossStageFinal);
forceNativeDrv = drv:
# Even when cross compiling, some packages come from the stdenv's
# bootstrapping package set. Those packages are only built for the native
# platform.
if crossSystem != null && drv ? crossDrv
then drv // { crossDrv = drv.nativeDrv; }
else drv;
# A stdenv capable of building 32-bit binaries. On x86_64-linux,
# it uses GCC compiled with multilib support; on i686-linux, it's