about summary refs log tree commit diff
path: root/pkgs/development/compilers/swift/compiler/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/swift/compiler/default.nix')
-rw-r--r--pkgs/development/compilers/swift/compiler/default.nix708
1 files changed, 0 insertions, 708 deletions
diff --git a/pkgs/development/compilers/swift/compiler/default.nix b/pkgs/development/compilers/swift/compiler/default.nix
deleted file mode 100644
index 3576735d9dc7..000000000000
--- a/pkgs/development/compilers/swift/compiler/default.nix
+++ /dev/null
@@ -1,708 +0,0 @@
-{ lib
-, stdenv
-, callPackage
-, cmake
-, bash
-, coreutils
-, gnugrep
-, perl
-, ninja
-, pkg-config
-, clang
-, bintools
-, python3
-, git
-, fetchpatch
-, makeWrapper
-, gnumake
-, file
-, runCommand
-, writeShellScriptBin
-# For lldb
-, libedit
-, ncurses
-, swig
-, libxml2
-# Linux-specific
-, glibc
-, libuuid
-# Darwin-specific
-, substituteAll
-, fixDarwinDylibNames
-, runCommandLocal
-, xcbuild
-, cctools # libtool
-, sigtool
-, DarwinTools
-, CoreServices
-, Foundation
-, Combine
-, MacOSX-SDK
-, CLTools_Executables
-}:
-
-let
-
-  inherit (stdenv) hostPlatform targetPlatform;
-
-  sources = callPackage ../sources.nix { };
-
-  # Tools invoked by swift at run-time.
-  runtimeDeps = lib.optionals stdenv.isDarwin [
-    # libtool is used for static linking. This is part of cctools, but adding
-    # that as a build input puts an unwrapped linker in PATH, and breaks
-    # builds. This small derivation exposes just libtool.
-    # NOTE: The same applies to swift-driver, but that is currently always
-    # invoked via the old `swift` / `swiftc`. May change in the future.
-    (runCommandLocal "libtool" { } ''
-      mkdir -p $out/bin
-      ln -s ${cctools}/bin/libtool $out/bin/libtool
-    '')
-  ];
-
-  # There are apparently multiple naming conventions on Darwin. Swift uses the
-  # xcrun naming convention. See `configure_sdk_darwin` calls in CMake files.
-  swiftOs = if targetPlatform.isDarwin
-    then {
-      "macos" = "macosx";
-      "ios" = "iphoneos";
-      #iphonesimulator
-      #appletvos
-      #appletvsimulator
-      #watchos
-      #watchsimulator
-    }.${targetPlatform.darwinPlatform}
-      or (throw "Cannot build Swift for target Darwin platform '${targetPlatform.darwinPlatform}'")
-    else targetPlatform.parsed.kernel.name;
-
-  # Apple Silicon uses a different CPU name in the target triple.
-  swiftArch = if stdenv.isDarwin && stdenv.isAarch64 then "arm64"
-    else targetPlatform.parsed.cpu.name;
-
-  # On Darwin, a `.swiftmodule` is a subdirectory in `lib/swift/<OS>`,
-  # containing binaries for supported archs. On other platforms, binaries are
-  # installed to `lib/swift/<OS>/<ARCH>`. Note that our setup-hook also adds
-  # `lib/swift` for convenience.
-  swiftLibSubdir = "lib/swift/${swiftOs}";
-  swiftModuleSubdir = if hostPlatform.isDarwin
-    then "lib/swift/${swiftOs}"
-    else "lib/swift/${swiftOs}/${swiftArch}";
-
-  # And then there's also a separate subtree for statically linked  modules.
-  toStaticSubdir = lib.replaceStrings [ "/swift/" ] [ "/swift_static/" ];
-  swiftStaticLibSubdir = toStaticSubdir swiftLibSubdir;
-  swiftStaticModuleSubdir = toStaticSubdir swiftModuleSubdir;
-
-  # This matches _SWIFT_DEFAULT_COMPONENTS, with specific components disabled.
-  swiftInstallComponents = [
-    "autolink-driver"
-    "compiler"
-    # "clang-builtin-headers"
-    "stdlib"
-    "sdk-overlay"
-    "static-mirror-lib"
-    "editor-integration"
-    # "tools"
-    # "testsuite-tools"
-    "toolchain-tools"
-    "toolchain-dev-tools"
-    "license"
-    (if stdenv.isDarwin then "sourcekit-xpc-service" else "sourcekit-inproc")
-    "swift-remote-mirror"
-    "swift-remote-mirror-headers"
-  ];
-
-  # Build a tool used during the build to create a custom clang wrapper, with
-  # which we wrap the clang produced by the swift build.
-  #
-  # This is used in a `POST_BUILD` for the CMake target, so we rename the
-  # actual clang to clang-unwrapped, then put the wrapper in place.
-  #
-  # We replace the `exec ...` command with `exec -a "$0"` in order to
-  # preserve $0 for clang. This is because, unlike Nix, we don't have
-  # separate wrappers for clang/clang++, and clang uses $0 to detect C++.
-  #
-  # Similarly, the C++ detection in the wrapper itself also won't work for us,
-  # so we base it on $0 as well.
-  makeClangWrapper = writeShellScriptBin "nix-swift-make-clang-wrapper" ''
-    set -euo pipefail
-
-    targetFile="$1"
-    unwrappedClang="$targetFile-unwrapped"
-
-    mv "$targetFile" "$unwrappedClang"
-    sed < '${clang}/bin/clang' > "$targetFile" \
-      -e 's|^\s*exec|exec -a "$0"|g' \
-      -e 's|^\[\[ "${clang.cc}/bin/clang" = \*++ ]]|[[ "$0" = *++ ]]|' \
-      -e "s|${clang.cc}/bin/clang|$unwrappedClang|g" \
-      -e "s|^\(\s*\)\($unwrappedClang\) \"@\\\$responseFile\"|\1argv0=\$0\n\1${bash}/bin/bash -c \"exec -a '\$argv0' \2 '@\$responseFile'\"|"
-    chmod a+x "$targetFile"
-  '';
-
-  # Create a tool used during the build to create a custom swift wrapper for
-  # each of the swift executables produced by the build.
-  #
-  # The build produces several `swift-frontend` executables during
-  # bootstrapping. Each of these has numerous aliases via symlinks, and the
-  # executable uses $0 to detect what tool is called.
-  wrapperParams = {
-    inherit bintools;
-    default_cc_wrapper = clang; # Instead of `@out@` in the original.
-    coreutils_bin = lib.getBin coreutils;
-    gnugrep_bin = gnugrep;
-    suffixSalt = lib.replaceStrings ["-" "."] ["_" "_"] targetPlatform.config;
-    use_response_file_by_default = 1;
-    swiftDriver = "";
-    # NOTE: @prog@ needs to be filled elsewhere.
-  };
-  swiftWrapper = runCommand "swift-wrapper.sh" wrapperParams ''
-    substituteAll '${../wrapper/wrapper.sh}' "$out"
-  '';
-  makeSwiftcWrapper = writeShellScriptBin "nix-swift-make-swift-wrapper" ''
-    set -euo pipefail
-
-    targetFile="$1"
-    unwrappedSwift="$targetFile-unwrapped"
-
-    mv "$targetFile" "$unwrappedSwift"
-    sed < '${swiftWrapper}' > "$targetFile" \
-      -e "s|@prog@|'$unwrappedSwift'|g" \
-      -e 's|exec "$prog"|exec -a "$0" "$prog"|g'
-    chmod a+x "$targetFile"
-  '';
-
-  # On Darwin, we need to use BOOTSTRAPPING-WITH-HOSTLIBS because of ABI
-  # stability, and have to provide the definitions for the system stdlib.
-  appleSwiftCore = stdenv.mkDerivation {
-    name = "apple-swift-core";
-    dontUnpack = true;
-
-    installPhase = ''
-      mkdir -p $out/lib/swift
-      cp -r \
-        "${MacOSX-SDK}/usr/lib/swift/Swift.swiftmodule" \
-        "${MacOSX-SDK}/usr/lib/swift/libswiftCore.tbd" \
-        $out/lib/swift/
-    '';
-  };
-
-in stdenv.mkDerivation {
-  pname = "swift";
-  inherit (sources) version;
-
-  outputs = [ "out" "lib" "dev" "doc" "man" ];
-
-  nativeBuildInputs = [
-    cmake
-    git
-    ninja
-    perl # pod2man
-    pkg-config
-    python3
-    makeWrapper
-    makeClangWrapper
-    makeSwiftcWrapper
-  ]
-    ++ lib.optionals stdenv.isDarwin [
-      xcbuild
-      sigtool # codesign
-      DarwinTools # sw_vers
-      fixDarwinDylibNames
-    ];
-
-  buildInputs = [
-    # For lldb
-    python3
-    swig
-    libxml2
-  ]
-    ++ lib.optionals stdenv.isLinux [
-      libuuid
-    ]
-    ++ lib.optionals stdenv.isDarwin [
-      CoreServices
-      Foundation
-      Combine
-    ];
-
-  # This is a partial reimplementation of our setup hook. Because we reuse
-  # the Swift wrapper for the Swift build itself, we need to do some of the
-  # same preparation.
-  postHook = ''
-    for pkg in "''${pkgsHostTarget[@]}" '${clang.libc}'; do
-      for subdir in ${swiftModuleSubdir} ${swiftStaticModuleSubdir} lib/swift; do
-        if [[ -d "$pkg/$subdir" ]]; then
-          export NIX_SWIFTFLAGS_COMPILE+=" -I $pkg/$subdir"
-        fi
-      done
-      for subdir in ${swiftLibSubdir} ${swiftStaticLibSubdir} lib/swift; do
-        if [[ -d "$pkg/$subdir" ]]; then
-          export NIX_LDFLAGS+=" -L $pkg/$subdir"
-        fi
-      done
-    done
-  '';
-
-  # We invoke cmakeConfigurePhase multiple times, but only need this once.
-  dontFixCmake = true;
-  # We setup custom build directories.
-  dontUseCmakeBuildDir = true;
-
-  unpackPhase = let
-    copySource = repo: "cp -r ${sources.${repo}} ${repo}";
-  in ''
-    mkdir src
-    cd src
-
-    ${copySource "swift-cmark"}
-    ${copySource "llvm-project"}
-    ${copySource "swift"}
-    ${copySource "swift-experimental-string-processing"}
-    ${copySource "swift-syntax"}
-    ${lib.optionalString
-      (!stdenv.isDarwin)
-      (copySource "swift-corelibs-libdispatch")}
-
-    chmod -R u+w .
-  '';
-
-  patchPhase = ''
-    # Just patch all the things for now, we can focus this later.
-    # TODO: eliminate use of env.
-    find -type f -print0 | xargs -0 sed -i \
-    ${lib.optionalString stdenv.isDarwin
-      "-e 's|/usr/libexec/PlistBuddy|${xcbuild}/bin/PlistBuddy|g'"} \
-      -e 's|/usr/bin/env|${coreutils}/bin/env|g' \
-      -e 's|/usr/bin/make|${gnumake}/bin/make|g' \
-      -e 's|/bin/mkdir|${coreutils}/bin/mkdir|g' \
-      -e 's|/bin/cp|${coreutils}/bin/cp|g' \
-      -e 's|/usr/bin/file|${file}/bin/file|g'
-
-    patch -p1 -d swift -i ${./patches/swift-cmake-3.25-compat.patch}
-    patch -p1 -d swift -i ${./patches/swift-wrap.patch}
-    patch -p1 -d swift -i ${./patches/swift-nix-resource-root.patch}
-    patch -p1 -d swift -i ${./patches/swift-linux-fix-libc-paths.patch}
-    patch -p1 -d swift -i ${./patches/swift-linux-fix-linking.patch}
-    patch -p1 -d swift -i ${./patches/swift-darwin-libcxx-flags.patch}
-    patch -p1 -d swift -i ${substituteAll {
-      src = ./patches/swift-darwin-plistbuddy-workaround.patch;
-      inherit swiftArch;
-    }}
-    patch -p1 -d swift -i ${substituteAll {
-      src = ./patches/swift-prevent-sdk-dirs-warning.patch;
-      inherit (builtins) storeDir;
-    }}
-
-    # This patch needs to know the lib output location, so must be substituted
-    # in the same derivation as the compiler.
-    storeDir="${builtins.storeDir}" \
-      substituteAll ${./patches/swift-separate-lib.patch} $TMPDIR/swift-separate-lib.patch
-    patch -p1 -d swift -i $TMPDIR/swift-separate-lib.patch
-
-    patch -p1 -d llvm-project/llvm -i ${./patches/llvm-module-cache.patch}
-
-    patch -p1 -d llvm-project/clang -i ${./patches/clang-toolchain-dir.patch}
-    patch -p1 -d llvm-project/clang -i ${./patches/clang-wrap.patch}
-    patch -p1 -d llvm-project/clang -i ${../../llvm/14/clang/purity.patch}
-    patch -p2 -d llvm-project/clang -i ${fetchpatch {
-      name = "clang-cmake-fix-interpreter.patch";
-      url = "https://github.com/llvm/llvm-project/commit/b5eaf500f2441eff2277ea2973878fb1f171fd0a.patch";
-      sha256 = "1rma1al0rbm3s3ql6bnvbcighp74lri1lcrwbyacgdqp80fgw1b6";
-    }}
-
-   # gcc-13 build fixes
-    patch -p2 -d llvm-project/llvm -i ${fetchpatch {
-      name = "gcc-13.patch";
-      url = "https://github.com/llvm/llvm-project/commit/ff1681ddb303223973653f7f5f3f3435b48a1983.patch";
-      hash = "sha256-nkRPWx8gNvYr7mlvEUiOAb1rTrf+skCZjAydJVUHrcI=";
-    }}
-
-    ${lib.optionalString stdenv.isLinux ''
-    substituteInPlace llvm-project/clang/lib/Driver/ToolChains/Linux.cpp \
-      --replace 'SysRoot + "/lib' '"${glibc}/lib" "' \
-      --replace 'SysRoot + "/usr/lib' '"${glibc}/lib" "' \
-      --replace 'LibDir = "lib";' 'LibDir = "${glibc}/lib";' \
-      --replace 'LibDir = "lib64";' 'LibDir = "${glibc}/lib";' \
-      --replace 'LibDir = X32 ? "libx32" : "lib64";' 'LibDir = "${glibc}/lib";'
-
-    # uuid.h is not part of glibc, but of libuuid.
-    sed -i 's|''${GLIBC_INCLUDE_PATH}/uuid/uuid.h|${libuuid.dev}/include/uuid/uuid.h|' \
-      swift/stdlib/public/Platform/glibc.modulemap.gyb
-    ''}
-
-    # Remove tests for cross compilation, which we don't currently support.
-    rm swift/test/Interop/Cxx/class/constructors-copy-irgen-*.swift
-    rm swift/test/Interop/Cxx/class/constructors-irgen-*.swift
-
-    # TODO: consider fixing and re-adding. This test fails due to a non-standard "install_prefix".
-    rm swift/validation-test/Python/build_swift.swift
-
-    # We cannot handle the SDK location being in "Weird Location" due to Nix isolation.
-    rm swift/test/DebugInfo/compiler-flags.swift
-
-    # TODO: Fix issue with ld.gold invoked from script finding crtbeginS.o and crtendS.o.
-    rm swift/test/IRGen/ELF-remove-autolink-section.swift
-
-    # The following two tests fail because we use don't use the bundled libicu:
-    # [SOURCE_DIR/utils/build-script] ERROR: can't find source directory for libicu (tried /build/src/icu)
-    rm swift/validation-test/BuildSystem/default_build_still_performs_epilogue_opts_after_split.test
-    rm swift/validation-test/BuildSystem/test_early_swift_driver_and_infer.swift
-
-    # TODO: This test fails for some unknown reason
-    rm swift/test/Serialization/restrict-swiftmodule-to-revision.swift
-
-    # This test was flaky in ofborg, see #186476
-    rm swift/test/AutoDiff/compiler_crashers_fixed/issue-56649-missing-debug-scopes-in-pullback-trampoline.swift
-
-    patchShebangs .
-
-    ${lib.optionalString (!stdenv.isDarwin) ''
-    # NOTE: This interferes with ABI stability on Darwin, which uses the system
-    # libraries in the hardcoded path /usr/lib/swift.
-    fixCmakeFiles .
-    ''}
-  '';
-
-  configurePhase = ''
-    export SWIFT_SOURCE_ROOT="$PWD"
-    mkdir -p ../build
-    cd ../build
-    export SWIFT_BUILD_ROOT="$PWD"
-
-    # Most builds set a target, but LLDB doesn't. Harmless on non-Darwin.
-    export MACOSX_DEPLOYMENT_TARGET=10.15
-  '';
-
-  # These steps are derived from doing a normal build with.
-  #
-  #   ./swift/utils/build-toolchain test --dry-run
-  #
-  # But dealing with the custom Python build system is far more trouble than
-  # simply invoking CMake directly. Few variables it passes to CMake are
-  # actually required or non-default.
-  #
-  # Using CMake directly also allows us to split up the already large build,
-  # and package Swift components separately.
-  #
-  # Besides `--dry-run`, another good way to compare build changes between
-  # Swift releases is to diff the scripts:
-  #
-  #   git diff swift-5.6.3-RELEASE..swift-5.7-RELEASE -- utils/build*
-  #
-  buildPhase = ''
-    # Helper to build a subdirectory.
-    #
-    # Always reset cmakeFlags before calling this. The cmakeConfigurePhase
-    # amends flags and would otherwise keep expanding it.
-    function buildProject() {
-      mkdir -p $SWIFT_BUILD_ROOT/$1
-      cd $SWIFT_BUILD_ROOT/$1
-
-      cmakeDir=$SWIFT_SOURCE_ROOT/''${2-$1}
-      cmakeConfigurePhase
-
-      ninjaBuildPhase
-    }
-
-    cmakeFlags="-GNinja"
-    buildProject swift-cmark
-
-    # Some notes:
-    # - The Swift build just needs Clang.
-    # - We can further reduce targets to just our targetPlatform.
-    cmakeFlags="
-      -GNinja
-      -DLLVM_ENABLE_PROJECTS=clang
-      -DLLVM_TARGETS_TO_BUILD=${{
-        "x86_64" = "X86";
-        "aarch64" = "AArch64";
-      }.${targetPlatform.parsed.cpu.name}}
-    "
-    buildProject llvm llvm-project/llvm
-
-    '' + lib.optionalString stdenv.isDarwin ''
-    # Add appleSwiftCore to the search paths. We can't simply add it to
-    # buildInputs, because it is potentially an older stdlib than the one we're
-    # building. We have to remove it again after the main Swift build, or later
-    # build steps may fail. (Specific case: Concurrency backdeploy uses the
-    # Sendable protocol, which appears to not be present in the macOS 11 SDK.)
-    OLD_NIX_SWIFTFLAGS_COMPILE="$NIX_SWIFTFLAGS_COMPILE"
-    OLD_NIX_LDFLAGS="$NIX_LDFLAGS"
-    export NIX_SWIFTFLAGS_COMPILE+=" -I ${appleSwiftCore}/lib/swift"
-    export NIX_LDFLAGS+=" -L ${appleSwiftCore}/lib/swift"
-    '' + ''
-
-    # Some notes:
-    # - BOOTSTRAPPING_MODE defaults to OFF in CMake, but is enabled in standard
-    #   builds, so we enable it as well. On Darwin, we have to use the system
-    #   Swift libs because of ABI-stability, but this may be trouble if the
-    #   builder is an older macOS.
-    # - Experimental features are OFF by default in CMake, but are enabled in
-    #   official builds, so we do the same. (Concurrency is also required in
-    #   the stdlib. StringProcessing is often implicitely imported, causing
-    #   lots of warnings if missing.)
-    # - SWIFT_STDLIB_ENABLE_OBJC_INTEROP is set explicitely because its check
-    #   is buggy. (Uses SWIFT_HOST_VARIANT_SDK before initialized.)
-    #   Fixed in: https://github.com/apple/swift/commit/84083afef1de5931904d5c815d53856cdb3fb232
-    cmakeFlags="
-      -GNinja
-      -DBOOTSTRAPPING_MODE=BOOTSTRAPPING${lib.optionalString stdenv.isDarwin "-WITH-HOSTLIBS"}
-      -DSWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING=ON
-      -DSWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY=ON
-      -DSWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED=ON
-      -DSWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING=ON
-      -DLLVM_DIR=$SWIFT_BUILD_ROOT/llvm/lib/cmake/llvm
-      -DClang_DIR=$SWIFT_BUILD_ROOT/llvm/lib/cmake/clang
-      -DSWIFT_PATH_TO_CMARK_SOURCE=$SWIFT_SOURCE_ROOT/swift-cmark
-      -DSWIFT_PATH_TO_CMARK_BUILD=$SWIFT_BUILD_ROOT/swift-cmark
-      -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE=$SWIFT_SOURCE_ROOT/swift-corelibs-libdispatch
-      -DSWIFT_PATH_TO_SWIFT_SYNTAX_SOURCE=$SWIFT_SOURCE_ROOT/swift-syntax
-      -DSWIFT_PATH_TO_STRING_PROCESSING_SOURCE=$SWIFT_SOURCE_ROOT/swift-experimental-string-processing
-      -DSWIFT_INSTALL_COMPONENTS=${lib.concatStringsSep ";" swiftInstallComponents}
-      -DSWIFT_STDLIB_ENABLE_OBJC_INTEROP=${if stdenv.isDarwin then "ON" else "OFF"}
-    "
-    buildProject swift
-
-    '' + lib.optionalString stdenv.isDarwin ''
-    # Restore search paths to remove appleSwiftCore.
-    export NIX_SWIFTFLAGS_COMPILE="$OLD_NIX_SWIFTFLAGS_COMPILE"
-    export NIX_LDFLAGS="$OLD_NIX_LDFLAGS"
-    '' + ''
-
-    # These are based on flags in `utils/build-script-impl`.
-    #
-    # LLDB_USE_SYSTEM_DEBUGSERVER=ON disables the debugserver build on Darwin,
-    # which requires a special signature.
-    #
-    # CMAKE_BUILD_WITH_INSTALL_NAME_DIR ensures we don't use rpath on Darwin.
-    #
-    # NOTE: On Darwin, we only want ncurses in the linker search path, because
-    # headers are part of libsystem. Adding its headers to the search path
-    # causes strange mixing and errors. Note that libedit propagates ncurses,
-    # so we add both manually here, instead of relying on setup hooks.
-    # TODO: Find a better way to prevent this conflict.
-    cmakeFlags="
-      -GNinja
-      -DLLDB_SWIFTC=$SWIFT_BUILD_ROOT/swift/bin/swiftc
-      -DLLDB_SWIFT_LIBS=$SWIFT_BUILD_ROOT/swift/lib/swift
-      -DLLVM_DIR=$SWIFT_BUILD_ROOT/llvm/lib/cmake/llvm
-      -DClang_DIR=$SWIFT_BUILD_ROOT/llvm/lib/cmake/clang
-      -DSwift_DIR=$SWIFT_BUILD_ROOT/swift/lib/cmake/swift
-      -DLLDB_ENABLE_CURSES=ON
-      -DLLDB_ENABLE_LIBEDIT=ON
-      -DLLDB_ENABLE_PYTHON=ON
-      -DLLDB_ENABLE_LZMA=OFF
-      -DLLDB_ENABLE_LUA=OFF
-      -DLLDB_INCLUDE_TESTS=OFF
-      -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=ON
-      ${lib.optionalString stdenv.isDarwin ''
-      -DLLDB_USE_SYSTEM_DEBUGSERVER=ON
-      ''}
-      -DLibEdit_INCLUDE_DIRS=${libedit.dev}/include
-      -DLibEdit_LIBRARIES=${libedit}/lib/libedit${stdenv.hostPlatform.extensions.sharedLibrary}
-      -DCURSES_INCLUDE_DIRS=${if stdenv.isDarwin then "/var/empty" else ncurses.dev}/include
-      -DCURSES_LIBRARIES=${ncurses}/lib/libncurses${stdenv.hostPlatform.extensions.sharedLibrary}
-      -DPANEL_LIBRARIES=${ncurses}/lib/libpanel${stdenv.hostPlatform.extensions.sharedLibrary}
-    ";
-    buildProject lldb llvm-project/lldb
-
-    ${lib.optionalString stdenv.isDarwin ''
-    # Need to do a standalone build of concurrency for Darwin back deployment.
-    # Based on: utils/swift_build_support/swift_build_support/products/backdeployconcurrency.py
-    cmakeFlags="
-      -GNinja
-      -DCMAKE_Swift_COMPILER=$SWIFT_BUILD_ROOT/swift/bin/swiftc
-      -DSWIFT_PATH_TO_SWIFT_SYNTAX_SOURCE=$SWIFT_SOURCE_ROOT/swift-syntax
-
-      -DTOOLCHAIN_DIR=/var/empty
-      -DSWIFT_NATIVE_LLVM_TOOLS_PATH=${stdenv.cc}/bin
-      -DSWIFT_NATIVE_CLANG_TOOLS_PATH=${stdenv.cc}/bin
-      -DSWIFT_NATIVE_SWIFT_TOOLS_PATH=$SWIFT_BUILD_ROOT/swift/bin
-
-      -DCMAKE_CROSSCOMPILING=ON
-
-      -DBUILD_SWIFT_CONCURRENCY_BACK_DEPLOYMENT_LIBRARIES=ON
-      -DSWIFT_INCLUDE_TOOLS=OFF
-      -DSWIFT_BUILD_STDLIB_EXTRA_TOOLCHAIN_CONTENT=OFF
-      -DSWIFT_BUILD_TEST_SUPPORT_MODULES=OFF
-      -DSWIFT_BUILD_STDLIB=OFF
-      -DSWIFT_BUILD_DYNAMIC_STDLIB=OFF
-      -DSWIFT_BUILD_STATIC_STDLIB=OFF
-      -DSWIFT_BUILD_REMOTE_MIRROR=OFF
-      -DSWIFT_BUILD_SDK_OVERLAY=OFF
-      -DSWIFT_BUILD_DYNAMIC_SDK_OVERLAY=OFF
-      -DSWIFT_BUILD_STATIC_SDK_OVERLAY=OFF
-      -DSWIFT_INCLUDE_TESTS=OFF
-      -DSWIFT_BUILD_PERF_TESTSUITE=OFF
-
-      -DSWIFT_HOST_VARIANT_ARCH=${swiftArch}
-      -DBUILD_STANDALONE=ON
-
-      -DSWIFT_INSTALL_COMPONENTS=back-deployment
-
-      -DSWIFT_SDKS=${{
-        "macos" = "OSX";
-        "ios" = "IOS";
-        #IOS_SIMULATOR
-        #TVOS
-        #TVOS_SIMULATOR
-        #WATCHOS
-        #WATCHOS_SIMULATOR
-      }.${targetPlatform.darwinPlatform}}
-
-      -DLLVM_DIR=$SWIFT_BUILD_ROOT/llvm/lib/cmake/llvm
-
-      -DSWIFT_DEST_ROOT=$out
-      -DSWIFT_HOST_VARIANT_SDK=OSX
-
-      -DSWIFT_DARWIN_DEPLOYMENT_VERSION_OSX=10.15
-      -DSWIFT_DARWIN_DEPLOYMENT_VERSION_IOS=13.0
-      -DSWIFT_DARWIN_DEPLOYMENT_VERSION_MACCATALYST=13.0
-      -DSWIFT_DARWIN_DEPLOYMENT_VERSION_TVOS=13.0
-      -DSWIFT_DARWIN_DEPLOYMENT_VERSION_WATCHOS=6.0
-    "
-
-    # This depends on the special Clang build specific to the Swift branch.
-    # We also need to call a specific Ninja target.
-    export CC=$SWIFT_BUILD_ROOT/llvm/bin/clang
-    export CXX=$SWIFT_BUILD_ROOT/llvm/bin/clang++
-    ninjaFlags="back-deployment"
-
-    buildProject swift-concurrency-backdeploy swift
-
-    export CC=$NIX_CC/bin/clang
-    export CXX=$NIX_CC/bin/clang++
-    unset ninjaFlags
-  ''}
-  '';
-
-  # TODO: ~50 failing tests on x86_64-linux. Other platforms not checked.
-  doCheck = false;
-  nativeCheckInputs = [ file ];
-  # TODO: consider using stress-tester and integration-test.
-  checkPhase = ''
-    cd $SWIFT_BUILD_ROOT/swift
-    checkTarget=check-swift-all
-    ninjaCheckPhase
-    unset checkTarget
-  '';
-
-  installPhase = ''
-    # Undo the clang and swift wrapping we did for the build.
-    # (This happened via patches to cmake files.)
-    cd $SWIFT_BUILD_ROOT
-    mv llvm/bin/clang-15{-unwrapped,}
-    mv swift/bin/swift-frontend{-unwrapped,}
-
-    mkdir $out $lib
-
-    # Install clang binaries only. We hide these with the wrapper, so they are
-    # for private use by Swift only.
-    cd $SWIFT_BUILD_ROOT/llvm
-    installTargets=install-clang
-    ninjaInstallPhase
-    unset installTargets
-
-    # LLDB is also a private install.
-    cd $SWIFT_BUILD_ROOT/lldb
-    ninjaInstallPhase
-
-    cd $SWIFT_BUILD_ROOT/swift
-    ninjaInstallPhase
-
-    ${lib.optionalString stdenv.isDarwin ''
-    cd $SWIFT_BUILD_ROOT/swift-concurrency-backdeploy
-    installTargets=install-back-deployment
-    ninjaInstallPhase
-    unset installTargets
-    ''}
-
-    # Separate $lib output here, because specific logic follows.
-    # Only move the dynamic run-time parts, to keep $lib small. Every Swift
-    # build will depend on it.
-    moveToOutput "lib/swift" "$lib"
-    moveToOutput "lib/libswiftDemangle.*" "$lib"
-
-    # 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 $lib/lib/swift $out/lib/swift
-
-    # Swift has a separate resource root from Clang, but locates the Clang
-    # resource root via subdir or symlink. Provide a default here, but we also
-    # patch Swift to prefer NIX_CC if set.
-    #
-    # NOTE: We don't symlink directly here, because that'd add a run-time dep
-    # on the full Clang compiler to every Swift executable. The copy here is
-    # just copying the 3 symlinks inside to smaller closures.
-    mkdir $lib/lib/swift/clang
-    cp -P ${clang}/resource-root/* $lib/lib/swift/clang/
-
-    ${lib.optionalString stdenv.isDarwin ''
-    # Install required library for ObjC interop.
-    # TODO: Is there no source code for this available?
-    cp -r ${CLTools_Executables}/usr/lib/arc $out/lib/arc
-    ''}
-  '';
-
-  preFixup = lib.optionalString stdenv.isLinux ''
-    # This is cheesy, but helps the patchelf hook remove /build from RPATH.
-    cd $SWIFT_BUILD_ROOT/..
-    mv build buildx
-  '';
-
-  postFixup = lib.optionalString stdenv.isDarwin ''
-    # These libraries need to use the system install name. The official SDK
-    # does the same (as opposed to using rpath). Presumably, they are part of
-    # the stable ABI. Not using the system libraries at run-time is known to
-    # cause ObjC class conflicts and segfaults.
-    declare -A systemLibs=(
-      [libswiftCore.dylib]=1
-      [libswiftDarwin.dylib]=1
-      [libswiftSwiftOnoneSupport.dylib]=1
-      [libswift_Concurrency.dylib]=1
-    )
-
-    for systemLib in "''${!systemLibs[@]}"; do
-      install_name_tool -id /usr/lib/swift/$systemLib $lib/${swiftLibSubdir}/$systemLib
-    done
-
-    for file in $out/bin/swift-frontend $lib/${swiftLibSubdir}/*.dylib; do
-      changeArgs=""
-      for dylib in $(otool -L $file | awk '{ print $1 }'); do
-        if [[ ''${systemLibs["$(basename $dylib)"]} ]]; then
-          changeArgs+=" -change $dylib /usr/lib/swift/$(basename $dylib)"
-        elif [[ "$dylib" = */bootstrapping1/* ]]; then
-          changeArgs+=" -change $dylib $lib/lib/swift/$(basename $dylib)"
-        fi
-      done
-      if [[ -n "$changeArgs" ]]; then
-        install_name_tool $changeArgs $file
-      fi
-    done
-
-    wrapProgram $out/bin/swift-frontend \
-      --prefix PATH : ${lib.makeBinPath runtimeDeps}
-  '';
-
-  passthru = {
-    inherit
-      swiftOs swiftArch
-      swiftModuleSubdir swiftLibSubdir
-      swiftStaticModuleSubdir swiftStaticLibSubdir;
-
-    # Internal attr for the wrapper.
-    _wrapperParams = wrapperParams;
-  };
-
-  meta = {
-    description = "Swift Programming Language";
-    homepage = "https://github.com/apple/swift";
-    maintainers = with lib.maintainers; [ dtzWill trepetti dduan trundle stephank ];
-    license = lib.licenses.asl20;
-    platforms = with lib.platforms; linux ++ darwin;
-    # Swift doesn't support 32-bit Linux, unknown on other platforms.
-    badPlatforms = lib.platforms.i686;
-    timeout = 86400; # 24 hours.
-  };
-}