nixpkgs/pkgs/by-name/ap/apple-sdk/package.nix
Randy Eckenrode e166c9bb94
apple-sdk: only rewrite old SDK paths
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.
2024-11-03 08:53:29 -05:00

125 lines
4.3 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 ];
};
})
)