Home Explore Blog Models CI



nixpkgs

6th chunk of `doc/stdenv/platform-notes.chapter.md`
c8fb0c480c614f110a07f2a4eedf237890683282658ad1160000000100000d2c
All packages in `darwin.apple_sdk`, `darwin.apple_sdk_11_0`, and `darwin.apple_sdk_12_3` have been removed.
If your derivation references them, you should delete those references, as the default SDK should be enough to build your package.

Note: the new SDK pattern uses the name `apple-sdk` to better align with Nixpkgs naming conventions.
The legacy SDK pattern uses `apple_sdk`.
You always know you are using the old SDK pattern if the name is `apple_sdk`.

Some derivations may depend on the location of frameworks in those old packages.
To update your derivation to find them in the new SDK, use `$SDKROOT` instead in `preConfigure`.
For example, if you substitute `${darwin.apple_sdk.frameworks.OpenGL}/Library/Frameworks/OpenGL.framework` in `postPatch`, replace it with `$SDKROOT/System/Library/Frameworks/OpenGL.framework` in `preConfigure`.

Note that if your derivation is changing a system path (such as `/System/Library/Frameworks/OpenGL.framework`), you may be able to remove the path.
Compilers and binutils targeting Darwin look for system paths in the SDK sysroot.
Some of them (such as Zig or `bindgen` for Rust) depend on it.

#### Updating legacy SDK overrides {#sec-darwin-legacy-frameworks-overrides}

The legacy SDK provided two ways of overriding the default SDK.
They have been removed along with the legacy SDKs.

- `pkgs.darwin.apple_sdk_11_0.callPackage` - this pattern was used to provide frameworks from the macOS 11 SDK.
  It is now the same as `callPackage`.
- `overrideSDK` - this stdenv adapter would try to replace the frameworks used by your derivation and its transitive dependencies.
  It added the `apple-sdk_12` package for `12.3` and did nothing for `11.0`.
  If `darwinMinVersion` is specified, it would add `darwinMinVersionHook` with the specified minimum version.
  No other SDK versions were supported.

### Darwin Cross-Compilation {#sec-darwin-legacy-cross-compilation}

Darwin supports cross-compilation between Darwin platforms.
Cross-compilation from Linux is not currently supported but may be supported in the future.
To cross-compile to Darwin, you can set `crossSystem` or use one of the Darwin systems in `pkgsCross`.
The `darwinMinVersionHook` and the SDKs support cross-compilation.
If you need to specify a different SDK version for a `depsBuildBuild` compiler, add it to your `nativeBuildInputs`.

```nix
stdenv.mkDerivation {
  name = "libfoo-1.2.3";
  # ...
  depsBuildBuild = [ buildPackages.stdenv.cc ];
  nativeBuildInputs = [ apple-sdk_12 ];
  buildInputs = [ apple-sdk_13 ];
  depsTargetTargetPropagated = [ apple-sdk_14 ];
}
# The build-build `clang` will use the 12.3 SDK while the package build itself will use the 13.3 SDK.
# Derivations that add this package as an input will have the 14.4 SDK propagated to them.
```

The different target SDK and hooks are mangled based on role:

- `DEVELOPER_DIR_FOR_BUILD` and `MACOSX_DEPLOYMENT_TARGET_FOR_BUILD` for the build platform;
- `DEVELOPER_DIR` and `MACOSX_DEPLOYMENT_TARGET` for the host platform; and
- `DEVELOPER_DIR_FOR_TARGET` and `MACOSX_DEPLOYMENT_TARGET_FOR_TARGET` for the build platform.

In static compilation situations, it is possible for the build and host platform to be the same platform but have different SDKs with the same version (one dynamic and one static).
cc-wrapper and bintools-wrapper take care of handling this distinction.

Title: Nixpkgs Darwin: Legacy SDK Deprecation, Overrides Removal, and Cross-Compilation
Summary
This document outlines significant changes to Darwin SDK handling in Nixpkgs, focusing on the deprecation and removal of legacy SDK packages (e.g., `darwin.apple_sdk`, `apple_sdk_11_0`). Users are instructed to update derivations by removing references to these old packages, adopting the new `apple-sdk` naming convention, and migrating framework path substitutions to use `$SDKROOT` in `preConfigure`. It also announces the removal of legacy SDK override methods like `pkgs.darwin.apple_sdk_11_0.callPackage` and `overrideSDK`. The text concludes by detailing Darwin-to-Darwin cross-compilation support, explaining how to configure it and manage distinct SDK versions for different build roles (build, host, target) using appropriate Nixpkgs inputs and role-specific environment variables.