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 // { vanillaStdenv = (import ../. (args // argClobber // {
allPackages = args: allPackages (argClobber // args); 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 # For now, this is just used to build the native stdenv. Eventually, it should
# buildPackages <-> stdenvCross cycle. Yup, it's very weird. # be used to build compilers and other such tools targeting the cross
# # platform. Then, `forceNativeDrv` can be removed.
# 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.
buildPackages = allPackages { buildPackages = allPackages {
# It's OK to change the built-time dependencies # It's OK to change the built-time dependencies
allowCustomOverrides = true; allowCustomOverrides = true;
bootStdenv = stdenvCross; bootStdenv = vanillaStdenv;
inherit system platform crossSystem config; inherit system platform crossSystem config;
}; };
stdenvCross = buildPackages.makeStdenvCross stdenvCross = buildPackages.makeStdenvCross
vanillaStdenv crossSystem buildPackages.stdenv crossSystem
buildPackages.binutilsCross buildPackages.gccCrossStageFinal; buildPackages.binutilsCross buildPackages.gccCrossStageFinal;
} }

View File

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