about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/swift/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/swift/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/swift/default.nix290
1 files changed, 169 insertions, 121 deletions
diff --git a/nixpkgs/pkgs/development/compilers/swift/default.nix b/nixpkgs/pkgs/development/compilers/swift/default.nix
index 530115602673..7fc2485da019 100644
--- a/nixpkgs/pkgs/development/compilers/swift/default.nix
+++ b/nixpkgs/pkgs/development/compilers/swift/default.nix
@@ -12,12 +12,13 @@
 , swig
 , bash
 , libxml2
-, clang
-, python
+, clang_10
+, python3
 , ncurses
 , libuuid
 , libbsd
 , icu
+, libgcc
 , autoconf
 , libtool
 , automake
@@ -35,9 +36,14 @@
 }:
 
 let
-  version = "5.1.1";
+  version = "5.4.2";
 
-  fetch = { repo, sha256, fetchSubmodules ? false }:
+  # These dependency versions can be found in utils/update_checkout/update-checkout-config.json.
+  swiftArgumentParserVersion = "0.3.0";
+  yamsVersion = "3.0.1";
+  swiftFormatVersion = "0.50400.0";
+
+  fetchSwiftRelease = { repo, sha256, fetchSubmodules ? false }:
     fetchFromGitHub {
       owner = "apple";
       inherit repo sha256 fetchSubmodules;
@@ -45,63 +51,87 @@ let
       name = "${repo}-${version}-src";
     };
 
