nixpkgs/pkgs/stdenv/darwin
Randy Eckenrode 71c6ee9295
darwin.stdenv: add sdkRoot to extraNativeBuildInputs
Setting the SDK root by default allows `overrideSDK` to correctly set
the SDK version when using a different SDK. It also allows the correct
SDK version to be set when using an older deployment target. Not setting
the correct SDK version can result in unexpected behavior at runtime.

Examples:

* Automatic dark mode switching requires linking against an SDK version
  of 10.14 or newer. With the current behavior, the only way to do this
  is by using a 10.14+ deployment target even when the application
  supports older platforms when build with a newer SDK.
* MetalD3D checks that the system version is at least 14.0. The API it
  uses returns a compatibility version when the the SDK is older than
  11.0, which causes it to display an error and terminate the
  application even when even when its requirements are all met.
2024-03-29 10:07:50 -04:00
..
bootstrap-files stdenv.darwin: bootstrap darwin using updated tools 2024-03-22 13:27:27 +00:00
default.nix darwin.stdenv: add sdkRoot to extraNativeBuildInputs 2024-03-29 10:07:50 -04:00
make-bootstrap-tools.nix stdenv.darwin: bootstrap darwin using updated tools 2024-03-22 13:27:27 +00:00
override-sdk.nix overrideSDK: support all deps attributes 2024-03-29 10:03:08 -04:00
portable-libsystem.sh darwin.stdenv: only run install_name_tool on files 2023-07-08 20:49:50 -06:00
README.md darwin.stdenv: refactor stdenv definition 2023-07-02 17:56:24 -04:00

Darwin stdenv design goals

There are two more goals worth calling out explicitly:

  1. The standard environment should build successfully with sandboxing enabled on Darwin. It is fine if a package requires a sandboxProfile to build, but it should not be necessary to disable the sandbox to build the stdenv successfully; and
  2. The output should depend weakly on the bootstrap tools. Historically, Darwin required updating the bootstrap tools prior to updating the version of LLVM used in the standard environment. By not depending on a specific version, the LLVM used on Darwin can be updated simply by bumping the definition of llvmPackages in all-packages.nix.

Updating the stdenv

There are effectively two steps when updating the standard environment:

  1. Update the definition of llvmPackages in all-packages.nix for Darwin to match the value of llvmPackages.latest in all-packages.nix. Timing-wise, this done currently using the spring release of LLVM and once llvmPackages.latest has been updated to match. If the LLVM project has announced a release schedule of patch updates, wait until those are in nixpkgs. Otherwise, the LLVM updates will have to go through staging instead of being merged into master; and
  2. Fix the resulting breakage. Most things break due to additional warnings being turned into errors or additional strictness applied by LLVM. Fixes may come in the form of disabling those new warnings or by fixing the actual source (e.g., with a patch or update upstream). If the fix is trivial (e.g., adding a missing int to an implicit declaration), it is better to fix the problem instead of silencing the warning.