mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-05 13:23:17 +00:00
e166c9bb94
Rewriting SDK paths is only needed when a text-based stub is an umbrella framework that does not include the contents of the stubs for the libraries re-exported by the framework. This is only the case for older SDKs. Once macOS introduced the dyld cache (and removed system dylibs) in 11.0, all umbrella frameworks in the SDK include the contents of their re-exported stubs. While rewriting newer SDKs is mostly harmless, it breaks Zig, which tries to interpret the paths relative to the SDKROOT.
125 lines
4.3 KiB
Nix
125 lines
4.3 KiB
Nix
let
|
||
sdkVersions = builtins.fromJSON (builtins.readFile ./metadata/versions.json);
|
||
in
|
||
|
||
{
|
||
lib,
|
||
stdenv,
|
||
stdenvNoCC,
|
||
substitute,
|
||
|
||
# Specifies the major version used for the SDK. Uses `hostPlatform.darwinSdkVersion` by default.
|
||
darwinSdkMajorVersion ? (
|
||
if lib.versionOlder stdenv.hostPlatform.darwinSdkVersion "11" then
|
||
lib.versions.majorMinor stdenv.hostPlatform.darwinSdkVersion
|
||
else
|
||
lib.versions.major stdenv.hostPlatform.darwinSdkVersion
|
||
),
|
||
# Enabling bootstrap disables propagation. Defaults to `false` (meaning to propagate certain packages and `xcrun`)
|
||
# except in stage0 of the Darwin stdenv bootstrap.
|
||
enableBootstrap ? stdenv.name == "bootstrap-stage0-stdenv-darwin",
|
||
|
||
# Required by various phases
|
||
callPackage,
|
||
jq,
|
||
}:
|
||
|
||
let
|
||
sdkInfo =
|
||
sdkVersions.${darwinSdkMajorVersion}
|
||
or (lib.throw "Unsupported SDK major version: ${darwinSdkMajorVersion}");
|
||
sdkVersion = sdkInfo.version;
|
||
|
||
fetchSDK = callPackage ./common/fetch-sdk.nix { };
|
||
|
||
phases = lib.composeManyExtensions (
|
||
[
|
||
(callPackage ./common/add-core-symbolication.nix { })
|
||
(callPackage ./common/derivation-options.nix { })
|
||
(callPackage ./common/passthru-private-frameworks.nix { inherit sdkVersion; })
|
||
(callPackage ./common/passthru-source-release-files.nix { inherit sdkVersion; })
|
||
(callPackage ./common/remove-disallowed-packages.nix { })
|
||
]
|
||
# Only process stubs and convert them to tbd-v4 if jq is available. This can be made unconditional once
|
||
# the bootstrap tools have jq and libtapi.
|
||
++ lib.optional (jq != null) (callPackage ./common/process-stubs.nix { })
|
||
# Avoid infinite recursions by not propagating certain packages, so they can themselves build with the SDK.
|
||
++ lib.optionals (!enableBootstrap) [
|
||
(callPackage ./common/propagate-inputs.nix { })
|
||
(callPackage ./common/propagate-xcrun.nix { })
|
||
]
|
||
# Older SDKs do not include the libraries re-exported from umbrella frameworks in the umbrellas’ stubs, which causes
|
||
# link failures for those libraries unless their paths have been rewritten to point to the store.
|
||
++ lib.optionals (lib.versionOlder sdkVersion "11.0") [
|
||
(callPackage ./common/rewrite-sdk-paths.nix { inherit sdkVersion; })
|
||
]
|
||
# This has to happen last.
|
||
++ [
|
||
(callPackage ./common/run-build-phase-hooks.nix { })
|
||
]
|
||
);
|
||
in
|
||
stdenvNoCC.mkDerivation (
|
||
lib.extends phases (finalAttrs: {
|
||
pname = "apple-sdk";
|
||
inherit (sdkInfo) version;
|
||
|
||
src = fetchSDK sdkInfo;
|
||
|
||
dontConfigure = true;
|
||
|
||
strictDeps = true;
|
||
|
||
setupHooks = [
|
||
# `role.bash` is copied from `../build-support/setup-hooks/role.bash` due to the requirements not to reference
|
||
# paths outside the package when it is in `by-name`. It needs to be kept in sync, but it fortunately does not
|
||
# change often. Once `build-support` is available as a package (or some other mechanism), it should be changed
|
||
# to whatever that replacement is.
|
||
./setup-hooks/role.bash
|
||
(substitute {
|
||
src = ./setup-hooks/sdk-hook.sh;
|
||
substitutions = [
|
||
"--subst-var-by"
|
||
"sdkVersion"
|
||
(lib.escapeShellArgs (lib.splitVersion sdkVersion))
|
||
];
|
||
})
|
||
];
|
||
|
||
installPhase =
|
||
let
|
||
sdkName = "MacOSX${lib.versions.majorMinor sdkVersion}.sdk";
|
||
sdkMajor = lib.versions.major sdkVersion;
|
||
in
|
||
''
|
||
runHook preInstall
|
||
|
||
mkdir -p "$sdkpath"
|
||
|
||
cp -rd . "$sdkpath/${sdkName}"
|
||
${lib.optionalString (lib.versionAtLeast finalAttrs.version "11.0") ''
|
||
ln -s "${sdkName}" "$sdkpath/MacOSX${sdkMajor}.sdk"
|
||
''}
|
||
ln -s "${sdkName}" "$sdkpath/MacOSX.sdk"
|
||
|
||
runHook postInstall
|
||
'';
|
||
|
||
passthru = {
|
||
sdkroot = finalAttrs.finalPackage + "/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk";
|
||
};
|
||
|
||
__structuredAttrs = true;
|
||
|
||
meta = {
|
||
description = "Frameworks and libraries required for building packages on Darwin";
|
||
homepage = "https://developer.apple.com";
|
||
maintainers = lib.teams.darwin.members;
|
||
platforms = lib.platforms.darwin;
|
||
badPlatforms =
|
||
lib.optionals (lib.versionAtLeast sdkVersion "10.15") [ lib.systems.inspect.patterns.is32bit ]
|
||
++ lib.optionals (lib.versionOlder sdkVersion "11.0") [ lib.systems.inspect.patterns.isAarch ];
|
||
};
|
||
})
|
||
)
|