diff --git a/utils/update_checkout/update-checkout-config.json b/utils/update_checkout/update-checkout-config.json index 7798cf87c4aa9..2335ae92739a7 100644 --- a/utils/update_checkout/update-checkout-config.json +++ b/utils/update_checkout/update-checkout-config.json @@ -67,7 +67,7 @@ "cmark": "master", "llbuild": "master", "swiftpm": "swiftwasm", - "swift-argument-parser": "0.0.5", + "swift-argument-parser": "0.0.6", "swift-driver": "master", "swift-syntax": "master", "swift-stress-tester": "master", diff --git a/utils/webassembly/build-foundation.sh b/utils/webassembly/build-foundation.sh new file mode 100755 index 0000000000000..6d15e0ba5b216 --- /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 \ No newline at end of file diff --git a/utils/webassembly/build-toolchain.sh b/utils/webassembly/build-toolchain.sh index fbfceedb83afe..38029ec10bf60 100755 --- a/utils/webassembly/build-toolchain.sh +++ b/utils/webassembly/build-toolchain.sh @@ -35,6 +35,9 @@ BUNDLE_IDENTIFIER="swiftwasm.${YEAR}${MONTH}${DAY}" DISPLAY_NAME_SHORT="Swift for WebAssembly Development Snapshot" DISPLAY_NAME="${DISPLAY_NAME_SHORT} ${YEAR}-${MONTH}-${DAY}" +# Make sure Clang headers install dir exists to avoid broken symlinks +mkdir -p $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/clang/10.0.0 + $SOURCE_PATH/swift/utils/build-script --preset=$PRESET_NAME \ SOURCE_PATH="$SOURCE_PATH" \ INSTALLABLE_PACKAGE="$INSTALLABLE_PACKAGE" \ @@ -77,5 +80,7 @@ else cp -r $NIGHTLY_TOOLCHAIN/usr/lib/swift/macosx $TMP_DIR/$TOOLCHAIN_NAME/usr/lib/swift fi +$UTILS_PATH/build-foundation.sh $TMP_DIR/$TOOLCHAIN_NAME + cd $TMP_DIR tar cfz $PACKAGE_ARTIFACT $TOOLCHAIN_NAME 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 7c4361401880e..ccdaf88b3e4d5 100755 --- a/utils/webassembly/linux/install-dependencies.sh +++ b/utils/webassembly/linux/install-dependencies.sh @@ -20,23 +20,23 @@ 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.2/cmake-3.17.2-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 +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`. @@ -44,7 +44,9 @@ ln -s wasm32-wasi wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi-unknown # 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 diff --git a/utils/webassembly/macos/install-dependencies.sh b/utils/webassembly/macos/install-dependencies.sh index 28845d43df520..026e3e32f317c 100755 --- a/utils/webassembly/macos/install-dependencies.sh +++ b/utils/webassembly/macos/install-dependencies.sh @@ -13,16 +13,7 @@ cd $SWIFT_PATH cd $SOURCE_PATH -WASI_SDK_URL="https://github.com/swiftwasm/wasi-sdk/releases/download/0.2.0-swiftwasm/dist-macos-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 -macos.tar.gz) -tar xfz $WASI_SDK_TAR_PATH -rm -rf ./wasi-sdk -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/toolchain-wasi.cmake b/utils/webassembly/toolchain-wasi.cmake index 2cf36de407293..b76d0940ca8ab 100644 --- a/utils/webassembly/toolchain-wasi.cmake +++ b/utils/webassembly/toolchain-wasi.cmake @@ -1,20 +1,17 @@ -set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_NAME WASI) 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 "${WASI_SDK_PATH}/bin/clang") +set(CMAKE_CXX_COMPILER "${WASI_SDK_PATH}/bin/clang++") +set(CMAKE_AR "${WASI_SDK_PATH}/bin/llvm-ar" CACHE STRING "wasi-sdk build") +set(CMAKE_RANLIB "${WASI_SDK_PATH}/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") +set(CMAKE_SYSROOT ${WASI_SDK_PATH}/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)