Skip to content

Commit f8bb90b

Browse files
[WASM] Refactoring build script for debuggability
1 parent 46ae51f commit f8bb90b

File tree

7 files changed

+99
-68
lines changed

7 files changed

+99
-68
lines changed

.github/workflows/main.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ jobs:
9696
name: packaging-scripts
9797
path: utils/webassembly
9898
- name: Pack test results
99-
run: tar cJf swift-test-results.tar.gz ../build/*/swift-macosx-x86_64/swift-test-results
99+
run: tar cJf swift-test-results.tar.gz ../target-build/*/swift-macosx-x86_64/swift-test-results
100100
- name: Upload test results
101101
uses: actions/upload-artifact@v1
102102
with:

utils/build-presets.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -2442,8 +2442,9 @@ skip-build-benchmarks
24422442
llvm-targets-to-build=X86;AArch64;WebAssembly
24432443
install-destdir=%(INSTALL_DESTDIR)s
24442444
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
2445-
llvm-install-components=clang
2445+
llvm-install-components=clang;compiler-rt;lld;llvm-ar;llvm-ranlib
24462446
install-swift
2447+
install-llvm
24472448
install-prefix=/%(TOOLCHAIN_NAME)s/usr
24482449

24492450
[preset: webassembly-host]
@@ -2457,7 +2458,6 @@ extra-cmake-options=
24572458
llbuild
24582459
swiftpm
24592460

2460-
install-llvm
24612461
install-swift
24622462
install-llbuild
24632463
install-swiftpm

utils/build-script-impl

+5
Original file line numberDiff line numberDiff line change
@@ -1610,6 +1610,11 @@ for host in "${ALL_HOSTS[@]}"; do
16101610

16111611
llvm_enable_projects=("clang")
16121612

1613+
# wasm: lld is necessary to sync compiler llvm version and lld llvm version
1614+
if [[ ! "${SKIP_BUILD_LLD}" ]]; then
1615+
llvm_enable_projects+=("lld")
1616+
fi
1617+
16131618
if [[ ! "${SKIP_BUILD_COMPILER_RT}" && ! $(is_cross_tools_host ${host}) ]]; then
16141619
llvm_enable_projects+=("compiler-rt")
16151620
fi

utils/webassembly/build-foundation.sh

+2-13
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ set -ex
33
DESTINATION_TOOLCHAIN=$1
44
SOURCE_PATH="$(cd "$(dirname $0)/../../.." && pwd)"
55

6-
# Remove host CoreFoundation (which can be different from the target) headers
7-
# to avoid shadowing the wasm32 target CoreFoundation
8-
rm -rf $DESTINATION_TOOLCHAIN/usr/lib/swift/CoreFoundation
9-
10-
FOUNDATION_BUILD="$SOURCE_PATH/build/Ninja-ReleaseAssert/foundation-wasi-wasm32"
6+
FOUNDATION_BUILD="$SOURCE_PATH/target-build/Ninja-ReleaseAssert/foundation-wasi-wasm32"
117

128
mkdir -p $FOUNDATION_BUILD
139
cd $FOUNDATION_BUILD
@@ -19,15 +15,8 @@ cmake -G Ninja \
1915
-DWASI_SDK_PATH="$SOURCE_PATH/wasi-sdk" \
2016
-DICU_ROOT="$SOURCE_PATH/icu_out" \
2117
-DBUILD_SHARED_LIBS=OFF \
18+
-DCMAKE_Swift_COMPILER_FORCED=ON \
2219
"${SOURCE_PATH}/swift-corelibs-foundation"
2320

2421
ninja -v
2522
ninja -v install
26-
27-
# On macOS the target CoreFoundation shadows the CoreFoundation suppplied by Xcode.
28-
# On Linux though there's no system CoreFoundation, its headers have to be shipped
29-
# in the installable archive and serve for both host and target.
30-
if [[ "$(uname)" == "Darwin" ]]; then
31-
mv $DESTINATION_TOOLCHAIN/usr/lib/swift/CoreFoundation \
32-
$DESTINATION_TOOLCHAIN/usr/lib/swift/wasi/wasm32/CoreFoundation
33-
fi

utils/webassembly/build-toolchain.sh

