From 97e31efe60731dbba0fcb725cd79578e540d3232 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 6 Jul 2020 12:11:25 +0100 Subject: [PATCH 1/3] Build both host and target toolchains Resolves #1365. # Conflicts: # utils/build-presets.ini # utils/webassembly/build-toolchain.sh # utils/webassembly/install-nightly-toolchain.sh --- utils/build-presets.ini | 95 +++++++++++++++++++ .../update-checkout-config.json | 2 + utils/webassembly/build-swiftpm.sh | 60 ------------ utils/webassembly/build-toolchain.sh | 89 ++++++++--------- .../webassembly/install-nightly-toolchain.sh | 50 ---------- utils/webassembly/install-wasi-sdk.sh | 18 ++++ .../webassembly/linux/install-dependencies.sh | 35 +++---- utils/webassembly/linux/unpack-prebuilts.sh | 20 ---- .../webassembly/macos/install-dependencies.sh | 7 +- utils/webassembly/macos/unpack-prebuilts.sh | 30 ------ 10 files changed, 181 insertions(+), 225 deletions(-) delete mode 100755 utils/webassembly/build-swiftpm.sh delete mode 100755 utils/webassembly/install-nightly-toolchain.sh create mode 100755 utils/webassembly/install-wasi-sdk.sh delete mode 100755 utils/webassembly/linux/unpack-prebuilts.sh delete mode 100755 utils/webassembly/macos/unpack-prebuilts.sh diff --git a/utils/build-presets.ini b/utils/build-presets.ini index d74159e484fc0..935cca7290af0 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -2414,3 +2414,98 @@ no-assertions mixin-preset=source_compat_suite_linux_base debug no-assertions + +#===----------------------------------------------------------------------===# +# Preset for the WebAssembly toolchain and SDK +#===----------------------------------------------------------------------===# + +[preset: webassembly] + +release +cmake-c-launcher=%(C_CXX_LAUNCHER)s +cmake-cxx-launcher=%(C_CXX_LAUNCHER)s +skip-build-benchmarks +llvm-targets-to-build=X86;WebAssembly +install-destdir=%(INSTALL_DESTDIR)s +swift-install-components=autolink-driver;compiler;clang-builtin-headers;stdlib;sdk-overlay;parser-lib;editor-integration;tools;testsuite-tools;toolchain-tools;license;sourcekit-inproc;swift-remote-mirror;swift-remote-mirror-headers;clang-resource-dir-symlink +llvm-install-components=clang +install-swift +install-prefix=/%(TOOLCHAIN_NAME)s/usr + +[preset: webassembly-host] + +mixin-preset=webassembly +extra-cmake-options= + -DSWIFT_BUILD_SOURCEKIT=FALSE + -DSWIFT_ENABLE_SOURCEKIT_TESTS=FALSE + -DSWIFT_BUILD_SYNTAXPARSERLIB=FALSE + +llbuild +swiftpm + +install-llvm +install-swift +install-llbuild +install-swiftpm + +[preset: webassembly-linux-host] + +mixin-preset=webassembly-host + +libdispatch +libicu +foundation +xctest + +install-libicu +install-foundation +install-libdispatch +install-xctest + +skip-test-libicu +skip-test-foundation +skip-test-libdispatch +skip-test-xctest + +[preset: webassembly-target] + +mixin-preset=webassembly +wasm +verbose +build-stdlib-deployment-targets=wasi-wasm32 +build-swift-dynamic-sdk-overlay=false +build-swift-dynamic-stdlib=false +build-swift-static-sdk-overlay +build-swift-static-stdlib +stdlib-deployment-targets=wasi-wasm32 +wasi-sdk=%(SOURCE_PATH)s/wasi-sdk + +[preset: webassembly-linux-target] + +mixin-preset=webassembly-target +extra-cmake-options= + -DWASI_ICU_URL:STRING="https://github.com/swiftwasm/icu4c-wasi/releases/download/0.5.0/icu4c-wasi.tar.xz" + -DWASI_ICU_MD5:STRING="25943864ebbfff15cf5aee8d9d5cc4d7" + -DSWIFT_PRIMARY_VARIANT_SDK:STRING=WASI + -DSWIFT_PRIMARY_VARIANT_ARCH:STRING=wasm32 + -DSWIFT_SDKS='WASI;LINUX' + -DSWIFT_BUILD_SOURCEKIT=FALSE + -DSWIFT_ENABLE_SOURCEKIT_TESTS=FALSE + -DSWIFT_BUILD_SYNTAXPARSERLIB=FALSE + -DCMAKE_AR="%(SOURCE_PATH)s/wasi-sdk/bin/llvm-ar" + -DCMAKE_RANLIB="%(SOURCE_PATH)s/wasi-sdk/bin/llvm-ranlib" + +[preset: webassembly-macos-target] + +mixin-preset=webassembly-target +extra-cmake-options= + -DWASI_ICU_URL:STRING="https://github.com/swiftwasm/icu4c-wasi/releases/download/0.5.0/icu4c-wasi.tar.xz" + -DWASI_ICU_MD5:STRING="25943864ebbfff15cf5aee8d9d5cc4d7" + -DSWIFT_PRIMARY_VARIANT_SDK:STRING=WASI + -DSWIFT_PRIMARY_VARIANT_ARCH:STRING=wasm32 + -DSWIFT_OSX_x86_64_ICU_STATICLIB=TRUE + -DSWIFT_BUILD_SOURCEKIT=FALSE + -DSWIFT_ENABLE_SOURCEKIT_TESTS=FALSE + -DSWIFT_BUILD_SYNTAXPARSERLIB=FALSE + -DCMAKE_AR='/usr/local/opt/llvm/bin/llvm-ar' + -DCMAKE_RANLIB='/usr/local/opt/llvm/bin/llvm-ranlib' diff --git a/utils/update_checkout/update-checkout-config.json b/utils/update_checkout/update-checkout-config.json index 2fc78306911b1..6b6b85a6bb62a 100644 --- a/utils/update_checkout/update-checkout-config.json +++ b/utils/update_checkout/update-checkout-config.json @@ -59,6 +59,7 @@ "swift": "swiftwasm", "cmark": "master", "llbuild": "master", + "swift-tools-support-core": "master", "swiftpm": "swiftwasm", "swift-syntax": "master", "swift-stress-tester": "master", @@ -82,6 +83,7 @@ "swift": "swiftwasm-release/5.3", "cmark": "release/5.3", "llbuild": "release/5.3", + "swift-tools-support-core": "release/5.3", "swiftpm": "swiftwasm-release/5.3", "swift-syntax": "release/5.3", "swift-stress-tester": "release/5.3", diff --git a/utils/webassembly/build-swiftpm.sh b/utils/webassembly/build-swiftpm.sh deleted file mode 100755 index 5a7899166c7d7..0000000000000 --- a/utils/webassembly/build-swiftpm.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -set -e -DESTINATION_TOOLCHAIN=$1 -SOURCE_PATH="$(cd "$(dirname $0)/../../.." && pwd)" -NIGHTLY_TOOLCHAIN=${SOURCE_PATH}/swift-nightly-toolchain - -export PATH=$NIGHTLY_TOOLCHAIN/usr/bin:$PATH - -SWIFT_BUILD_FLAGS="-c release" -SWIFT_BUILD=${NIGHTLY_TOOLCHAIN}/usr/bin/swift-build - -build_swiftpm() { - local build_flags=$SWIFT_BUILD_FLAGS - if [[ "$(uname)" == "Darwin" ]]; then - rpath_prefix='@executable_path/../lib/swift/macosx' - else - rpath_prefix='$ORIGIN/../lib/swift/linux' - fi - build_flags="${build_flags} -Xlinker -rpath -Xlinker ${rpath_prefix}" - cd ${SOURCE_PATH}/swiftpm - ${SWIFT_BUILD} ${build_flags} -} - -install_binary() { - local src=$1 - local dest=${DESTINATION_TOOLCHAIN}/usr/bin - echo "Installing ${src} to ${dest}" - cp ${src} ${dest} -} - -install_runtime_file() { - local src=$1 - local dest=${DESTINATION_TOOLCHAIN}/usr/lib/swift/pm - echo "Installing ${src} to ${dest}/{4,4_2}" - for runtime in "4" "4_2" - do - mkdir -p ${dest}/${runtime} - cp ${src} ${dest}/${runtime} - done -} - -install_swiftpm() { - cd ${SOURCE_PATH}/swiftpm - local bin_path=$(${SWIFT_BUILD} ${SWIFT_BUILD_FLAGS} --show-bin-path) - for binary in ${bin_path}/{swift-build,swift-test,swift-run,swift-package} - do - install_binary ${binary} - done - - if [[ "$(uname)" == "Linux" ]]; then - install_runtime_file "${bin_path}/libPackageDescription.so" - else - install_runtime_file "${bin_path}/libPackageDescription.dylib" - fi - install_runtime_file "${bin_path}/PackageDescription.swiftmodule" - install_runtime_file "${bin_path}/PackageDescription.swiftdoc" -} - -build_swiftpm -install_swiftpm diff --git a/utils/webassembly/build-toolchain.sh b/utils/webassembly/build-toolchain.sh index 17b2e3aacfc1e..eec549a3ee4f4 100755 --- a/utils/webassembly/build-toolchain.sh +++ b/utils/webassembly/build-toolchain.sh @@ -9,11 +9,13 @@ WASI_SDK_PATH=$SOURCE_PATH/wasi-sdk case $(uname -s) in Darwin) OS_SUFFIX=osx - BUILD_SCRIPT=$UTILS_PATH/build-mac.sh + HOST_PRESET=webassembly-host + TARGET_PRESET=webassembly-macos-target ;; Linux) OS_SUFFIX=linux - BUILD_SCRIPT=$UTILS_PATH/build-linux.sh + HOST_PRESET=webassembly-linux-host + TARGET_PRESET=webassembly-linux-target ;; *) echo "Unrecognised platform $(uname -s)" @@ -35,51 +37,52 @@ BUNDLE_IDENTIFIER="swiftwasm.5.3-${YEAR}${MONTH}${DAY}" DISPLAY_NAME_SHORT="Swift for WebAssembly 5.3 Snapshot" DISPLAY_NAME="${DISPLAY_NAME_SHORT} ${YEAR}-${MONTH}-${DAY}" -# Just a hack, spent enough time investigating this, -# but somehow `master` is able to work without this `mkdir`. -mkdir -p $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/clang/10.0.0 -$BUILD_SCRIPT \ - --install_destdir="$SOURCE_PATH/install" \ - --installable_package="$INSTALLABLE_PACKAGE" \ - --install-prefix=/$TOOLCHAIN_NAME/usr \ - --swift-install-components "autolink-driver;compiler;clang-builtin-headers;stdlib;sdk-overlay;parser-lib;editor-integration;tools;testsuite-tools;toolchain-tools;license;sourcekit-inproc;swift-remote-mirror;swift-remote-mirror-headers;clang-resource-dir-symlink" \ - --llvm-install-components "clang" \ - --install-swift \ - --darwin-toolchain-bundle-identifier="${BUNDLE_IDENTIFIER}" \ - --darwin-toolchain-display-name="${DISPLAY_NAME}" \ - --darwin-toolchain-display-name-short="${DISPLAY_NAME_SHORT}" \ - --darwin-toolchain-name="${TOOLCHAIN_NAME}" \ - --darwin-toolchain-version="${TOOLCHAIN_VERSION}" \ - --darwin-toolchain-alias="swift" \ - "$@" - - -NIGHTLY_TOOLCHAIN=$SOURCE_PATH/swift-nightly-toolchain -if [ ! -e $NIGHTLY_TOOLCHAIN ]; then - $UTILS_PATH/install-nightly-toolchain.sh -fi - -TMP_DIR=$(mktemp -d) -cd $TMP_DIR -tar xfz $INSTALLABLE_PACKAGE $TOOLCHAIN_NAME -cd $TMP_DIR/$TOOLCHAIN_NAME - -# Merge wasi-sdk and toolchain -cp -r $WASI_SDK_PATH/lib/clang usr/lib -cp -a $WASI_SDK_PATH/bin/{*ld,llvm-ar} usr/bin -cp -r $WASI_SDK_PATH/share/wasi-sysroot usr/share - -# Build SwiftPM and install it into toolchain -$UTILS_PATH/build-swiftpm.sh $TMP_DIR/$TOOLCHAIN_NAME +HOST_TOOLCHAIN_DESTDIR=$SOURCE_PATH/host-toolchain-sdk +HOST_TOOLCHAIN_SDK=$HOST_TOOLCHAIN_DESTDIR/$TOOLCHAIN_NAME + +# Avoid clang headers symlink issues +mkdir -p $HOST_TOOLCHAIN_SDK/usr/lib/clang/10.0.0 + +# Build the host toolchain and SDK first. +$SOURCE_PATH/swift/utils/build-script \ + --preset=$HOST_PRESET \ + INSTALL_DESTDIR="$HOST_TOOLCHAIN_DESTDIR" \ + TOOLCHAIN_NAME="$TOOLCHAIN_NAME" \ + C_CXX_LAUNCHER="$(which sccache)" + +# Clean up the host toolchain build directory so that the next +# `build-script` invocation doesn't pick up wrong CMake config files. +# For some reason passing `--reconfigure` to `build-script` won't do this. +rm -rf $SOURCE_PATH/build/Ninja-ReleaseAssert/swift-* + +# build the cross-compilled toolchain +$SOURCE_PATH/swift/utils/build-script \ + --preset=$TARGET_PRESET \ + INSTALL_DESTDIR="$SOURCE_PATH/install" \ + SOURCE_PATH="$SOURCE_PATH" \ + BUNDLE_IDENTIFIER="${BUNDLE_IDENTIFIER}" \ + DISPLAY_NAME="${DISPLAY_NAME}" \ + DISPLAY_NAME_SHORT="${DISPLAY_NAME_SHORT}" \ + TOOLCHAIN_NAME="${TOOLCHAIN_NAME}" \ + TOOLCHAIN_VERSION="${TOOLCHAIN_VERSION}" \ + C_CXX_LAUNCHER="$(which sccache)" + +# Merge wasi-sdk and the toolchain +cp -a $WASI_SDK_PATH/lib/clang $HOST_TOOLCHAIN_SDK/usr/lib +cp -a $WASI_SDK_PATH/bin/{*ld,llvm-ar} $HOST_TOOLCHAIN_SDK/usr/bin +cp -r $WASI_SDK_PATH/share/wasi-sysroot $HOST_TOOLCHAIN_SDK/usr/share # Replace absolute sysroot path with relative path -sed -i -e "s@\".*/include@\"../../../../share/wasi-sysroot/include@g" $TMP_DIR/$TOOLCHAIN_NAME/usr/lib/swift/wasi/wasm32/glibc.modulemap +sed -i -e "s@\".*/include@\"../../../../share/wasi-sysroot/include@g" $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/swift/wasi/wasm32/glibc.modulemap -# Copy nightly-toolchain's host environment stdlib into toolchain +# Copy the target environment stdlib into the toolchain # Avoid copying usr/lib/swift/clang because our toolchain's one is a directory -# but nightly's one is symbolic link, simple copy fails to merge them. -rsync -a $NIGHTLY_TOOLCHAIN/usr/lib/ $TMP_DIR/$TOOLCHAIN_NAME/usr/lib/ --exclude 'swift/clang' +# but nightly's one is symbolic link. A simple copy fails to merge them. +rsync -v -a $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/ $HOST_TOOLCHAIN_SDK/usr/lib/ --exclude 'swift/clang' -cd $TMP_DIR +$UTILS_PATH/build-foundation.sh $HOST_TOOLCHAIN_SDK +$UTILS_PATH/build-xctest.sh $HOST_TOOLCHAIN_SDK + +cd $HOST_TOOLCHAIN_DESTDIR tar cfz $PACKAGE_ARTIFACT $TOOLCHAIN_NAME diff --git a/utils/webassembly/install-nightly-toolchain.sh b/utils/webassembly/install-nightly-toolchain.sh deleted file mode 100755 index 8b61d0a86c9cb..0000000000000 --- a/utils/webassembly/install-nightly-toolchain.sh +++ /dev/null @@ -1,50 +0,0 @@ -set -x - -SOURCE_DIR="$(cd "$(dirname $0)/../../.." && pwd)" -DESTINATION="${SOURCE_DIR}/swift-nightly-toolchain" - -mkdir -p $DESTINATION - -BASE_URL="https://swift.org/builds/swift-5.3-branch" - -install_linux() { - WORKSPACE=$(mktemp -d) - - pushd ${WORKSPACE} - - export $(/usr/bin/curl ${BASE_URL}/ubuntu1804/latest-build.yml | grep 'download:' | sed 's/:[^:\/\/]/=/g') - - DOWNLOAD_DIR=$(echo $download | sed "s/-ubuntu18.04.tar.gz//g") - DOWNLOAD_URL=${BASE_URL}/ubuntu1804/${DOWNLOAD_DIR}/${download} - /usr/bin/curl $DOWNLOAD_URL > ${WORKSPACE}/latest_toolchain.tar.gz - - mkdir -p ${WORKSPACE}/latest_toolchain - tar xzf ${WORKSPACE}/latest_toolchain.tar.gz -C ${WORKSPACE}/latest_toolchain - mv ${WORKSPACE}/latest_toolchain/${DOWNLOAD_DIR}-ubuntu18.04/usr ${DESTINATION}/usr - - popd -} - -install_macos() { - WORKSPACE=$(mktemp -d) - - pushd ${WORKSPACE} - - export $(/usr/bin/curl --silent ${BASE_URL}/xcode/latest-build.yml | grep 'download:' | sed 's/:[^:\/\/]/=/g') - - DOWNLOAD_DIR=$(echo $download | sed "s/-osx.pkg//g") - DOWNLOAD_URL=${BASE_URL}/xcode/${DOWNLOAD_DIR}/${download} - - /usr/bin/curl --silent ${DOWNLOAD_URL} > ${WORKSPACE}/latest_xcode_toolchain.pkg - pkgutil --expand ${WORKSPACE}/latest_xcode_toolchain.pkg ${WORKSPACE}/latest_xcode_toolchain - tar xf latest_xcode_toolchain/${DOWNLOAD_DIR}-osx-package.pkg/Payload - mv ${WORKSPACE}/usr ${DESTINATION}/usr - - popd -} - -if [[ "$(uname)" == "Linux" ]]; then - install_linux -else - install_macos -fi diff --git a/utils/webassembly/install-wasi-sdk.sh b/utils/webassembly/install-wasi-sdk.sh new file mode 100755 index 0000000000000..839faa61f465a --- /dev/null +++ b/utils/webassembly/install-wasi-sdk.sh @@ -0,0 +1,18 @@ +#/bin/bash + +set -ex + +SOURCE_PATH="$( cd "$(dirname $0)/../../../" && pwd )" + +cd $SOURCE_PATH + +WASI_SDK_URL="https://github.com/swiftwasm/wasi-sdk/releases/download/0.2.0-swiftwasm/dist-$2-latest.tgz.zip" + +[ ! -e dist-wasi-sdk.tgz.zip ] && \ + wget -O dist-wasi-sdk.tgz.zip $WASI_SDK_URL +unzip -u dist-wasi-sdk.tgz.zip -d . +WASI_SDK_TAR_PATH=$(find . -type f -name "wasi-sdk-*") +WASI_SDK_FULL_NAME=$(basename $WASI_SDK_TAR_PATH -$1.tar.gz) +tar xfz $WASI_SDK_TAR_PATH +rm -rf ./wasi-sdk +mv $WASI_SDK_FULL_NAME ./wasi-sdk diff --git a/utils/webassembly/linux/install-dependencies.sh b/utils/webassembly/linux/install-dependencies.sh index 2dc95e1513675..9a85ebf174713 100755 --- a/utils/webassembly/linux/install-dependencies.sh +++ b/utils/webassembly/linux/install-dependencies.sh @@ -20,23 +20,24 @@ cd $SWIFT_PATH # Install wasmer -curl https://get.wasmer.io -sSfL | sh +if [ ! -e ~/.wasmer/bin/wasmer ]; then + curl https://get.wasmer.io -sSfL | sh +fi cd $SOURCE_PATH -wget -O install_cmake.sh "https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-Linux-x86_64.sh" -chmod +x install_cmake.sh -sudo mkdir -p /opt/cmake -sudo ./install_cmake.sh --skip-license --prefix=/opt/cmake -sudo ln -sf /opt/cmake/bin/* /usr/local/bin +if [ -z $(which cmake) ]; then + wget -O install_cmake.sh "https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-Linux-x86_64.sh" + chmod +x install_cmake.sh + sudo mkdir -p /opt/cmake + sudo ./install_cmake.sh --skip-license --prefix=/opt/cmake + sudo ln -sf /opt/cmake/bin/* /usr/local/bin + cmake --version +fi + cmake --version -wget -O dist-wasi-sdk.tgz.zip "https://github.com/swiftwasm/wasi-sdk/releases/download/0.2.0-swiftwasm/dist-ubuntu-latest.tgz.zip" -unzip dist-wasi-sdk.tgz.zip -d . -WASI_SDK_TAR_PATH=$(find . -type f -name "wasi-sdk-*") -WASI_SDK_FULL_NAME=$(basename $WASI_SDK_TAR_PATH -linux.tar.gz) -tar xfz $WASI_SDK_TAR_PATH -mv $WASI_SDK_FULL_NAME ./wasi-sdk +$SWIFT_PATH/utils/webassembly/install-wasi-sdk.sh linux ubuntu # Link wasm32-wasi-unknown to wasm32-wasi because clang finds crt1.o from sysroot # with os and environment name `getMultiarchTriple`. @@ -47,7 +48,9 @@ tar xf icu.tar.xz # Install sccache -sudo mkdir /opt/sccache && cd /opt/sccache -wget -O - "https://github.com/mozilla/sccache/releases/download/0.2.13/sccache-0.2.13-x86_64-unknown-linux-musl.tar.gz" | \ - sudo tar xz --strip-components 1 -sudo ln -sf /opt/sccache/sccache /usr/local/bin +if [ -z $(which sccache) ]; then + sudo mkdir /opt/sccache && cd /opt/sccache + wget -O - "https://github.com/mozilla/sccache/releases/download/0.2.13/sccache-0.2.13-x86_64-unknown-linux-musl.tar.gz" | \ + sudo tar xz --strip-components 1 + sudo ln -sf /opt/sccache/sccache /usr/local/bin +fi \ No newline at end of file diff --git a/utils/webassembly/linux/unpack-prebuilts.sh b/utils/webassembly/linux/unpack-prebuilts.sh deleted file mode 100755 index a5d5f669aa39f..0000000000000 --- a/utils/webassembly/linux/unpack-prebuilts.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -set -e -rm -rf swiftwasm-sdk compiler -mkdir swiftwasm-sdk -ln -s swiftwasm-sdk compiler -cd compiler -untar="../../prebuilt/wasi-sdk-"*"-linux.tar.gz -../../prebuilt/swiftwasm-linux.tar.gz -../../prebuilt/icu4c-wasi.tar.xz" -for i in $untar -do - echo $i - tar xf $i -done -cd .. -mv "compiler/wasi-sdk-"* "compiler/wasi-sdk" -mv compiler/wasi-sdk/share/wasi-sysroot compiler/wasi-sdk/share/sysroot -../remove-swift-extra-files.sh || true -../remove-wasi-extra-files.sh || true -../copy-shared-files.sh || true diff --git a/utils/webassembly/macos/install-dependencies.sh b/utils/webassembly/macos/install-dependencies.sh index c78e185bde5a0..d3ea862ca51e8 100755 --- a/utils/webassembly/macos/install-dependencies.sh +++ b/utils/webassembly/macos/install-dependencies.sh @@ -13,12 +13,7 @@ cd $SWIFT_PATH cd $SOURCE_PATH -wget -O dist-wasi-sdk.tgz.zip "https://github.com/swiftwasm/wasi-sdk/releases/download/0.2.0-swiftwasm/dist-macos-latest.tgz.zip" -unzip dist-wasi-sdk.tgz.zip -d . -WASI_SDK_TAR_PATH=$(find . -type f -name "wasi-sdk-*") -WASI_SDK_FULL_NAME=$(basename $WASI_SDK_TAR_PATH -macos.tar.gz) -tar xfz $WASI_SDK_TAR_PATH -mv $WASI_SDK_FULL_NAME ./wasi-sdk +$SWIFT_PATH/utils/webassembly/install-wasi-sdk.sh macos macos # Link sysroot/usr/include to sysroot/include because Darwin sysroot doesn't # find header files in sysroot/include but sysroot/usr/include diff --git a/utils/webassembly/macos/unpack-prebuilts.sh b/utils/webassembly/macos/unpack-prebuilts.sh deleted file mode 100755 index 199552346db2e..0000000000000 --- a/utils/webassembly/macos/unpack-prebuilts.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -set -e -rm -rf swiftwasm-sdk compiler tmpdir -mkdir swiftwasm-sdk tmpdir -ln -s swiftwasm-sdk compiler -cd compiler -untar="../../prebuilt/wasi-sdk-"*"-linux.tar.gz -../../prebuilt/swiftwasm-macos.tar.gz -../../prebuilt/icu4c-wasi.tar.xz" -for i in $untar -do - echo $i - tar xf $i -done -# Mac: unpack the Linux one and copy stdlibs -cd .. -cd tmpdir -tar xf ../../prebuilt/clang+llvm-*-x86_64-darwin-apple.tar.xz -tar xf ../../prebuilt/swiftwasm-linux.tar.gz -cd .. -mv "compiler/wasi-sdk-"* "compiler/wasi-sdk" -mv compiler/wasi-sdk/share/wasi-sysroot compiler/wasi-sdk/share/sysroot -../remove-swift-extra-files.sh || true -rm -r compiler/wasi-sdk/bin -mkdir compiler/wasi-sdk/bin -cp tmpdir/clang+llvm-*-x86_64-darwin-apple/bin/wasm-ld compiler/wasi-sdk/bin -cp -a tmpdir/opt/swiftwasm-sdk/lib/swift/wasi compiler/opt/swiftwasm-sdk/lib/swift/wasi -cp -a tmpdir/opt/swiftwasm-sdk/lib/swift_static compiler/opt/swiftwasm-sdk/lib/swift_static -# ok, finally copy over the shared files -../copy-shared-files.sh || true From 7dd7b3dbeacca5e3d5cc50cf48d494018cf85cf6 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 7 Jul 2020 13:12:09 +0100 Subject: [PATCH 2/3] Install ICU with CMake --- CMakeLists.txt | 30 +++++++++++++++++++ stdlib/public/stubs/CMakeLists.txt | 7 +++++ utils/build-script | 20 ++----------- utils/build-script-impl | 10 ------- .../build_swift/driver_arguments.py | 11 ------- .../webassembly/linux/install-dependencies.sh | 3 -- .../webassembly/macos/install-dependencies.sh | 3 -- 7 files changed, 40 insertions(+), 44 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e910b8b9ff68d..7df39955a52bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -897,6 +897,36 @@ function(swift_icu_variables_set sdk arch result) endif() endfunction() +if(SWIFT_PRIMARY_VARIANT_SDK STREQUAL "WASI") + set(WASI_ICU_URL "" CACHE STRING + "Download URL for the WASI ICU distribution") + set(WASI_ICU_MD5 "" CACHE STRING + "The expected MD5 hash of the WASI ICU distribution archive") + + file(DOWNLOAD "${WASI_ICU_URL}" "${SWIFT_SOURCE_DIR}/../icu.tar.xz" + EXPECTED_HASH MD5=${WASI_ICU_MD5}) + + get_filename_component(SWIFT_SOURCE_BASEDIR "${SWIFT_SOURCE_DIR}" DIRECTORY) + set(WASI_ICU_OUT_LIB "${SWIFT_SOURCE_BASEDIR}/icu_out/lib") + set(SWIFT_WASI_wasm32_ICU_UC_INCLUDE "${SWIFT_SOURCE_BASEDIR}/icu_out/include") + set(SWIFT_WASI_wasm32_ICU_I18N_INCLUDE "${SWIFT_SOURCE_BASEDIR}/icu_out/include") + set(SWIFT_WASI_wasm32_ICU_UC "${WASI_ICU_OUT_LIB}/libicuuc.a") + set(SWIFT_WASI_wasm32_ICU_I18N "${WASI_ICU_OUT_LIB}/libicui18n.a") + set(SWIFT_WASI_wasm32_ICU_DATA "${WASI_ICU_OUT_LIB}/libicudata.a") + + set(WASI_ICU_DISTRIBUTION_TARGET) + add_custom_command_target(WASI_ICU_DISTRIBUTION_TARGET + COMMAND + ${CMAKE_COMMAND} -E + tar xfv "${SWIFT_SOURCE_BASEDIR}/icu.tar.xz" + WORKING_DIRECTORY + "${SWIFT_SOURCE_BASEDIR}" + OUTPUT + "${SWIFT_WASI_wasm32_ICU_DATA}" + "${SWIFT_WASI_wasm32_ICU_I18N}" + "${SWIFT_WASI_wasm32_ICU_UC}") +endif() + # ICU is provided through CoreFoundation on Darwin. On other hosts, if the ICU # unicode and i18n include and library paths are not defined, perform a standard # package lookup. Otherwise, rely on the paths specified by the user. These diff --git a/stdlib/public/stubs/CMakeLists.txt b/stdlib/public/stubs/CMakeLists.txt index 7e3ee7cc0ed23..854e4113c7c68 100644 --- a/stdlib/public/stubs/CMakeLists.txt +++ b/stdlib/public/stubs/CMakeLists.txt @@ -27,7 +27,14 @@ set(swift_stubs_c_compile_flags ${SWIFT_RUNTIME_CORE_CXX_FLAGS}) list(APPEND swift_stubs_c_compile_flags -DswiftCore_EXPORTS) list(APPEND swift_stubs_c_compile_flags -I${SWIFT_SOURCE_DIR}/include) +set(swift_stubs_dependencies) +if(SWIFT_PRIMARY_VARIANT_SDK STREQUAL "WASI") + list(APPEND swift_stubs_dependencies ${WASI_ICU_DISTRIBUTION_TARGET}) +endif() + add_swift_target_library(swiftStdlibStubs + DEPENDS + ${swift_stubs_dependencies} OBJECT_LIBRARY ${swift_stubs_sources} ${swift_stubs_objc_sources} diff --git a/utils/build-script b/utils/build-script index 6b8222fe49049..2a679249efcd2 100755 --- a/utils/build-script +++ b/utils/build-script @@ -215,18 +215,9 @@ def validate_arguments(toolchain, args): "--android-icu-i18n-include, and --android-icu-data " "must be specified") if args.wasm: - if args.wasi_sdk is None or \ - args.wasi_icu_uc is None or \ - args.wasi_icu_uc_include is None or \ - args.wasi_icu_i18n is None or \ - args.wasi_icu_i18n_include is None or \ - args.wasi_icu_data is None: - diagnostics.fatal( - "when building for WebAssembly, --wasi-sdk, " - "--wasi-icu-uc, " - "--wasi-icu-uc-include, --wasi-icu-i18n, " - "--wasi-icu-i18n-include, and --wasi-icu-data " - "must be specified") + if args.wasi_sdk is None: + fatal_error( + "when building for WebAssembly, --wasi-sdk must be specified") targets_needing_toolchain = [ 'build_indexstoredb', @@ -708,11 +699,6 @@ class BuildScriptInvocation(object): if args.wasm: impl_args += [ "--wasi-sdk", args.wasi_sdk, - "--wasi-icu-uc", args.wasi_icu_uc, - "--wasi-icu-uc-include", args.wasi_icu_uc_include, - "--wasi-icu-i18n", args.wasi_icu_i18n, - "--wasi-icu-i18n-include", args.wasi_icu_i18n_include, - "--wasi-icu-data", args.wasi_icu_data, ] if platform.system() == 'Darwin': diff --git a/utils/build-script-impl b/utils/build-script-impl index ed358a756daa6..896b4d218aef5 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -118,11 +118,6 @@ KNOWN_SETTINGS=( ## WebAssembly/WASI Options wasi-sdk "" "An absolute path to the WASI SDK that will be used as a libc implementation for Wasm builds" - wasi-icu-uc "" "Path to libicuuc.so" - wasi-icu-uc-include "" "Path to a directory containing headers for libicuuc" - wasi-icu-i18n "" "Path to libicui18n.so" - wasi-icu-i18n-include "" "Path to a directory containing headers libicui18n" - wasi-icu-data "" "Path to libicudata.so" ## Build Types for Components swift-stdlib-build-type "Debug" "the CMake build variant for Swift" @@ -1694,11 +1689,6 @@ for host in "${ALL_HOSTS[@]}"; do cmake_options=( "${cmake_options[@]}" -DSWIFT_WASI_SDK_PATH:STRING="${WASI_SDK}" - -DSWIFT_WASI_wasm32_ICU_UC:STRING="${WASI_ICU_UC}" - -DSWIFT_WASI_wasm32_ICU_UC_INCLUDE:STRING="${WASI_ICU_UC_INCLUDE}" - -DSWIFT_WASI_wasm32_ICU_I18N:STRING="${WASI_ICU_I18N}" - -DSWIFT_WASI_wasm32_ICU_I18N_INCLUDE:STRING="${WASI_ICU_I18N_INCLUDE}" - -DSWIFT_WASI_wasm32_ICU_DATA:STRING="${WASI_ICU_DATA}" ) fi diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 2f8ff95ceff3e..2059231d02441 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -1095,17 +1095,6 @@ def create_argument_parser(): help='An absolute path to WASI SDK that will be used as a libc ' 'implementation for Wasm builds') - option('--wasi-icu-uc', store_path, - help='Path to libicuuc.so') - option('--wasi-icu-uc-include', store_path, - help='Path to a directory containing headers for libicuuc') - option('--wasi-icu-i18n', store_path, - help='Path to libicui18n.so') - option('--wasi-icu-i18n-include', store_path, - help='Path to a directory containing headers libicui18n') - option('--wasi-icu-data', store_path, - help='Path to libicudata.so') - # ------------------------------------------------------------------------- in_group('Experimental language features') diff --git a/utils/webassembly/linux/install-dependencies.sh b/utils/webassembly/linux/install-dependencies.sh index 9a85ebf174713..f4ad744953cda 100755 --- a/utils/webassembly/linux/install-dependencies.sh +++ b/utils/webassembly/linux/install-dependencies.sh @@ -43,9 +43,6 @@ $SWIFT_PATH/utils/webassembly/install-wasi-sdk.sh linux ubuntu # with os and environment name `getMultiarchTriple`. ln -s wasm32-wasi wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi-unknown -wget -O icu.tar.xz "https://github.com/swiftwasm/icu4c-wasi/releases/download/0.5.0/icu4c-wasi.tar.xz" -tar xf icu.tar.xz - # Install sccache if [ -z $(which sccache) ]; then diff --git a/utils/webassembly/macos/install-dependencies.sh b/utils/webassembly/macos/install-dependencies.sh index d3ea862ca51e8..072b6adeb31a5 100755 --- a/utils/webassembly/macos/install-dependencies.sh +++ b/utils/webassembly/macos/install-dependencies.sh @@ -22,6 +22,3 @@ ln -s ../include wasi-sdk/share/wasi-sysroot/usr/include # Link wasm32-wasi-unknown to wasm32-wasi because clang finds crt1.o from sysroot # with os and environment name `getMultiarchTriple`. ln -s wasm32-wasi wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi-unknown - -wget -O icu.tar.xz "https://github.com/swiftwasm/icu4c-wasi/releases/download/0.5.0/icu4c-wasi.tar.xz" -tar xf icu.tar.xz From c6274c59995f1ccb276d32a784a05eeec476bdc8 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 7 Jul 2020 13:32:38 +0100 Subject: [PATCH 3/3] Avoid building Foundation and XCTest for now --- utils/webassembly/build-foundation.sh | 33 ++++++++++++++++++++++++++ utils/webassembly/build-toolchain.sh | 5 ++-- utils/webassembly/build-xctest.sh | 21 ++++++++++++++++ utils/webassembly/toolchain-wasi.cmake | 28 ++++++++++++++++++++++ 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100755 utils/webassembly/build-foundation.sh create mode 100755 utils/webassembly/build-xctest.sh create mode 100644 utils/webassembly/toolchain-wasi.cmake diff --git a/utils/webassembly/build-foundation.sh b/utils/webassembly/build-foundation.sh new file mode 100755 index 0000000000000..0f712825160d7 --- /dev/null +++ b/utils/webassembly/build-foundation.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -ex +DESTINATION_TOOLCHAIN=$1 +SOURCE_PATH="$(cd "$(dirname $0)/../../.." && pwd)" + +# Remove host CoreFoundation (which can be different from the target) headers +# to avoid shadowing the wasm32 target CoreFoundation +rm -rf $DESTINATION_TOOLCHAIN/usr/lib/swift/CoreFoundation + +FOUNDATION_BUILD="$SOURCE_PATH/build/Ninja-ReleaseAssert/foundation-wasi-wasm32" + +mkdir -p $FOUNDATION_BUILD +cd $FOUNDATION_BUILD + +cmake -G Ninja \ + -DCMAKE_Swift_COMPILER="$DESTINATION_TOOLCHAIN/usr/bin/swiftc" \ + -DCMAKE_STAGING_PREFIX="$DESTINATION_TOOLCHAIN/usr" \ + -DCMAKE_TOOLCHAIN_FILE="$SOURCE_PATH/swift/utils/webassembly/toolchain-wasi.cmake" \ + -DWASI_SDK_PATH="$SOURCE_PATH/wasi-sdk" \ + -DICU_ROOT="$SOURCE_PATH/icu_out" \ + -DBUILD_SHARED_LIBS=OFF \ + "${SOURCE_PATH}/swift-corelibs-foundation" + +ninja -v +ninja -v install + +# On macOS the target CoreFoundation shadows the CoreFoundation suppplied by Xcode. +# On Linux though there's no system CoreFoundation, its headers have to be shipped +# in the installable archive and serve for both host and target. +if [[ "$(uname)" == "Darwin" ]]; then + mv $DESTINATION_TOOLCHAIN/usr/lib/swift/CoreFoundation \ + $DESTINATION_TOOLCHAIN/usr/lib/swift/wasi/wasm32/CoreFoundation +fi diff --git a/utils/webassembly/build-toolchain.sh b/utils/webassembly/build-toolchain.sh index eec549a3ee4f4..9d7f333b1eca4 100755 --- a/utils/webassembly/build-toolchain.sh +++ b/utils/webassembly/build-toolchain.sh @@ -81,8 +81,9 @@ sed -i -e "s@\".*/include@\"../../../../share/wasi-sysroot/include@g" $SOURCE_PA # but nightly's one is symbolic link. A simple copy fails to merge them. rsync -v -a $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/ $HOST_TOOLCHAIN_SDK/usr/lib/ --exclude 'swift/clang' -$UTILS_PATH/build-foundation.sh $HOST_TOOLCHAIN_SDK -$UTILS_PATH/build-xctest.sh $HOST_TOOLCHAIN_SDK +# FIXME: avoid building foundation for now +# $UTILS_PATH/build-foundation.sh $HOST_TOOLCHAIN_SDK +# $UTILS_PATH/build-xctest.sh $HOST_TOOLCHAIN_SDK cd $HOST_TOOLCHAIN_DESTDIR tar cfz $PACKAGE_ARTIFACT $TOOLCHAIN_NAME diff --git a/utils/webassembly/build-xctest.sh b/utils/webassembly/build-xctest.sh new file mode 100755 index 0000000000000..e08e0cef33db1 --- /dev/null +++ b/utils/webassembly/build-xctest.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -ex +DESTINATION_TOOLCHAIN=$1 +SOURCE_PATH="$(cd "$(dirname $0)/../../.." && pwd)" + +BUILD_DIR="$SOURCE_PATH/build/Ninja-ReleaseAssert/xctest-wasi-wasm32" + +mkdir -p $BUILD_DIR +cd $BUILD_DIR + +cmake -G Ninja \ + -DCMAKE_Swift_COMPILER="$DESTINATION_TOOLCHAIN/usr/bin/swiftc" \ + -DCMAKE_STAGING_PREFIX="$DESTINATION_TOOLCHAIN/usr" \ + -DCMAKE_TOOLCHAIN_FILE="$SOURCE_PATH/swift/utils/webassembly/toolchain-wasi.cmake" \ + -DWASI_SDK_PATH="$SOURCE_PATH/wasi-sdk" \ + -DBUILD_SHARED_LIBS=OFF \ + -DSWIFT_FOUNDATION_PATH=$DESTINATION_TOOLCHAIN/usr/lib/swift/wasi/wasm32 \ + "${SOURCE_PATH}/swift-corelibs-xctest" + +ninja -v +ninja -v install diff --git a/utils/webassembly/toolchain-wasi.cmake b/utils/webassembly/toolchain-wasi.cmake new file mode 100644 index 0000000000000..2cf36de407293 --- /dev/null +++ b/utils/webassembly/toolchain-wasi.cmake @@ -0,0 +1,28 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR wasm32) +set(triple wasm32-unknown-wasi) + +set(WASI_SDK_PREFIX "${SWIFT_SOURCE_PREFIX}/wasi-sdk") + +set(CMAKE_C_COMPILER ${WASI_SDK_PREFIX}/bin/clang) +set(CMAKE_CXX_COMPILER ${WASI_SDK_PREFIX}/bin/clang++) +set(CMAKE_AR ${WASI_SDK_PREFIX}/bin/llvm-ar CACHE STRING "wasi-sdk build") +set(CMAKE_RANLIB ${WASI_SDK_PREFIX}/bin/llvm-ranlib CACHE STRING "wasi-sdk build") +set(CMAKE_C_COMPILER_TARGET ${triple} CACHE STRING "wasi-sdk build") +set(CMAKE_CXX_COMPILER_TARGET ${triple} CACHE STRING "wasi-sdk build") +set(CMAKE_EXE_LINKER_FLAGS "-Wl,--no-threads" CACHE STRING "wasi-sdk build") + +set(CMAKE_SYSROOT ${WASI_SDK_PREFIX}/share/wasi-sysroot CACHE STRING "wasi-sdk build") +set(CMAKE_STAGING_PREFIX ${WASI_SDK_PREFIX}/share/wasi-sysroot CACHE STRING "wasi-sdk build") + +# Don't look in the sysroot for executables to run during the build +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# Only look in the sysroot (not in the host paths) for the rest +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) + +# Some other hacks +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON)