1{ lib
2, pkgs
3, newScope
4, darwin
5, llvmPackages_15
6, overrideCC
7}:
8
9let
10 self = rec {
11
12 callPackage = newScope self;
13
14 # Current versions of Swift on Darwin require macOS SDK 10.15 at least.
15 # Re-export this so we can rely on the minimum Swift SDK elsewhere.
16 apple_sdk = pkgs.darwin.apple_sdk_11_0;
17
18 # Swift builds its own Clang for internal use. We wrap that clang with a
19 # cc-wrapper derived from the clang configured below. Because cc-wrapper
20 # applies a specific resource-root, the two versions are best matched, or
21 # we'll often run into compilation errors.
22 #
23 # The following selects the correct Clang version, matching the version
24 # used in Swift, and applies the same libc overrides as `apple_sdk.stdenv`.
25 clang = if pkgs.stdenv.isDarwin
26 then
27 llvmPackages_15.clang.override rec {
28 libc = apple_sdk.Libsystem;
29 bintools = pkgs.bintools.override { inherit libc; };
30 }
31 else
32 llvmPackages_15.clang;
33
34 # Overrides that create a useful environment for swift packages, allowing
35 # packaging with `swiftPackages.callPackage`. These are similar to
36 # `apple_sdk_11_0.callPackage`, with our clang on top.
37 inherit (clang) bintools;
38 stdenv = overrideCC pkgs.stdenv clang;
39 darwin = pkgs.darwin.overrideScope (_: prev: {
40 inherit apple_sdk;
41 inherit (apple_sdk) Libsystem LibsystemCross libcharset libunwind objc4 configd IOKit Security;
42 CF = apple_sdk.CoreFoundation;
43 });
44 xcodebuild = pkgs.xcbuild.override {
45 inherit (apple_sdk.frameworks) CoreServices CoreGraphics ImageIO;
46 inherit stdenv;
47 sdkVer = "10.15";
48 };
49 xcbuild = xcodebuild;
50
51 swift-unwrapped = callPackage ./compiler {
52 inherit (darwin) DarwinTools cctools sigtool;
53 inherit (apple_sdk) MacOSX-SDK CLTools_Executables;
54 inherit (apple_sdk.frameworks) CoreServices Foundation Combine;
55 };
56
57 swiftNoSwiftDriver = callPackage ./wrapper {
58 swift = swift-unwrapped;
59 useSwiftDriver = false;
60 };
61
62 Dispatch = if stdenv.isDarwin
63 then null # part of libsystem
64 else callPackage ./libdispatch { swift = swiftNoSwiftDriver; };
65
66 Foundation = if stdenv.isDarwin
67 then apple_sdk.frameworks.Foundation
68 else callPackage ./foundation { swift = swiftNoSwiftDriver; };
69
70 # TODO: Apple distributes a binary XCTest with Xcode, but it is not part of
71 # CLTools (or SUS), so would have to figure out how to fetch it. The binary
72 # version has several extra features, like a test runner and ObjC support.
73 XCTest = callPackage ./xctest {
74 inherit (darwin) DarwinTools;
75 swift = swiftNoSwiftDriver;
76 };
77
78 swiftpm = callPackage ./swiftpm {
79 inherit (darwin) DarwinTools cctools;
80 inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
81 swift = swiftNoSwiftDriver;
82 };
83
84 swift-driver = callPackage ./swift-driver {
85 swift = swiftNoSwiftDriver;
86 };
87
88 swift = callPackage ./wrapper {
89 swift = swift-unwrapped;
90 };
91
92 sourcekit-lsp = callPackage ./sourcekit-lsp {
93 inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
94 };
95
96 swift-docc = callPackage ./swift-docc {
97 inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
98 };
99
100 swift-format = callPackage ./swift-format { };
101
102 };
103
104in self