+84-48
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ case $(uname -s) in
1111
OS_SUFFIX=osx
1212
HOST_PRESET=webassembly-host
1313
TARGET_PRESET=webassembly-macos-target
14+
HOST_SUFFIX=macosx-x86_64
1415
;;
1516
Linux)
1617
OS_SUFFIX=linux
1718
HOST_PRESET=webassembly-linux-host
1819
TARGET_PRESET=webassembly-linux-target
20+
HOST_SUFFIX=linux-x86_64
1921
;;
2022
*)
2123
echo "Unrecognised platform $(uname -s)"
@@ -37,54 +39,88 @@ BUNDLE_IDENTIFIER="swiftwasm.5.3-${YEAR}${MONTH}${DAY}"
3739
DISPLAY_NAME_SHORT="Swift for WebAssembly 5.3 Snapshot"
3840
DISPLAY_NAME="${DISPLAY_NAME_SHORT} ${YEAR}-${MONTH}-${DAY}"
3941

42+
DIST_TOOLCHAIN_DESTDIR=$SOURCE_PATH/dist-toolchain-sdk
4043
HOST_TOOLCHAIN_DESTDIR=$SOURCE_PATH/host-toolchain-sdk
41-
HOST_TOOLCHAIN_SDK=$HOST_TOOLCHAIN_DESTDIR/$TOOLCHAIN_NAME
44+
TARGET_TOOLCHAIN_DESTDIR=$SOURCE_PATH/target-toolchain-sdk
4245