+  # Sources based on utils/update_checkout/update_checkout-config.json.
   sources = {
-    llvm = fetch {
-      repo = "swift-llvm";
-      sha256 = "00ldd9dby6fl6nk3z17148fvb7g9x4jkn1afx26y51v8rwgm1i7f";
-    };
-    compilerrt = fetch {
-      repo = "swift-compiler-rt";
-      sha256 = "1431f74l0n2dxn728qp65nc6hivx88fax1wzfrnrv19y77br05wj";
-    };
-    clang = fetch {
-      repo = "swift-clang";
-      sha256 = "0n7k6nvzgqp6h6bfqcmna484w90db3zv4sh5rdh89wxyhdz6rk4v";
-    };
-    clangtools = fetch {
-      repo = "swift-clang-tools-extra";
-      sha256 = "0snp2rpd60z239pr7fxpkj332rkdjhg63adqvqdkjsbrxcqqcgqa";
+    swift = fetchSwiftRelease {
+      repo = "swift";
+      sha256 = "0qrkqkwpmk312fi12kwwyihin01qb7sphhdz5c6an8j1rjfd9wbv";
     };
-    indexstore = fetch {
-      repo = "indexstore-db";
-      sha256 = "1gwkqkdmpd5hn7555dpdkys0z50yh00hjry2886h6rx7avh5p05n";
+    cmark = fetchSwiftRelease {
+      repo = "swift-cmark";
+      sha256 = "0340j9x2n40yx61ma2pgqfbn3a9ijrh20iwzd1zxqq87rr76hh3z";
     };
-    sourcekit = fetch {
-      repo = "sourcekit-lsp";
-      sha256 = "0k84ssr1k7grbvpk81rr21ii8csnixn9dp0cga98h6i1gshn8ml4";
+    llbuild = fetchSwiftRelease {
+      repo = "swift-llbuild";
+      sha256 = "0d7sj5a9b5c1ry2209cpccic5radf9s48sp1lahqzmd1pdx3n7pi";
     };
-    cmark = fetch {
-      repo = "swift-cmark";
-      sha256 = "079smm79hbwr06bvghd2sb86b8gpkprnzlyj9kh95jy38xhlhdnj";
+    argumentParser = fetchFromGitHub {
+      owner = "apple";
+      repo = "swift-argument-parser";
+      rev = swiftArgumentParserVersion;
+      sha256 = "15vv7hnffa84142q97dwjcn196p2bg8nfh89d6nnix0i681n1qfd";
+      name = "swift-argument-parser-${swiftArgumentParserVersion}";
     };
-    lldb = fetch {
-      repo = "swift-lldb";
-      sha256 = "0j787475f0nlmvxqblkhn3yrvn9qhcb2jcijwijxwq95ar2jdygs";
+    driver = fetchSwiftRelease {
+      repo = "swift-driver";
+      sha256 = "1j08273haqv7786rkwsmw7g103glfwy1d2807490id9lagq3r66z";
     };
-    llbuild = fetch {
-      repo = "swift-llbuild";
-      sha256 = "1n2s5isxyl6b6ya617gdzjbw68shbvd52vsfqc1256rk4g448v8b";
+    toolsSupportCore = fetchSwiftRelease {
+      repo = "swift-tools-support-core";
+      sha256 = "07gm28ki4px7xzrplvk9nd1pp5r9nyi87l21i0rcbb3r6wrikxb4";
     };
-    pm = fetch {
+    swiftpm = fetchSwiftRelease {
       repo = "swift-package-manager";
-      sha256 = "1a49jmag5mpld9zr96g8a773334mrz1c4nyw38gf4p6sckf4jp29";
+      sha256 = "05linnzlidxamzl3723zhyrfm24pk2cf1x66a3nk0cxgnajw0vzx";
+    };
+    syntax = fetchSwiftRelease {
+      repo = "swift-syntax";
+      sha256 = "1y9agx9bg037xjhkwc28xm28kjyqydgv21s4ijgy5l51yg1g0daj";
     };
-    xctest = fetch {
+    # TODO: possibly re-add stress-tester.
+    corelibsXctest = fetchSwiftRelease {
       repo = "swift-corelibs-xctest";
-      sha256 = "0rxy9sq7i0s0kxfkz0hvdp8zyb40h31f7g4m0kry36qk82gzzh89";
+      sha256 = "00c68580yr12yxshl0hxyhp8psm15fls3c7iqp52hignyl4v745r";
     };
-    foundation = fetch {
+    corelibsFoundation = fetchSwiftRelease {
       repo = "swift-corelibs-foundation";
-      sha256 = "1iiiijsnys0r3hjcj1jlkn3yszzi7hwb2041cnm5z306nl9sybzp";
+      sha256 = "1jyadm2lm7hhik8n8wacfiffpdwqsgnilwmcw22qris5s2drj499";
     };
-    libdispatch = fetch {
+    corelibsLibdispatch = fetchSwiftRelease {
       repo = "swift-corelibs-libdispatch";
-      sha256 = "0laqsizsikyjhrzn0rghvxd8afg4yav7cbghvnf7ywk9wc6kpkmn";
+      sha256 = "1s46c0hrxi42r43ff5f1pq2imb3hs05adfpwfxkilgqyb5svafsp";
       fetchSubmodules = true;
     };
-    swift = fetch {
-      repo = "swift";
-      sha256 = "0m4r1gzrnn0s1c7haqq9dlmvpqxbgbkbdfmq6qaph869wcmvdkvy";
+    # TODO: possibly re-add integration-tests.
+    # Linux does not support Xcode playgrounds.
+    # We provide our own ninja.
+    # We provider our own icu.
+    yams = fetchFromGitHub {
+      owner = "jpsim";
+      repo = "Yams";
+      rev = yamsVersion;
+      sha256 = "13md54y7lalrpynrw1s0w5yw6rrjpw46fml9dsk2m3ph1bnlrqrq";
+      name = "Yams-${yamsVersion}";
+    };
+    # We provide our own CMake.
+    indexstoreDb = fetchSwiftRelease {
+      repo = "indexstore-db";
+      sha256 = "1ap3hiq2jd3cn10d8d674xysq27by878mvq087a80681r8cdivn3";
+    };
+    sourcekitLsp = fetchSwiftRelease {
+      repo = "sourcekit-lsp";
+      sha256 = "02m9va0lsn2hnwkmgrbgj452sbyaswwmq14lqvxgnb7gssajv4gc";
+    };
+    format = fetchFromGitHub {
+      owner = "apple";
+      repo = "swift-format";
+      rev = swiftFormatVersion;
+      sha256 = "0skmmggsh31f3rnqcrx43178bc7scrjihibnwn68axagasgbqn4k";
+      name = "swift-format-${swiftFormatVersion}-src";
+    };
+    llvmProject = fetchSwiftRelease {
+      repo = "llvm-project";
+      sha256 = "166hd9d2i55zj70xjb1qmbblbfyk8hdb2qv974i07j6cvynn30lm";
     };
   };
 
@@ -112,6 +142,7 @@ let
     libblocksruntime
     libbsd
     libedit
+    libgcc
     libuuid
     libxml2
     ncurses
@@ -119,6 +150,8 @@ let
     swig
   ];
 
+  python = (python3.withPackages (ps: [ps.six]));
+
   cmakeFlags = [
     "-DGLIBC_INCLUDE_PATH=${stdenv.cc.libc.dev}/include"
     "-DC_INCLUDE_DIRS=${lib.makeSearchPathOutput "dev" "include" devInputs}:${libxml2.dev}/include/libxml2"
@@ -136,6 +169,7 @@ stdenv.mkDerivation {
     cmake
     coreutils
     findutils
+    git
     gnumake
     libtool
     makeWrapper
@@ -147,11 +181,12 @@ stdenv.mkDerivation {
     which
   ];
   buildInputs = devInputs ++ [
-    clang
+    clang_10
   ];
 
-  # TODO: Revisit what's propagated and how
+  # TODO: Revisit what needs to be propagated and how.
   propagatedBuildInputs = [
+    libgcc
     libgit2
     python
   ];
@@ -164,32 +199,33 @@ stdenv.mkDerivation {
     cd src
     export SWIFT_SOURCE_ROOT=$PWD
 
-    cp -r ${sources.llvm} llvm
-    cp -r ${sources.compilerrt} compiler-rt
-    cp -r ${sources.clang} clang
-    cp -r ${sources.clangtools} clang-tools-extra
-    cp -r ${sources.indexstore} indexstore-db
-    cp -r ${sources.sourcekit} sourcekit-lsp
+    cp -r ${sources.swift} swift
     cp -r ${sources.cmark} cmark
-    cp -r ${sources.lldb} lldb
     cp -r ${sources.llbuild} llbuild
-    cp -r ${sources.pm} swiftpm
-    cp -r ${sources.xctest} swift-corelibs-xctest
-    cp -r ${sources.foundation} swift-corelibs-foundation
-    cp -r ${sources.libdispatch} swift-corelibs-libdispatch
-    cp -r ${sources.swift} swift
+    cp -r ${sources.argumentParser} swift-argument-parser
+    cp -r ${sources.driver} swift-driver
+    cp -r ${sources.toolsSupportCore} swift-tools-support-core
+    cp -r ${sources.swiftpm} swiftpm
+    cp -r ${sources.syntax} swift-syntax
+    # TODO: possibly re-add stress-tester.
+    cp -r ${sources.corelibsXctest} swift-corelibs-xctest
+    cp -r ${sources.corelibsFoundation} swift-corelibs-foundation
+    cp -r ${sources.corelibsLibdispatch} swift-corelibs-libdispatch
+    # TODO: possibly re-add integration-tests.
+    cp -r ${sources.yams} yams
+    cp -r ${sources.indexstoreDb} indexstore-db
+    cp -r ${sources.sourcekitLsp} sourcekit-lsp
+    cp -r ${sources.format} swift-format
+    cp -r ${sources.llvmProject} llvm-project
 
     chmod -R u+w .
   '';
 
   patchPhase = ''
-    # Glibc 2.31 fix
-    patch -p1 -i ${./patches/swift-llvm.patch}
-
-    # Just patch all the things for now, we can focus this later
+    # Just patch all the things for now, we can focus this later.
     patchShebangs $SWIFT_SOURCE_ROOT
 
-    # TODO eliminate use of env.
+    # TODO: eliminate use of env.
     find -type f -print0 | xargs -0 sed -i \
       -e 's|/usr/bin/env|${coreutils}/bin/env|g' \
       -e 's|/usr/bin/make|${gnumake}/bin/make|g' \
@@ -197,16 +233,13 @@ stdenv.mkDerivation {
       -e 's|/bin/cp|${coreutils}/bin/cp|g' \
       -e 's|/usr/bin/file|${file}/bin/file|g'
 
-    substituteInPlace swift/stdlib/public/Platform/CMakeLists.txt \
-      --replace '/usr/include' "${stdenv.cc.libc.dev}/include"
-    substituteInPlace swift/utils/build-script-impl \
-      --replace '/usr/include/c++' "${gccForLibs}/include/c++"
-    patch -p1 -d swift -i ${./patches/glibc-arch-headers.patch}
+    # Build configuration patches.
     patch -p1 -d swift -i ${./patches/0001-build-presets-linux-don-t-require-using-Ninja.patch}
     patch -p1 -d swift -i ${./patches/0002-build-presets-linux-allow-custom-install-prefix.patch}
     patch -p1 -d swift -i ${./patches/0003-build-presets-linux-don-t-build-extra-libs.patch}
     patch -p1 -d swift -i ${./patches/0004-build-presets-linux-plumb-extra-cmake-options.patch}
-
+    substituteInPlace swift/cmake/modules/SwiftConfigureSDK.cmake \
+      --replace '/usr/include' "${stdenv.cc.libc.dev}/include"
     sed -i swift/utils/build-presets.ini \
       -e 's/^test-installable-package$/# \0/' \
       -e 's/^test$/# \0/' \
@@ -214,41 +247,37 @@ stdenv.mkDerivation {
       -e 's/^long-test$/# \0/' \
       -e 's/^stress-test$/# \0/' \
       -e 's/^test-optimized$/# \0/' \
-      \
       -e 's/^swift-install-components=autolink.*$/\0;editor-integration/'
 
-    substituteInPlace clang/lib/Driver/ToolChains/Linux.cpp \
-      --replace 'SysRoot + "/lib' '"${glibc}/lib" "'
-    substituteInPlace clang/lib/Driver/ToolChains/Linux.cpp \
-      --replace 'SysRoot + "/usr/lib' '"${glibc}/lib" "'
-    patch -p1 -d clang -i ${./patches/llvm-toolchain-dir.patch}
-    patch -p1 -d clang -i ${./purity.patch}
-
-    # Workaround hardcoded dep on "libcurses" (vs "libncurses"):
+    # LLVM toolchain patches.
+    patch -p1 -d llvm-project/clang -i ${./patches/0005-clang-toolchain-dir.patch}
+    patch -p1 -d llvm-project/clang -i ${./patches/0006-clang-purity.patch}
+    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";'
+
+    # Substitute ncurses for curses in llbuild.
     sed -i 's/curses/ncurses/' llbuild/*/*/CMakeLists.txt
-    # 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
+    sed -i 's/curses/ncurses/' llbuild/*/*/*/CMakeLists.txt
 
-    # Compatibility with glibc 2.30
-    # Adapted from https://github.com/apple/swift-package-manager/pull/2408
-    patch -p1 -d swiftpm -i ${./patches/swift-package-manager-glibc-2.30.patch}
-    # https://github.com/apple/swift/pull/27288
-    patch -p1 -d swift -i ${fetchpatch {
-      url = "https://github.com/apple/swift/commit/f968f4282d53f487b29cf456415df46f9adf8748.patch";
-      sha256 = "1aa7l66wlgip63i4r0zvi9072392bnj03s4cn12p706hbpq0k37c";
-    }}
+    # 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
 
+    # Support library build script patches.
     PREFIX=''${out/#\/}
-    substituteInPlace indexstore-db/Utilities/build-script-helper.py \
-      --replace usr "$PREFIX"
-    substituteInPlace sourcekit-lsp/Utilities/build-script-helper.py \
-      --replace usr "$PREFIX"
+    substituteInPlace swift/utils/swift_build_support/swift_build_support/products/benchmarks.py \
+      --replace \
+      "'--toolchain', toolchain_path," \
+      "'--toolchain', '/build/install/$PREFIX',"
+    substituteInPlace swift/benchmark/scripts/build_script_helper.py \
+      --replace \
+      "swiftbuild_path = os.path.join(args.toolchain, \"usr\", \"bin\", \"swift-build\")" \
+      "swiftbuild_path = os.path.join(args.toolchain, \"bin\", \"swift-build\")"
     substituteInPlace swift-corelibs-xctest/build_script.py \
       --replace usr "$PREFIX"
-    substituteInPlace swift-corelibs-foundation/CoreFoundation/PlugIn.subproj/CFBundle_InfoPlist.c \
-      --replace "if !TARGET_OS_ANDROID" "if TARGET_OS_MAC || TARGET_OS_BSD"
-    substituteInPlace swift-corelibs-foundation/CoreFoundation/PlugIn.subproj/CFBundle_Resources.c \
-      --replace "if !TARGET_OS_ANDROID" "if TARGET_OS_MAC || TARGET_OS_BSD"
   '';
 
   configurePhase = ''
@@ -265,17 +294,15 @@ stdenv.mkDerivation {
   '';
 
   buildPhase = ''
-    # explicitly include C++ headers to prevent errors where stdlib.h is not found from cstdlib
-    export NIX_CFLAGS_COMPILE="$(< ${clang}/nix-support/libcxx-cxxflags) $NIX_CFLAGS_COMPILE"
-    # During the Swift build, a full local LLVM build is performed and the resulting clang is invoked.
-    # This compiler is not using the Nix wrappers, so it needs some help to find things.
+    # Explicitly include C++ headers to prevent errors where stdlib.h is not found from cstdlib.
+    export NIX_CFLAGS_COMPILE="$(< ${clang_10}/nix-support/libcxx-cxxflags) $NIX_CFLAGS_COMPILE"
+
+    # During the Swift build, a full local LLVM build is performed and the resulting clang is
+    # invoked. This compiler is not using the Nix wrappers, so it needs some help to find things.
     export NIX_LDFLAGS_BEFORE="-rpath ${gccForLibs.lib}/lib -L${gccForLibs.lib}/lib $NIX_LDFLAGS_BEFORE"
-    # However, we want to use the wrapped compiler whenever possible.
-    export CC="${clang}/bin/clang"
 
-    # fix for https://bugs.llvm.org/show_bug.cgi?id=39743
-    # see also https://forums.swift.org/t/18138/15
-    export CCC_OVERRIDE_OPTIONS="#x-fmodules s/-fmodules-cache-path.*//"
+    # However, we want to use the wrapped compiler whenever possible.
+    export CC="${clang_10}/bin/clang"
 
     $SWIFT_SOURCE_ROOT/swift/utils/build-script \
       --preset=buildbot_linux \
@@ -290,14 +317,31 @@ stdenv.mkDerivation {
   checkInputs = [ file ];
 
   checkPhase = ''
-    # FIXME: disable non-working tests
-    rm $SWIFT_SOURCE_ROOT/swift/test/Driver/static-stdlib-linux.swift  # static linkage of libatomic.a complains about missing PIC
-    rm $SWIFT_SOURCE_ROOT/swift/validation-test/Python/build_swift.swift  # install_prefix not passed properly
+    # Remove compiler build system tests which fail due to our modified default build profile and
+    # nixpkgs-provided version of CMake.
+    rm $SWIFT_SOURCE_ROOT/swift/validation-test/BuildSystem/infer_implies_install_all.test
+    rm $SWIFT_SOURCE_ROOT/swift/validation-test/BuildSystem/infer_dumps_deps_if_verbose_build.test
+
+    # This test apparently requires Python 2 (strings are assumed to be bytes-like), but the build
+    # process overall now otherwise requires Python 3 (which is what we have updated to). A fix PR
+    # has been submitted upstream.
+    rm $SWIFT_SOURCE_ROOT/swift/validation-test/SIL/verify_all_overlays.py
+
+    # TODO: consider fixing and re-adding. This test fails due to a non-standard "install_prefix".
+    rm $SWIFT_SOURCE_ROOT/swift/validation-test/Python/build_swift.swift
+
+    # We cannot handle the SDK location being in "Weird Location" due to Nix isolation.
+    rm $SWIFT_SOURCE_ROOT/swift/test/DebugInfo/compiler-flags.swift
 
-    # match the swift wrapper in the install phase
-    export LIBRARY_PATH=${icu}/lib:${libuuid.out}/lib
+    # TODO: Fix issue with ld.gold invoked from script finding crtbeginS.o and crtendS.o.
+    rm $SWIFT_SOURCE_ROOT/swift/test/IRGen/ELF-remove-autolink-section.swift
 
-    checkTarget=check-swift-all
+    # TODO: consider using stress-tester and integration-test.
+
+    # Match the wrapped version of Swift to be installed.
+    export LIBRARY_PATH=${icu}/lib:${libgcc}/lib:${libuuid.out}/lib:$l
+
+    checkTarget=check-swift-all-${stdenv.hostPlatform.parsed.kernel.name}-${stdenv.hostPlatform.parsed.cpu.name}
     ninjaFlags='-C buildbot_linux/swift-${stdenv.hostPlatform.parsed.kernel.name}-${stdenv.hostPlatform.parsed.cpu.name}'
     ninjaCheckPhase
   '';
@@ -305,19 +349,26 @@ stdenv.mkDerivation {
   installPhase = ''
     mkdir -p $out
 
-    # Extract the generated tarball into the store
+    # Extract the generated tarball into the store.
     tar xf $INSTALLABLE_PACKAGE -C $out --strip-components=3 ''${out/#\/}
     find $out -type d -empty -delete
 
-    # fix installation weirdness, also present in Apple’s official tarballs
+    # Fix installation weirdness, also present in Apple’s official tarballs.
     mv $out/local/include/indexstore $out/include
     rmdir $out/local/include $out/local
     rm -r $out/bin/sdk-module-lists $out/bin/swift-api-checker.py
 
     wrapProgram $out/bin/swift \
+      --set CC $out/bin/clang \
+      --suffix C_INCLUDE_PATH : $out/lib/swift/clang/include \
+      --suffix CPLUS_INCLUDE_PATH : $out/lib/swift/clang/include \
+      --suffix LIBRARY_PATH : ${icu}/lib:${libgcc}/lib:${libuuid.out}/lib
+
+    wrapProgram $out/bin/swiftc \
+      --set CC $out/bin/clang \
       --suffix C_INCLUDE_PATH : $out/lib/swift/clang/include \
       --suffix CPLUS_INCLUDE_PATH : $out/lib/swift/clang/include \
-      --suffix LIBRARY_PATH : ${icu}/lib:${libuuid.out}/lib
+      --suffix LIBRARY_PATH : ${icu}/lib:${libgcc}/lib:${libuuid.out}/lib
   '';
 
   # Hack to avoid build and install directories in RPATHs.
@@ -326,14 +377,11 @@ stdenv.mkDerivation {
   meta = with lib; {
     description = "The Swift Programming Language";
     homepage = "https://github.com/apple/swift";
-    maintainers = with maintainers; [ dtzWill ];
+    maintainers = with maintainers; [ dtzWill trepetti ];
     license = licenses.asl20;
-    # Swift doesn't support 32bit Linux, unknown on other platforms.
+    # Swift doesn't support 32-bit Linux, unknown on other platforms.
     platforms = platforms.linux;
     badPlatforms = platforms.i686;
-    broken = true; # 2021-01-29
-    knownVulnerabilities = [
-      "CVE-2020-9861"
-    ];
+    timeout = 86400; # 24 hours.
   };
 }