From efdf4e9d1f05d6587230d1b71fab1e5000bed22a Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Sun, 23 Jul 2023 20:40:26 -0400 Subject: [PATCH] swift: use stdenv libc++ on Darwin Swift uses libc++ 15, but it should really be using the same libc++ from the stdenv. While not strictly needed currently, Swift 5.9 will support C++ interop. If Swift is not using the stdenv C++, any C++ library used with interop would need to be rebuilt against the Swift libc++. --- pkgs/development/compilers/swift/default.nix | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pkgs/development/compilers/swift/default.nix b/pkgs/development/compilers/swift/default.nix index 2df883095cf1..0da2510f09a0 100644 --- a/pkgs/development/compilers/swift/default.nix +++ b/pkgs/development/compilers/swift/default.nix @@ -2,11 +2,14 @@ , pkgs , newScope , darwin +, llvmPackages , llvmPackages_15 , overrideCC }: let + swiftLlvmPackages = llvmPackages_15; + self = rec { callPackage = newScope self; @@ -24,12 +27,25 @@ let # used in Swift, and applies the same libc overrides as `apple_sdk.stdenv`. clang = if pkgs.stdenv.isDarwin then - llvmPackages_15.clang.override rec { + swiftLlvmPackages.clang.override rec { libc = apple_sdk.Libsystem; bintools = pkgs.bintools.override { inherit libc; }; + # Ensure that Swift’s internal clang uses the same libc++ and libc++abi as the + # default Darwin 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. + inherit (llvmPackages) libcxx; + extraPackages = [ + llvmPackages.libcxxabi + # Use the compiler-rt associated with clang, but use the libc++abi from the stdenv + # to avoid linking against two different versions (for the same reasons as above). + (swiftLlvmPackages.compiler-rt.override { + inherit (llvmPackages) libcxxabi; + }) + ]; } else - llvmPackages_15.clang; + swiftLlvmPackages.clang; # Overrides that create a useful environment for swift packages, allowing # packaging with `swiftPackages.callPackage`. These are similar to