43-
# Avoid clang headers symlink issues
44-
mkdir -p $HOST_TOOLCHAIN_SDK/usr/lib/clang/10.0.0
45-
46-
# Build the host toolchain and SDK first.
47-
$SOURCE_PATH/swift/utils/build-script \
48-
--preset=$HOST_PRESET \
49-
INSTALL_DESTDIR="$HOST_TOOLCHAIN_DESTDIR" \
50-
TOOLCHAIN_NAME="$TOOLCHAIN_NAME" \
51-
C_CXX_LAUNCHER="$(which sccache)"
52-
53-
# Clean up the host toolchain build directory so that the next
54-
# `build-script` invocation doesn't pick up wrong CMake config files.
55-
# For some reason passing `--reconfigure` to `build-script` won't do this.
56-
rm -rf $SOURCE_PATH/build/Ninja-ReleaseAssert/swift-*
57-
58-
# build the cross-compilled toolchain
59-
$SOURCE_PATH/swift/utils/build-script \
60-
--preset=$TARGET_PRESET \
61-
INSTALL_DESTDIR="$SOURCE_PATH/install" \
62-
SOURCE_PATH="$SOURCE_PATH" \
63-
BUNDLE_IDENTIFIER="${BUNDLE_IDENTIFIER}" \
64-
DISPLAY_NAME="${DISPLAY_NAME}" \
65-
DISPLAY_NAME_SHORT="${DISPLAY_NAME_SHORT}" \
66-
TOOLCHAIN_NAME="${TOOLCHAIN_NAME}" \
67-
TOOLCHAIN_VERSION="${TOOLCHAIN_VERSION}" \
68-
C_CXX_LAUNCHER="$(which sccache)"
69-
70-
# Merge wasi-sdk and the toolchain
71-
cp -a $WASI_SDK_PATH/lib/clang $HOST_TOOLCHAIN_SDK/usr/lib
72-
cp -a $WASI_SDK_PATH/bin/{*ld,llvm-ar} $HOST_TOOLCHAIN_SDK/usr/bin
73-
cp -r $WASI_SDK_PATH/share/wasi-sysroot $HOST_TOOLCHAIN_SDK/usr/share
74-
75-
# Replace absolute sysroot path with relative path
76-
sed -i -e "s@\".*/include@\"../../../../share/wasi-sysroot/include@g" $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/swift/wasi/wasm32/wasi.modulemap
77-
78-
# Copy the target environment stdlib into the toolchain
79-
80-
# Avoid copying usr/lib/swift/clang because our toolchain's one is a directory
81-
# but nightly's one is symbolic link. A simple copy fails to merge them.
82-
rsync -v -a $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/lib/ $HOST_TOOLCHAIN_SDK/usr/lib/ --exclude 'swift/clang'
83-
rsync -v -a $SOURCE_PATH/install/$TOOLCHAIN_NAME/usr/bin/ $HOST_TOOLCHAIN_SDK/usr/bin/
84-
85-
# FIXME: avoid building foundation for now
86-
$UTILS_PATH/build-foundation.sh $HOST_TOOLCHAIN_SDK
87-
$UTILS_PATH/build-xctest.sh $HOST_TOOLCHAIN_SDK
88-
89-
cd $HOST_TOOLCHAIN_DESTDIR
46+
DIST_TOOLCHAIN_SDK=$DIST_TOOLCHAIN_DESTDIR/$TOOLCHAIN_NAME
47+
HOST_TOOLCHAIN_SDK=$HOST_TOOLCHAIN_DESTDIR/$TOOLCHAIN_NAME
48+
TARGET_TOOLCHAIN_SDK=$TARGET_TOOLCHAIN_DESTDIR/$TOOLCHAIN_NAME
49+
50+
51+
HOST_BUILD_ROOT=$SOURCE_PATH/host-build
52+
TARGET_BUILD_ROOT=$SOURCE_PATH/target-build
53+
HOST_BUILD_DIR=$HOST_BUILD_ROOT/Ninja-ReleaseAssert
54+
TARGET_BUILD_DIR=$TARGET_BUILD_ROOT/Ninja-ReleaseAssert
55+
56+
build_host_toolchain() {
57+
# Avoid clang headers symlink issues
58+
mkdir -p $HOST_TOOLCHAIN_SDK/usr/lib/clang/10.0.0
59+
# Build the host toolchain and SDK first.
60+
env SWIFT_BUILD_ROOT="$HOST_BUILD_ROOT" \
61+
$SOURCE_PATH/swift/utils/build-script \
62+
--preset=$HOST_PRESET \
63+
--build-dir="$HOST_BUILD_DIR" \
64+
INSTALL_DESTDIR="$HOST_TOOLCHAIN_DESTDIR" \
65+
TOOLCHAIN_NAME="$TOOLCHAIN_NAME" \
66+
C_CXX_LAUNCHER="$(which sccache)"
67+
}
68+
69+
build_target_toolchain() {
70+
mkdir -p $HOST_BUILD_DIR/
71+
# Copy the host build dir to reuse it.
72+
if [[ ! -e "$HOST_BUILD_DIR/llvm-$HOST_SUFFIX" ]]; then
73+
cp -r "$HOST_BUILD_DIR/llvm-$HOST_SUFFIX" "$TARGET_BUILD_DIR/llvm-$HOST_SUFFIX"
74+
# Clean up compiler-rt dir to cross compile it for host and wasm32
75+
(cd "$TARGET_BUILD_DIR/llvm-$HOST_SUFFIX" && ninja compiler-rt-clear)
76+
fi
77+
78+
# Avoid clang headers symlink issues
79+
mkdir -p $TARGET_TOOLCHAIN_SDK/usr/lib/clang/10.0.0
80+
81+
# build the cross-compilled toolchain
82+
env SWIFT_BUILD_ROOT="$TARGET_BUILD_ROOT" \
83+
$SOURCE_PATH/swift/utils/build-script \
84+
--preset=$TARGET_PRESET --reconfigure \
85+
--build-dir="$TARGET_BUILD_DIR" \
86+
INSTALL_DESTDIR="$TARGET_TOOLCHAIN_DESTDIR" \
87+
SOURCE_PATH="$SOURCE_PATH" \
88+
BUNDLE_IDENTIFIER="${BUNDLE_IDENTIFIER}" \
89+
DISPLAY_NAME="${DISPLAY_NAME}" \
90+
DISPLAY_NAME_SHORT="${DISPLAY_NAME_SHORT}" \
91+
TOOLCHAIN_NAME="${TOOLCHAIN_NAME}" \
92+
TOOLCHAIN_VERSION="${TOOLCHAIN_VERSION}" \
93+
C_CXX_LAUNCHER="$(which sccache)"
94+
95+
$UTILS_PATH/build-foundation.sh $TARGET_TOOLCHAIN_SDK
96+
$UTILS_PATH/build-xctest.sh $TARGET_TOOLCHAIN_SDK
97+
98+
}
99+
100+
merge_toolchains() {
101+
rm -rf "$DIST_TOOLCHAIN_DESTDIR"
102+
# Copy the base host toolchain
103+
cp -r "$HOST_TOOLCHAIN_DESTDIR" "$DIST_TOOLCHAIN_DESTDIR"
104+
105+
# Merge wasi-sdk and the toolchain
106+
cp -a $WASI_SDK_PATH/lib/clang $DIST_TOOLCHAIN_SDK/usr/lib
107+
cp -a $WASI_SDK_PATH/bin/{*ld,llvm-ar} $DIST_TOOLCHAIN_SDK/usr/bin
108+
cp -r $WASI_SDK_PATH/share/wasi-sysroot $DIST_TOOLCHAIN_SDK/usr/share
109+
110+
# Copy the target environment stdlib into the toolchain
111+
# Avoid copying usr/lib/swift/clang because our toolchain's one is a directory
112+
# but nightly's one is symbolic link. A simple copy fails to merge them.
113+
rsync -v -a $TARGET_TOOLCHAIN_SDK/usr/lib/ $DIST_TOOLCHAIN_SDK/usr/lib/ --exclude 'swift/clang'
114+
rsync -v -a $TARGET_TOOLCHAIN_SDK/usr/bin/ $DIST_TOOLCHAIN_SDK/usr/bin/
115+
116+
# Replace absolute sysroot path with relative path
117+
sed -i -e "s@\".*/include@\"../../../../share/wasi-sysroot/include@g" $DIST_TOOLCHAIN_SDK/usr/lib/swift/wasi/wasm32/wasi.modulemap
118+
}
119+
120+
build_host_toolchain
121+
build_target_toolchain
122+
123+
merge_toolchains
124+
125+
cd $DIST_TOOLCHAIN_DESTDIR
90126
tar cfz $PACKAGE_ARTIFACT $TOOLCHAIN_NAME

