nixpkgs/pkgs/development/compilers/swift/default.nix
2024-10-10 17:24:27 -04:00

102 lines
3.2 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.

{ lib
, pkgs
, newScope
, darwin
, llvmPackages
, llvmPackages_15
, overrideCC
, overrideLibcxx
}:
let
swiftLlvmPackages = llvmPackages_15;
self = rec {
callPackage = newScope self;
# Current versions of Swift on Darwin require macOS SDK 10.15 at least.
# The Swift compiler propagates the 13.3 SDK and a 10.15 deployment target.
# Packages that need a newer version can add it to their build inputs
# to use it (as normal).
# This SDK is included for compatibility with existing packages.
apple_sdk = pkgs.darwin.apple_sdk_11_0;
# Swift builds its own Clang for internal use. We wrap that clang with a
# cc-wrapper derived from the clang configured below. Because cc-wrapper
# applies a specific resource-root, the two versions are best matched, or
# we'll often run into compilation errors.
#
# The following selects the correct Clang version, matching the version
# used in Swift.
inherit (swiftLlvmPackages) clang;
# Overrides that create a useful environment for swift packages, allowing
# packaging with `swiftPackages.callPackage`.
inherit (clang) bintools;
stdenv =
let
stdenv' = overrideCC pkgs.stdenv clang;
in
# Ensure that Swifts internal clang uses the same libc++ and libc++abi as the
# default clangs stdenv. Using the default libc++ avoids issues (such as crashes)
# that can happen when a Swift application dynamically links different versions
# of libc++ and libc++abi than libraries it links are using.
if stdenv'.cc.libcxx != null then overrideLibcxx stdenv' else stdenv';
swift-unwrapped = callPackage ./compiler {
inherit (darwin) DarwinTools sigtool;
};
swiftNoSwiftDriver = callPackage ./wrapper {
swift = swift-unwrapped;
useSwiftDriver = false;
};
Dispatch = if stdenv.hostPlatform.isDarwin
then null # part of apple-sdk
else callPackage ./libdispatch { swift = swiftNoSwiftDriver; };
Foundation = if stdenv.hostPlatform.isDarwin
then null # part of apple-sdk
else callPackage ./foundation { swift = swiftNoSwiftDriver; };
# TODO: Apple distributes a binary XCTest with Xcode, but it is not part of
# CLTools (or SUS), so would have to figure out how to fetch it. The binary
# version has several extra features, like a test runner and ObjC support.
XCTest = callPackage ./xctest {
inherit (darwin) DarwinTools;
swift = swiftNoSwiftDriver;
};
swiftpm = callPackage ./swiftpm {
inherit (darwin) DarwinTools;
inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
swift = swiftNoSwiftDriver;
};
swift-driver = callPackage ./swift-driver {
swift = swiftNoSwiftDriver;
};
swift = callPackage ./wrapper {
swift = swift-unwrapped;
};
sourcekit-lsp = callPackage ./sourcekit-lsp {
inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
};
swift-docc = callPackage ./swift-docc {
inherit (apple_sdk.frameworks) CryptoKit LocalAuthentication;
};
swift-format = callPackage ./swift-format { };
swiftpm2nix = callPackage ./swiftpm2nix { };
};
in self