From f68e16f0235989f11ad7394edf656649c652bef4 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Fri, 11 Nov 2016 06:34:24 -0800 Subject: [PATCH] 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. --- pkgs/stdenv/cross/default.nix | 20 +++++++++----------- pkgs/top-level/all-packages.nix | 11 +++++++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix index 93c5a21d9d5..575692ca012 100644 --- a/pkgs/stdenv/cross/default.nix +++ b/pkgs/stdenv/cross/default.nix @@ -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; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 342b4e50d96..1cee2532076 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -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