utils/webassembly/build-xctest.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ set -ex
33
DESTINATION_TOOLCHAIN=$1
44
SOURCE_PATH="$(cd "$(dirname $0)/../../.." && pwd)"
55

6-
BUILD_DIR="$SOURCE_PATH/build/Ninja-ReleaseAssert/xctest-wasi-wasm32"
6+
BUILD_DIR="$SOURCE_PATH/target-build/Ninja-ReleaseAssert/xctest-wasi-wasm32"
77

88
mkdir -p $BUILD_DIR
99
cd $BUILD_DIR
@@ -14,6 +14,7 @@ cmake -G Ninja \
1414
-DCMAKE_TOOLCHAIN_FILE="$SOURCE_PATH/swift/utils/webassembly/toolchain-wasi.cmake" \
1515
-DWASI_SDK_PATH="$SOURCE_PATH/wasi-sdk" \
1616
-DBUILD_SHARED_LIBS=OFF \
17+
-DCMAKE_Swift_COMPILER_FORCED=ON \
1718
-DSWIFT_FOUNDATION_PATH=$DESTINATION_TOOLCHAIN/usr/lib/swift/wasi/wasm32 \
1819
"${SOURCE_PATH}/swift-corelibs-xctest"
1920

utils/webassembly/ci.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fi
1313

1414
BUILD_SCRIPT=$UTILS_PATH/build-toolchain.sh
1515
RUN_TEST_BIN=$SWIFT_PATH/utils/run-test
16-
BUILD_DIR=$SOURCE_PATH/build/Ninja-ReleaseAssert
16+
TARGET_BUILD_DIR=$SOURCE_PATH/target-build/Ninja-ReleaseAssert
1717

1818
$DEPENDENCIES_SCRIPT
1919

@@ -29,10 +29,10 @@ $BUILD_SCRIPT $FLAGS
2929

3030
if [[ "$(uname)" == "Darwin" ]]; then
3131
# workaround: host target test directory is necessary to use run-test
32-
mkdir -p $BUILD_DIR/swift-macosx-x86_64/test-macosx-x86_64
32+
mkdir -p $TARGET_BUILD_DIR/swift-macosx-x86_64/test-macosx-x86_64
3333
fi
3434

35-
$RUN_TEST_BIN --build-dir $BUILD_DIR --target wasi-wasm32 test/stdlib/
35+
$RUN_TEST_BIN --build-dir $TARGET_BUILD_DIR --target wasi-wasm32 test/stdlib/
3636

3737
if [[ "$(uname)" == "Linux" ]]; then
3838
echo "Skip running test suites for Linux"

0 commit comments

Comments
 (0)