core/pkgs/stdenv/cross/default.nix
2024-06-30 09:12:46 +01:00

120 lines
3.5 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 compatibility
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.clang
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;
})
);
}
)
]