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
|
|||
|
|
;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
)
|