aboutsummaryrefslogtreecommitdiff
path: root/pkgs/stdenv/adapters.nix
diff options
context:
space:
mode:
authorJohn Ericson <Ericson2314@Yahoo.com>2017-04-26 00:06:11 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2017-06-22 17:52:28 -0400
commit594d26420594acf458e5a8ab75229a2147d9194f (patch)
tree9211ca90764bdb1810aa4c2a5fb0e5fd51f78a76 /pkgs/stdenv/adapters.nix
parent9bfd03eff78aa37bff9a7f4cb12c6bed1f04e764 (diff)
cross stdenv adaptor: Support --host --build --target across the board
Packages get --host and --target by default, but can explicitly request any subset to be passed as needed. See docs for more info. rustc: Avoid hash breakage by using the old (ignored) dontSetConfigureCross when not cross building
Diffstat (limited to 'pkgs/stdenv/adapters.nix')
-rw-r--r--pkgs/stdenv/adapters.nix33
1 files changed, 26 insertions, 7 deletions
diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix
index fc332dff3aa..7fd283ca823 100644
--- a/pkgs/stdenv/adapters.nix
+++ b/pkgs/stdenv/adapters.nix
@@ -56,8 +56,15 @@ rec {
# Return a modified stdenv that adds a cross compiler to the
# builds.
- makeStdenvCross = stdenvOrig: cross: cc: let
- stdenv = stdenvOrig.override {
+ makeStdenvCross = { stdenv
+ , cc
+ , buildPlatform, hostPlatform, targetPlatform
+ } @ overrideArgs: let
+ stdenv = overrideArgs.stdenv.override {
+ # TODO(@Ericson2314): Cannot do this for now because then Nix thinks the
+ # resulting derivation should be built on the host platform.
+ #hostPlatform = buildPlatform;
+ #targetPlatform = hostPlatform;
inherit cc;
allowedRequisites = null;
@@ -70,7 +77,12 @@ rec {
mkDerivation =
{ name ? "", buildInputs ? [], nativeBuildInputs ? []
, propagatedBuildInputs ? [], propagatedNativeBuildInputs ? []
- , selfNativeBuildInput ? false, ...
+ , configureFlags ? []
+ , # Target is not included by default because most programs don't care.
+ # Including it then would cause needless massive rebuilds.
+ configurePlatforms ? args.crossAttrs.configurePlatforms or [ "build" "host" ]
+ , selfNativeBuildInput ? args.crossAttrs.selfNativeBuildInput or false
+ , ...
} @ args:
let
@@ -93,16 +105,23 @@ rec {
nativeInputsFromBuildInputs = stdenv.lib.filter hostAsNativeDrv buildInputsNotNull;
in
stdenv.mkDerivation (args // {
- name = name + "-" + cross.config;
+ name = name + "-" + hostPlatform.config;
nativeBuildInputs = nativeBuildInputs
++ nativeInputsFromBuildInputs
++ stdenv.lib.optional selfNativeBuildInput nativeDrv
# without proper `file` command, libtool sometimes fails
# to recognize 64-bit DLLs
- ++ stdenv.lib.optional (cross.config == "x86_64-w64-mingw32") pkgs.file
- ++ stdenv.lib.optional (cross.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook
+ ++ stdenv.lib.optional (hostPlatform.config == "x86_64-w64-mingw32") pkgs.file
+ ++ stdenv.lib.optional (hostPlatform.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook
;
+ # This parameter is sometimes a string and sometimes a list, yuck
+ configureFlags = let inherit (stdenv.lib) optional elem; in
+ (if stdenv.lib.isString configureFlags then [configureFlags] else configureFlags)
+ ++ optional (elem "build" configurePlatforms) "--build=${buildPlatform.config}"
+ ++ optional (elem "host" configurePlatforms) "--host=${hostPlatform.config}"
+ ++ optional (elem "target" configurePlatforms) "--target=${targetPlatform.config}";
+
# Cross-linking dynamic libraries, every buildInput should
# be propagated because ld needs the -rpath-link to find
# any library needed to link the program dynamically at
@@ -111,7 +130,7 @@ rec {
propagatedBuildInputs = propagatedBuildInputs ++ buildInputs;
propagatedNativeBuildInputs = propagatedNativeBuildInputs;
- crossConfig = cross.config;
+ crossConfig = hostPlatform.config;
} // args.crossAttrs or {});
};