Skip to content

Commit

Permalink
stdenv: implement crossOverlays
Browse files Browse the repository at this point in the history
crossOverlays only apply to the packages being built, not the build
packages. It is useful when you don’t care what is used to build your
packages, just what is being built. The idea relies heavily on the
cross compiling infrastructure. Using this implies that we need to
create a cross stdenv.
  • Loading branch information
matthewbauer committed Dec 5, 2018
1 parent 9d8de9f commit a3a6ad7
Show file tree
Hide file tree
Showing 9 changed files with 28 additions and 20 deletions.
13 changes: 9 additions & 4 deletions pkgs/stdenv/cross/default.nix
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
{ lib
, localSystem, crossSystem, config, overlays
, localSystem, crossSystem, config, overlays, crossOverlays ? []
}:

let
bootStages = import ../. {
inherit lib localSystem overlays;
crossSystem = null;

crossSystem = localSystem;
crossOverlays = [];

# Ignore custom stdenvs when cross compiling for compatability
config = builtins.removeAttrs config [ "replaceStdenv" ];
};
Expand Down Expand Up @@ -33,7 +36,8 @@ in lib.init bootStages ++ [

# Run Packages
(buildPackages: {
inherit config overlays;
inherit config;
overlays = overlays ++ crossOverlays;
selfBuild = false;
stdenv = buildPackages.stdenv.override (old: rec {
buildPlatform = localSystem;
Expand All @@ -48,14 +52,15 @@ in lib.init bootStages ++ [

cc = if crossSystem.useiOSPrebuilt or false
then buildPackages.darwin.iosSdkPkgs.clang
else if crossSystem.useAndroidPrebuilt
else if crossSystem.useAndroidPrebuilt or false
then buildPackages.androidenv."androidndkPkgs_${crossSystem.ndkVer}".gcc
else buildPackages.gcc;

extraNativeBuildInputs = old.extraNativeBuildInputs
++ lib.optionals
(hostPlatform.isLinux && !buildPlatform.isLinux)
[ buildPackages.patchelf buildPackages.paxctl ]
++ lib.optional hostPlatform.isDarwin buildPackages.clang
++ lib.optional
(let f = p: !p.isx86 || p.libc == "musl"; in f hostPlatform && !(f buildPlatform))
buildPackages.updateAutotoolsGnuConfigScriptsHook
Expand Down
2 changes: 1 addition & 1 deletion pkgs/stdenv/custom/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
, localSystem, crossSystem, config, overlays
}:

assert crossSystem == null;
assert crossSystem == localSystem;

let
bootStages = import ../. {
Expand Down
4 changes: 2 additions & 2 deletions pkgs/stdenv/darwin/default.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{ lib
, localSystem, crossSystem, config, overlays
, localSystem, crossSystem, config, overlays, crossOverlays ? []

# Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
, bootstrapFiles ? let
Expand All @@ -16,7 +16,7 @@
}
}:

assert crossSystem == null;
assert crossSystem == localSystem;

let
inherit (localSystem) system platform;
Expand Down
4 changes: 2 additions & 2 deletions pkgs/stdenv/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
{ # Args just for stdenvs' usage
lib
# Args to pass on to the pkgset builder, too
, localSystem, crossSystem, config, overlays
, localSystem, crossSystem, config, overlays, crossOverlays ? []
} @ args:

let
Expand Down Expand Up @@ -36,7 +36,7 @@ let

# Select the appropriate stages for the platform `system'.
in
if crossSystem != null then stagesCross
if crossSystem != localSystem || crossOverlays != [] then stagesCross
else if config ? replaceStdenv then stagesCustom
else { # switch
"i686-linux" = stagesLinux;
Expand Down
2 changes: 1 addition & 1 deletion pkgs/stdenv/freebsd/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
, localSystem, crossSystem, config, overlays
}:

assert crossSystem == null;
assert crossSystem == localSystem;
let inherit (localSystem) system; in


Expand Down
4 changes: 2 additions & 2 deletions pkgs/stdenv/linux/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# compiler and linker that do not search in default locations,
# ensuring purity of components produced by it.
{ lib
, localSystem, crossSystem, config, overlays
, localSystem, crossSystem, config, overlays, crossOverlays ? []

, bootstrapFiles ?
let table = {
Expand Down Expand Up @@ -32,7 +32,7 @@
in files
}:

assert crossSystem == null;
assert crossSystem == localSystem;

let
inherit (localSystem) system platform;
Expand Down
2 changes: 1 addition & 1 deletion pkgs/stdenv/native/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
, localSystem, crossSystem, config, overlays
}:

assert crossSystem == null;
assert crossSystem == localSystem;

let
inherit (localSystem) system;
Expand Down
4 changes: 2 additions & 2 deletions pkgs/stdenv/nix/default.nix
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{ lib
, crossSystem, config, overlays
, crossSystem, localSystem, config, overlays
, bootStages
, ...
}:

assert crossSystem == null;
assert crossSystem == localSystem;

bootStages ++ [
(prevStage: {
Expand Down
13 changes: 8 additions & 5 deletions pkgs/top-level/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,18 @@
# `*Platform`s.
localSystem

, # The system packages will ultimately be run on. Null if the two should be the
# same.
crossSystem ? null
, # The system packages will ultimately be run on.
crossSystem ? localSystem

, # Allow a configuration attribute set to be passed in as an argument.
config ? {}

, # List of overlays layers used to extend Nixpkgs.
overlays ? []

, # List of overlays to apply to target packages only.
crossOverlays ? []

, # A function booting the final package set for a specific standard
# environment. See below for the arguments given to that function, the type of
# list it returns.
Expand Down Expand Up @@ -61,7 +63,8 @@ in let
builtins.intersectAttrs { platform = null; } config
// args.localSystem);

crossSystem = lib.mapNullable lib.systems.elaborate crossSystem0;
crossSystem = if crossSystem0 == null then localSystem
else lib.systems.elaborate crossSystem0;

# A few packages make a new package set to draw their dependencies from.
# (Currently to get a cross tool chain, or forced-i686 package.) Rather than
Expand Down Expand Up @@ -91,7 +94,7 @@ in let
boot = import ../stdenv/booter.nix { inherit lib allPackages; };

stages = stdenvStages {
inherit lib localSystem crossSystem config overlays;
inherit lib localSystem crossSystem config overlays crossOverlays;
};

pkgs = boot stages;
Expand Down

0 comments on commit a3a6ad7

Please sign in to comment.