llvmPackages_*.clang should check the default compiler for the package set it is targeting (targetPackages.stdenv.cc) instead of the compiler that has been used to build it (stdenv.cc) in order to get some sense of whether to use libc++ or libstdc++. Since we are now inspecting targetPackages in the llvmPackages.clang attribute, we need to avoid using it in the cross stdenv — which just forces us to explicitly request libcxxClang for darwin instead of relying on the clang attribute to pick it for us. We also need to do something similar for targetPackages.stdenv.cc: Here the llvmPackages.clang logic would work as we want (inspect targetPackages.stdenv.cc and if it doesn't exist, make the choice based on stdenv.cc), but it gets locked in a cycle with the previous package. We can easily break this, however: We know that the previous set had clang and the next one doesn't exist, so we'd choose libcxxClang any day of the week.
94 lines
3.3 KiB
Nix
94 lines
3.3 KiB
Nix
{ lib
|
|
, localSystem, crossSystem, config, overlays, crossOverlays ? []
|
|
}:
|
|
|
|
let
|
|
bootStages = import ../. {
|
|
inherit lib localSystem overlays;
|
|
|
|
crossSystem = localSystem;
|
|
crossOverlays = [];
|
|
|
|
# Ignore custom stdenvs when cross compiling for compatability
|
|
config = builtins.removeAttrs config [ "replaceStdenv" ];
|
|
};
|
|
|
|
in lib.init bootStages ++ [
|
|
|
|
# Regular native packages
|
|
(somePrevStage: lib.last bootStages somePrevStage // {
|
|
# It's OK to change the built-time dependencies
|
|
allowCustomOverrides = true;
|
|
})
|
|
|
|
# Build tool Packages
|
|
(vanillaPackages: {
|
|
inherit config overlays;
|
|
selfBuild = false;
|
|
stdenv =
|
|
assert vanillaPackages.stdenv.buildPlatform == localSystem;
|
|
assert vanillaPackages.stdenv.hostPlatform == localSystem;
|
|
assert vanillaPackages.stdenv.targetPlatform == localSystem;
|
|
vanillaPackages.stdenv.override { targetPlatform = crossSystem; };
|
|
# It's OK to change the built-time dependencies
|
|
allowCustomOverrides = true;
|
|
})
|
|
|
|
# Run Packages
|
|
(buildPackages: let
|
|
adaptStdenv =
|
|
if crossSystem.isStatic
|
|
then buildPackages.stdenvAdapters.makeStatic
|
|
else lib.id;
|
|
in {
|
|
inherit config;
|
|
overlays = overlays ++ crossOverlays;
|
|
selfBuild = false;
|
|
stdenv = adaptStdenv (buildPackages.stdenv.override (old: rec {
|
|
buildPlatform = localSystem;
|
|
hostPlatform = crossSystem;
|
|
targetPlatform = crossSystem;
|
|
|
|
# Prior overrides are surely not valid as packages built with this run on
|
|
# a different platform, and so are disabled.
|
|
overrides = _: _: {};
|
|
extraBuildInputs = [ ] # Old ones run on wrong platform
|
|
++ lib.optionals hostPlatform.isDarwin [ buildPackages.targetPackages.darwin.apple_sdk.frameworks.CoreFoundation ]
|
|
;
|
|
allowedRequisites = null;
|
|
|
|
hasCC = !targetPlatform.isGhcjs;
|
|
|
|
cc = if crossSystem.useiOSPrebuilt or false
|
|
then buildPackages.darwin.iosSdkPkgs.clang
|
|
else if crossSystem.useAndroidPrebuilt or false
|
|
then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".clang
|
|
else if targetPlatform.isGhcjs
|
|
# Need to use `throw` so tryEval for splicing works, ugh. Using
|
|
# `null` or skipping the attribute would cause an eval failure
|
|
# `tryEval` wouldn't catch, wrecking accessing previous stages
|
|
# when there is a C compiler and everything should be fine.
|
|
then throw "no C compiler provided for this platform"
|
|
else if crossSystem.isDarwin
|
|
then buildPackages.llvmPackages.libcxxClang
|
|
else if crossSystem.useLLVM or false
|
|
then buildPackages.llvmPackages.clangUseLLVM
|
|
else buildPackages.gcc;
|
|
|
|
extraNativeBuildInputs = old.extraNativeBuildInputs
|
|
++ lib.optionals
|
|
(hostPlatform.isLinux && !buildPlatform.isLinux)
|
|
[ buildPackages.patchelf ]
|
|
++ lib.optional
|
|
(let f = p: !p.isx86 || builtins.elem p.libc [ "musl" "wasilibc" "relibc" ] || p.isiOS || p.isGenode;
|
|
in f hostPlatform && !(f buildPlatform) )
|
|
buildPackages.updateAutotoolsGnuConfigScriptsHook
|
|
# without proper `file` command, libtool sometimes fails
|
|
# to recognize 64-bit DLLs
|
|
++ lib.optional (hostPlatform.config == "x86_64-w64-mingw32") buildPackages.file
|
|
;
|
|
}));
|
|
})
|
|
|
|
]
|