top-level: Make stdenvCross which appears at first glance normal...

...but actually is weird just like the original
This commit is contained in:
John Ericson 2016-11-06 21:27:38 -08:00
parent eed34bd214
commit e22346c35e
4 changed files with 52 additions and 22 deletions

View File

@ -0,0 +1,27 @@
{ system, allPackages, platform, crossSystem, config, ... } @ args:
rec {
vanillaStdenv = (import ../. (args // {
crossSystem = null;
allPackages = args: allPackages ({ crossSystem = null; } // args);
})).stdenv;
# 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.
buildPackages = allPackages {
# It's OK to change the built-time dependencies
allowCustomOverrides = true;
bootStdenv = stdenvCross;
inherit system platform crossSystem config;
};
stdenvCross = buildPackages.makeStdenvCross
vanillaStdenv crossSystem
buildPackages.binutilsCross buildPackages.gccCrossStageFinal;
}

View File

@ -5,7 +5,7 @@
# Posix utilities, the GNU C compiler, and so on. On other systems,
# we use the native C library.
{ system, allPackages ? import ../.., platform, config, lib }:
{ system, allPackages ? import ../.., platform, config, crossSystem, lib }:
rec {
@ -36,10 +36,13 @@ rec {
# Linux standard environment.
inherit (import ./linux { inherit system allPackages platform config lib; }) stdenvLinux;
inherit (import ./darwin { inherit system allPackages platform config;}) stdenvDarwin;
inherit (import ./darwin { inherit system allPackages platform config; }) stdenvDarwin;
inherit (import ./cross { inherit system allPackages platform crossSystem config lib; }) stdenvCross;
# Select the appropriate stdenv for the platform `system'.
stdenv =
if crossSystem != null then stdenvCross else
if system == "i686-linux" then stdenvLinux else
if system == "x86_64-linux" then stdenvLinux else
if system == "armv5tel-linux" then stdenvLinux else

View File

@ -12,6 +12,11 @@
# null, the default standard environment is used.
bootStdenv ? null
, # This is used because stdenv replacement and the stdenvCross do benefit from
# the overridden configuration provided by the user, as opposed to the normal
# bootstrapping stdenvs.
allowCustomOverrides ? (bootStdenv == null)
, # Non-GNU/Linux OSes are currently "impure" platforms, with their libc
# outside of the store. Thus, GCC, GFortran, & co. must always look for
# files in standard system directories (/usr/include, etc.)
@ -109,7 +114,7 @@ let
# attributes to refer to the original attributes (e.g. "foo =
# ... pkgs.foo ...").
configOverrides = self: super:
lib.optionalAttrs (bootStdenv == null)
lib.optionalAttrs allowCustomOverrides
((config.packageOverrides or (super: {})) super);
# The complete chain of package set builders, applied from top to bottom

View File

@ -2,22 +2,17 @@
rec {
allStdenvs = import ../stdenv {
inherit system platform config lib;
# TODO(@Ericson2314): hack for cross-compiling until I clean that in follow-up PR
allPackages = args: nixpkgsFun (args // { crossSystem = null; });
inherit system platform config crossSystem lib;
allPackages = nixpkgsFun;
};
defaultStdenv = allStdenvs.stdenv // { inherit platform; };
stdenv =
if bootStdenv != null then (bootStdenv // {inherit platform;}) else
if crossSystem != null then
pkgs.stdenvCross
else
let
changer = config.replaceStdenv or null;
in if changer != null then
changer {
if bootStdenv != null then
(bootStdenv // { inherit platform; })
else if crossSystem == null && config ? replaceStdenv then
config.replaceStdenv {
# We import again all-packages to avoid recursivities.
pkgs = nixpkgsFun {
# We remove packageOverrides to avoid recursivities