libc++ only supports a limited range of Clang versions, so this was relying on the LLVM version corresponding to the one used in Swift’s fork. Since Swift builds its own LLVM 15 anyway, we can simply install the required libc++ headers along with it.
107 lines
3.0 KiB
Nix
107 lines
3.0 KiB
Nix
{
|
||
lib,
|
||
stdenv,
|
||
swift,
|
||
useSwiftDriver ? true,
|
||
swift-driver,
|
||
clang,
|
||
}:
|
||
|
||
stdenv.mkDerivation (
|
||
swift._wrapperParams
|
||
// {
|
||
pname = "swift-wrapper";
|
||
inherit (swift) version meta;
|
||
|
||
outputs = [
|
||
"out"
|
||
"man"
|
||
];
|
||
|
||
# Wrapper and setup hook variables.
|
||
inherit swift;
|
||
inherit (swift)
|
||
swiftOs
|
||
swiftArch
|
||
swiftModuleSubdir
|
||
swiftLibSubdir
|
||
swiftStaticModuleSubdir
|
||
swiftStaticLibSubdir
|
||
;
|
||
swiftDriver = lib.optionalString useSwiftDriver "${swift-driver}/bin/swift-driver";
|
||
cc_wrapper = clang.override (prev: {
|
||
extraBuildCommands =
|
||
prev.extraBuildCommands
|
||
# We need to use the resource directory corresponding to Swift’s
|
||
# version of Clang instead of passing along the one from the
|
||
# `cc-wrapper` flags.
|
||
+ ''
|
||
rm -r $out/resource-root
|
||
substituteInPlace $out/nix-support/cc-cflags \
|
||
--replace-fail \
|
||
"-resource-dir=$out/resource-root" \
|
||
"-resource-dir=${lib.getLib swift}/lib/swift/clang"
|
||
''
|
||
# We need the libc++ headers corresponding to the LLVM version of
|
||
# Swift’s Clang.
|
||
+ lib.optionalString (clang.libcxx != null) ''
|
||
include -isystem "${lib.getDev swift}/include/c++/v1" > $out/nix-support/libcxx-cxxflags
|
||
'';
|
||
});
|
||
|
||
env.darwinMinVersion = lib.optionalString stdenv.targetPlatform.isDarwin (
|
||
stdenv.targetPlatform.darwinMinVersion
|
||
);
|
||
|
||
passAsFile = [ "buildCommand" ];
|
||
buildCommand = ''
|
||
mkdir -p $out/bin $out/nix-support
|
||
|
||
# Symlink all Swift binaries first.
|
||
# NOTE: This specifically omits clang binaries. We want to hide these for
|
||
# private use by Swift only.
|
||
ln -s -t $out/bin/ $swift/bin/swift*
|
||
|
||
# Replace specific binaries with wrappers.
|
||
for executable in swift swiftc swift-frontend; do
|
||
export prog=$swift/bin/$executable
|
||
rm $out/bin/$executable
|
||
substituteAll '${./wrapper.sh}' $out/bin/$executable
|
||
chmod a+x $out/bin/$executable
|
||
done
|
||
|
||
${lib.optionalString useSwiftDriver ''
|
||
# Symlink swift-driver executables.
|
||
ln -s -t $out/bin/ ${swift-driver}/bin/*
|
||
''}
|
||
|
||
ln -s ${swift.man} $man
|
||
|
||
# This link is here because various tools (swiftpm) check for stdlib
|
||
# relative to the swift compiler. It's fine if this is for build-time
|
||
# stuff, but we should patch all cases were it would end up in an output.
|
||
ln -s ${swift.lib}/lib $out/lib
|
||
|
||
substituteAll ${./setup-hook.sh} $out/nix-support/setup-hook
|
||
|
||
# Propagate any propagated inputs from the unwrapped Swift compiler, if any.
|
||
if [ -e "$swift/nix-support" ]; then
|
||
for input in "$swift/nix-support/"*propagated*; do
|
||
cp "$input" "$out/nix-support/$(basename "$input")"
|
||
done
|
||
fi
|
||
'';
|
||
|
||
passthru = {
|
||
inherit swift;
|
||
inherit (swift)
|
||
swiftOs
|
||
swiftArch
|
||
swiftModuleSubdir
|
||
swiftLibSubdir
|
||
tests
|
||
;
|
||
};
|
||
}
|
||
)
|