diff --git a/pkgs/development/compilers/swift/default.nix b/pkgs/development/compilers/swift/default.nix new file mode 100644 index 000000000000..da4482b463ec --- /dev/null +++ b/pkgs/development/compilers/swift/default.nix @@ -0,0 +1,264 @@ +{ stdenv +, cmake +, coreutils +, glibc +, which +, perl +, libedit +, ninja +, pkgconfig +, sqlite +, swig +, bash +, libxml2 +, llvm +, clang +, python +, ncurses +, libuuid +, libbsd +, icu +, autoconf +, libtool +, automake +, libblocksruntime +, curl +, rsync +, git +, libgit2 +, binutils +, fetchFromGitHub +, paxctl +, findutils +#, systemtap +}: + +let + v_major = "3.1"; + version = "${v_major}-RELEASE"; + version_friendly = "${v_major}"; + + tag = "refs/tags/swift-${version}"; + fetch = { repo, sha256, fetchSubmodules ? false }: + fetchFromGitHub { + owner = "apple"; + inherit repo sha256 fetchSubmodules; + rev = tag; + name = "${repo}-${version}-src"; + }; + +sources = { + # FYI: SourceKit probably would work but currently requires building everything twice + # For more inforation, see: https://github.com/apple/swift/pull/3594#issuecomment-234169759 + clang = fetch { + repo = "swift-clang"; + sha256 = "0820mx1ghfnk4p5595r1f313y1699jwi61zghfbwak5wgwgy7n4x"; + }; + llvm = fetch { + repo = "swift-llvm"; + sha256 = "0zb1zi77b2xdz5szlz2m3j3d92dc0q00dv8py2s6iaq3k435i3sq"; + }; + compilerrt = fetch { + repo = "swift-compiler-rt"; + sha256 = "1gjcr6g3ffs3nhf4a84iwg4flbd7rqcf9rvvclwyq96msa3mj950"; + }; + cmark = fetch { + repo = "swift-cmark"; + sha256 = "0qf2f3zd8lndkfbxbz6vkznzz8rvq5gigijh7pgmfx9fi4zcssqx"; + }; + lldb = fetch { + repo = "swift-lldb"; + sha256 = "17n4whpf3wxw9zaayiq21gk9q3547qxi4rvxld2hybh0k7a1bj5c"; + }; + llbuild = fetch { + repo = "swift-llbuild"; + sha256 = "1l3hnb2s01jby91k1ipbc3bhszq14vyx5pzdhf2chld1yhpg420d"; + }; + pm = fetch { + repo = "swift-package-manager"; + sha256 = "05zijald08z4jbppjawlc0h9n0i4dvn6jnhq0i5b9qq55l7a1lrk"; + }; + xctest = fetch { + repo = "swift-corelibs-xctest"; + sha256 = "0cj5y7wanllfldag08ci567x12aw793c79afckpbsiaxmwy4xhnm"; + }; + foundation = fetch { + repo = "swift-corelibs-foundation"; + sha256 = "0d34clr7n0kfy0l94hmgg1cailg3bml0qzlhy8wh75hrrv3n4g1v"; + }; + libdispatch = fetch { + repo = "swift-corelibs-libdispatch"; + sha256 = "1rka7ijkdk4ybdvyk3map5mc1fm79v848v9nhpfq75m5i63r61bh"; + fetchSubmodules = true; + }; + swift = fetch { + repo = "swift"; + sha256 = "172q84z70z9gpwahmlcifihldrvc3cafy9ajbz4wi5f6ncw7wbmb"; + }; + }; + + devInputs = [ + curl + glibc + icu + libblocksruntime + libbsd + libedit + libuuid + libxml2 + ncurses + sqlite + swig + # systemtap? + ]; + + cmakeFlags = [ + "-DGLIBC_INCLUDE_PATH=${stdenv.cc.libc.dev}/include" + "-DC_INCLUDE_DIRS=${stdenv.lib.makeSearchPathOutput "dev" "include" devInputs}:${libxml2.dev}/include/libxml2" + "-DGCC_INSTALL_PREFIX=${clang.cc.gcc}" + ]; + + builder = '' + $SWIFT_SOURCE_ROOT/swift/utils/build-script \ + --preset=buildbot_linux \ + installable_package=$INSTALLABLE_PACKAGE \ + install_prefix=$out \ + install_destdir=$SWIFT_INSTALL_DIR \ + extra_cmake_options="${stdenv.lib.concatStringsSep "," cmakeFlags}"''; + +in +stdenv.mkDerivation rec { + name = "swift-${version_friendly}"; + + buildInputs = devInputs ++ [ + autoconf + automake + bash + clang + cmake + coreutils + libtool + ninja + perl + pkgconfig + python + rsync + which + findutils + ] ++ stdenv.lib.optional stdenv.needsPax paxctl; + + # TODO: Revisit what's propagated and how + propagatedBuildInputs = [ + libgit2 + python + ]; + propagatedUserEnvPkgs = [ git pkgconfig ]; + + hardeningDisable = [ "format" ]; # for LLDB + + configurePhase = '' + cd .. + + export INSTALLABLE_PACKAGE=$PWD/swift.tar.gz + + mkdir build install + export SWIFT_BUILD_ROOT=$PWD/build + export SWIFT_INSTALL_DIR=$PWD/install + + cd $SWIFT_BUILD_ROOT + + unset CC + unset CXX + + export NIX_ENFORCE_PURITY= + ''; + + unpackPhase = '' + mkdir src + cd src + export sourceRoot=$PWD + export SWIFT_SOURCE_ROOT=$PWD + + cp -r ${sources.clang} clang + cp -r ${sources.llvm} llvm + cp -r ${sources.compilerrt} compiler-rt + 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 + + chmod -R u+w . + ''; + + patchPhase = '' + # Just patch all the things for now, we can focus this later + patchShebangs $SWIFT_SOURCE_ROOT + + 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++' "${clang.cc.gcc}/include/c++" + '' + stdenv.lib.optionalString stdenv.needsPax '' + patch -p1 -d swift -i ${./patches/build-script-pax.patch} + '' + '' + 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-disable-tests.patch} + patch -p1 -d swift -i ${./patches/0004-build-presets-linux-plumb-extra-cmake-options.patch} + + substituteInPlace clang/lib/Driver/ToolChains.cpp \ + --replace ' addPathIfExists(D, SysRoot + "/usr/lib", Paths);' \ + ' addPathIfExists(D, SysRoot + "/usr/lib", Paths); addPathIfExists(D, "${glibc}/lib", Paths);' + patch -p1 -d clang -i ${./purity.patch} + + # Workaround hardcoded dep on "libcurses" (vs "libncurses"): + sed -i 's,curses,ncurses,' llbuild/*/*/CMakeLists.txt + substituteInPlace llbuild/tests/BuildSystem/Build/basic.llbuild \ + --replace /usr/bin/env $(type -p env) + + # This test fails on one of my machines, not sure why. + # Disabling for now. + rm llbuild/tests/Examples/buildsystem-capi.llbuild + + substituteInPlace swift-corelibs-foundation/lib/script.py \ + --replace /bin/cp $(type -p cp) + + PREFIX=''${out/#\/} + substituteInPlace swift-corelibs-xctest/build_script.py \ + --replace usr "$PREFIX" + substituteInPlace swiftpm/Utilities/bootstrap \ + --replace "usr" "$PREFIX" + ''; + + doCheck = false; + + buildPhase = builder; + + installPhase = '' + mkdir -p $out + + # Extract the generated tarball into the store + PREFIX=''${out/#\/} + tar xf $INSTALLABLE_PACKAGE -C $out --strip-components=3 $PREFIX + + paxmark pmr $out/bin/swift + paxmark pmr $out/bin/* + + # TODO: Use wrappers to get these on the PATH for swift tools, instead + ln -s ${clang}/bin/* $out/bin/ + ln -s ${binutils}/bin/ar $out/bin/ar + ''; + + meta = with stdenv.lib; { + description = "The Swift Programming Language"; + homepage = "https://github.com/apple/swift"; + maintainers = with maintainers; [ jb55 dtzWill ]; + license = licenses.asl20; + platforms = platforms.linux; + }; +} + diff --git a/pkgs/development/compilers/swift/patches/0001-build-presets-linux-don-t-require-using-Ninja.patch b/pkgs/development/compilers/swift/patches/0001-build-presets-linux-don-t-require-using-Ninja.patch new file mode 100644 index 000000000000..6ef83754a674 --- /dev/null +++ b/pkgs/development/compilers/swift/patches/0001-build-presets-linux-don-t-require-using-Ninja.patch @@ -0,0 +1,25 @@ +From 1fc49285c7a198de14005803dfde64bda17f4120 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 28 Mar 2017 15:01:16 -0500 +Subject: [PATCH 1/4] build-presets: (linux) don't require using Ninja + +--- + utils/build-presets.ini | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/utils/build-presets.ini b/utils/build-presets.ini +index 7ee57ad2df..e6b0af3581 100644 +--- a/utils/build-presets.ini ++++ b/utils/build-presets.ini +@@ -686,7 +686,7 @@ swiftpm + xctest + dash-dash + +-build-ninja ++# build-ninja + install-swift + install-lldb + install-llbuild +-- +2.12.2 + diff --git a/pkgs/development/compilers/swift/patches/0002-build-presets-linux-allow-custom-install-prefix.patch b/pkgs/development/compilers/swift/patches/0002-build-presets-linux-allow-custom-install-prefix.patch new file mode 100644 index 000000000000..0e18e8812a84 --- /dev/null +++ b/pkgs/development/compilers/swift/patches/0002-build-presets-linux-allow-custom-install-prefix.patch @@ -0,0 +1,25 @@ +From fca6624b7a0ad670157105336a737cc95f9ce9fb Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 28 Mar 2017 15:01:40 -0500 +Subject: [PATCH 2/4] build-presets: (linux) allow custom install prefix + +--- + utils/build-presets.ini | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/utils/build-presets.ini b/utils/build-presets.ini +index e6b0af3581..1095cbaab7 100644 +--- a/utils/build-presets.ini ++++ b/utils/build-presets.ini +@@ -692,7 +692,7 @@ install-lldb + install-llbuild + install-swiftpm + install-xctest +-install-prefix=/usr ++install-prefix=%(install_prefix)s + swift-install-components=autolink-driver;compiler;clang-builtin-headers;stdlib;swift-remote-mirror;sdk-overlay;license + build-swift-static-stdlib + build-swift-static-sdk-overlay +-- +2.12.2 + diff --git a/pkgs/development/compilers/swift/patches/0003-build-presets-linux-disable-tests.patch b/pkgs/development/compilers/swift/patches/0003-build-presets-linux-disable-tests.patch new file mode 100644 index 000000000000..f647d9189dd2 --- /dev/null +++ b/pkgs/development/compilers/swift/patches/0003-build-presets-linux-disable-tests.patch @@ -0,0 +1,38 @@ +From fcc7c216da6cd255f884b7aa39f361786e3afa6a Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 28 Mar 2017 15:02:18 -0500 +Subject: [PATCH 3/4] build-presets: (linux) disable tests. + +--- + utils/build-presets.ini | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/utils/build-presets.ini b/utils/build-presets.ini +index 1095cbaab7..1739e91dc2 100644 +--- a/utils/build-presets.ini ++++ b/utils/build-presets.ini +@@ -700,7 +700,7 @@ build-swift-stdlib-unittest-extra + + # Executes the lit tests for the installable package that is created + # Assumes the swift-integration-tests repo is checked out +-test-installable-package ++# test-installable-package + + # Path to the root of the installation filesystem. + install-destdir=%(install_destdir)s +@@ -713,9 +713,9 @@ mixin-preset=mixin_linux_installation + build-subdir=buildbot_linux + lldb + release +-test +-validation-test +-long-test ++#test ++#validation-test ++#long-test + foundation + libdispatch + lit-args=-v +-- +2.12.2 + diff --git a/pkgs/development/compilers/swift/patches/0004-build-presets-linux-plumb-extra-cmake-options.patch b/pkgs/development/compilers/swift/patches/0004-build-presets-linux-plumb-extra-cmake-options.patch new file mode 100644 index 000000000000..5493196303cd --- /dev/null +++ b/pkgs/development/compilers/swift/patches/0004-build-presets-linux-plumb-extra-cmake-options.patch @@ -0,0 +1,25 @@ +From 4a46b12f580d0a9779937d07c4f1fd347570c4ef Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 28 Mar 2017 15:02:37 -0500 +Subject: [PATCH 4/4] build-presets: (linux) plumb extra-cmake-options + +--- + utils/build-presets.ini | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/utils/build-presets.ini b/utils/build-presets.ini +index 1739e91dc2..0608fed9c1 100644 +--- a/utils/build-presets.ini ++++ b/utils/build-presets.ini +@@ -708,6 +708,8 @@ install-destdir=%(install_destdir)s + # Path to the .tar.gz package we would create. + installable-package=%(installable_package)s + ++extra-cmake-options=%(extra_cmake_options)s ++ + [preset: buildbot_linux] + mixin-preset=mixin_linux_installation + build-subdir=buildbot_linux +-- +2.12.2 + diff --git a/pkgs/development/compilers/swift/patches/build-script-pax.patch b/pkgs/development/compilers/swift/patches/build-script-pax.patch new file mode 100644 index 000000000000..9f1976a2d88d --- /dev/null +++ b/pkgs/development/compilers/swift/patches/build-script-pax.patch @@ -0,0 +1,32 @@ +--- swift/utils/build-script-impl 2017-01-23 12:47:20.401326309 -0600 ++++ swift-pax/utils/build-script-impl 2017-01-23 13:24:10.339366996 -0600 +@@ -1823,6 +1823,16 @@ function set_lldb_xcodebuild_options() { + fi + } + ++## XXX: Taken from nixpkgs /pkgs/stdenv/generic/setup.sh ++isELF() { ++ local fn="$1" ++ local magic ++ exec {fd}< "$fn" ++ read -n 4 -u $fd magic ++ exec {fd}<&- ++ if [[ "$magic" =~ ELF ]]; then return 0; else return 1; fi ++} ++ + # + # Configure and build each product + # +@@ -2624,6 +2634,12 @@ for host in "${ALL_HOSTS[@]}"; do + fi + + call "${CMAKE_BUILD[@]}" "${build_dir}" $(cmake_config_opt ${product}) -- "${BUILD_ARGS[@]}" ${build_targets[@]} ++ ++ while IFS= read -r -d $'\0' i; do ++ if ! isELF "$i"; then continue; fi ++ echo "setting pax flags on $i" ++ paxctl -czexm "$i" || true ++ done < <(find "${build_dir}" -executable -type f -wholename "*/bin/*" -print0) + fi + done + done diff --git a/pkgs/development/compilers/swift/purity.patch b/pkgs/development/compilers/swift/purity.patch new file mode 100644 index 000000000000..f5fb4c73af47 --- /dev/null +++ b/pkgs/development/compilers/swift/purity.patch @@ -0,0 +1,16 @@ +--- a/lib/Driver/Tools.cpp 2016-08-25 15:48:05.187553443 +0200 ++++ b/lib/Driver/Tools.cpp 2016-08-25 15:48:47.534468882 +0200 +@@ -9420,13 +9420,6 @@ + if (!Args.hasArg(options::OPT_static)) { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); +- +- if (!Args.hasArg(options::OPT_shared)) { +- const std::string Loader = +- D.DyldPrefix + ToolChain.getDynamicLinker(Args); +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Loader)); +- } + } + + CmdArgs.push_back("-o"); diff --git a/pkgs/development/libraries/libblocksruntime/default.nix b/pkgs/development/libraries/libblocksruntime/default.nix new file mode 100644 index 000000000000..34ab70e0adcd --- /dev/null +++ b/pkgs/development/libraries/libblocksruntime/default.nix @@ -0,0 +1,27 @@ +{ stdenv, fetchFromGitHub, clang }: + +stdenv.mkDerivation { + name = "blocksruntime"; + + src = fetchFromGitHub { + owner = "mackyle"; + repo = "blocksruntime"; + rev = "b5c5274daf1e0e46ecc9ad8f6f69889bce0a0a5d"; + sha256 = "0ic4lagagkylcvwgf10mg0s1i57h4i25ds2fzvms22xj4zwzk1sd"; + }; + + buildInputs = [ clang ]; + + configurePhase = '' + export CC=clang + export CXX=clang++ + ''; + + buildPhase = "./buildlib"; + + checkPhase = "./checktests"; + + doCheck = false; # hasdescriptor.c test fails, hrm. + + installPhase = ''prefix="/" DESTDIR=$out ./installlib''; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 93c6b2b82914..61ff664d446d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5622,6 +5622,8 @@ with pkgs; metaBuildEnv = callPackage ../development/compilers/meta-environment/meta-build-env { }; + swift = callPackage ../development/compilers/swift { }; + swiProlog = callPackage ../development/compilers/swi-prolog { }; tbb = callPackage ../development/libraries/tbb { }; @@ -8083,6 +8085,8 @@ with pkgs; libbdplus = callPackage ../development/libraries/libbdplus { }; + libblocksruntime = callPackage ../development/libraries/libblocksruntime { }; + libbluray = callPackage ../development/libraries/libbluray { }; libbs2b = callPackage ../development/libraries/audio/libbs2b { };