|
| 1 | +#!/bin/bash |
| 2 | +set -e |
| 3 | + |
| 4 | +echo "🌐 ==========================================" |
| 5 | +echo "🌐 Building and Testing Matft for WebAssembly" |
| 6 | +echo "🌐 ==========================================" |
| 7 | +echo "" |
| 8 | + |
| 9 | +# Configuration for CI (GitHub Actions) |
| 10 | +SWIFT_WASM_SDK_URL="https://github.com/swiftwasm/swift/releases/download/swift-wasm-6.0.3-RELEASE/swift-wasm-6.0.3-RELEASE-wasm32-unknown-wasi.artifactbundle.zip" |
| 11 | +SWIFT_WASM_SDK_CHECKSUM="31d3585b06dd92de390bacc18527801480163188cd7473f492956b5e213a8618" |
| 12 | +CI_SDK_NAME="wasm32-unknown-wasi" |
| 13 | + |
| 14 | +# Swift command to use (may be overridden if toolchain detected) |
| 15 | +SWIFT_CMD="swift" |
| 16 | + |
| 17 | +# Detect development snapshot toolchain with WASM support |
| 18 | +detect_toolchain() { |
| 19 | + echo "🔍 Detecting Swift toolchain..." |
| 20 | + |
| 21 | + # Check for development snapshot toolchains in the standard location |
| 22 | + TOOLCHAIN_DIR="$HOME/Library/Developer/Toolchains" |
| 23 | + |
| 24 | + if [ -d "$TOOLCHAIN_DIR" ]; then |
| 25 | + # Find the most recent development snapshot toolchain |
| 26 | + TOOLCHAIN=$(ls -1 "$TOOLCHAIN_DIR" 2>/dev/null | grep -E "swift-DEVELOPMENT-SNAPSHOT.*\.xctoolchain" | sort -r | head -1) |
| 27 | + |
| 28 | + if [ -n "$TOOLCHAIN" ]; then |
| 29 | + TOOLCHAIN_SWIFT="$TOOLCHAIN_DIR/$TOOLCHAIN/usr/bin/swift" |
| 30 | + if [ -x "$TOOLCHAIN_SWIFT" ]; then |
| 31 | + SWIFT_CMD="$TOOLCHAIN_SWIFT" |
| 32 | + echo "✅ Found development toolchain: $TOOLCHAIN" |
| 33 | + return 0 |
| 34 | + fi |
| 35 | + fi |
| 36 | + fi |
| 37 | + |
| 38 | + echo "ℹ️ Using system Swift" |
| 39 | + return 0 |
| 40 | +} |
| 41 | + |
| 42 | +# Detect available WASM SDK |
| 43 | +detect_wasm_sdk() { |
| 44 | + echo "📦 Detecting WASM SDK..." |
| 45 | + |
| 46 | + # Get list of installed SDKs |
| 47 | + INSTALLED_SDKS=$($SWIFT_CMD sdk list 2>/dev/null || echo "") |
| 48 | + |
| 49 | + # First, check if the CI SDK is available (for GitHub Actions) |
| 50 | + if echo "$INSTALLED_SDKS" | grep -q "^${CI_SDK_NAME}$"; then |
| 51 | + SWIFT_SDK_NAME="$CI_SDK_NAME" |
| 52 | + echo "✅ Found SDK: $SWIFT_SDK_NAME" |
| 53 | + return 0 |
| 54 | + fi |
| 55 | + |
| 56 | + # For local development with development toolchains, prefer matching SDKs |
| 57 | + # Extract toolchain version if using a development toolchain |
| 58 | + if echo "$SWIFT_CMD" | grep -q "DEVELOPMENT-SNAPSHOT"; then |
| 59 | + TOOLCHAIN_VERSION=$(echo "$SWIFT_CMD" | grep -oE "DEVELOPMENT-SNAPSHOT-[0-9]{4}-[0-9]{2}-[0-9]{2}-a") |
| 60 | + if [ -n "$TOOLCHAIN_VERSION" ]; then |
| 61 | + SDK_MATCH=$(echo "$INSTALLED_SDKS" | grep "$TOOLCHAIN_VERSION" | grep -v "embedded" | head -1) |
| 62 | + if [ -n "$SDK_MATCH" ]; then |
| 63 | + SWIFT_SDK_NAME="$SDK_MATCH" |
| 64 | + echo "✅ Found matching SDK: $SWIFT_SDK_NAME" |
| 65 | + return 0 |
| 66 | + fi |
| 67 | + fi |
| 68 | + fi |
| 69 | + |
| 70 | + # Try to find any WASM SDK (prefer development snapshots with threads for local dev) |
| 71 | + for pattern in "DEVELOPMENT-SNAPSHOT.*wasm32-unknown-wasip1-threads$" "swift-.*-RELEASE_wasm$" "wasm32-unknown-wasi" "wasm"; do |
| 72 | + SDK_MATCH=$(echo "$INSTALLED_SDKS" | grep -E "$pattern" | grep -v "embedded" | head -1) |
| 73 | + if [ -n "$SDK_MATCH" ]; then |
| 74 | + SWIFT_SDK_NAME="$SDK_MATCH" |
| 75 | + echo "✅ Found SDK: $SWIFT_SDK_NAME" |
| 76 | + return 0 |
| 77 | + fi |
| 78 | + done |
| 79 | + |
| 80 | + return 1 |
| 81 | +} |
| 82 | + |
| 83 | +# Install Swift WASM SDK if not found |
| 84 | +install_swift_wasm_sdk() { |
| 85 | + if detect_wasm_sdk; then |
| 86 | + echo "" |
| 87 | + return 0 |
| 88 | + fi |
| 89 | + |
| 90 | + echo "⬇️ No WASM SDK found. Installing Swift WASM SDK..." |
| 91 | + $SWIFT_CMD sdk install "$SWIFT_WASM_SDK_URL" --checksum "$SWIFT_WASM_SDK_CHECKSUM" |
| 92 | + SWIFT_SDK_NAME="$CI_SDK_NAME" |
| 93 | + echo "✅ Swift WASM SDK installed successfully" |
| 94 | + echo "" |
| 95 | +} |
| 96 | + |
| 97 | +# Check if wasmtime is installed |
| 98 | +install_wasmtime() { |
| 99 | + echo "🔧 Checking wasmtime..." |
| 100 | + if command -v wasmtime &> /dev/null; then |
| 101 | + echo "✅ wasmtime already installed: $(wasmtime --version)" |
| 102 | + else |
| 103 | + echo "⬇️ Installing wasmtime..." |
| 104 | + curl https://wasmtime.dev/install.sh -sSf | bash |
| 105 | + export PATH="$HOME/.wasmtime/bin:$PATH" |
| 106 | + echo "✅ wasmtime installed successfully" |
| 107 | + fi |
| 108 | + echo "" |
| 109 | +} |
| 110 | + |
| 111 | +# Build the project |
| 112 | +build_project() { |
| 113 | + echo "🔨 Building project for WebAssembly..." |
| 114 | + echo " Swift: $SWIFT_CMD" |
| 115 | + echo " SDK: $SWIFT_SDK_NAME" |
| 116 | + $SWIFT_CMD build --swift-sdk "$SWIFT_SDK_NAME" |
| 117 | + echo "✅ Build completed successfully!" |
| 118 | + echo "" |
| 119 | +} |
| 120 | + |
| 121 | +# Build and run tests |
| 122 | +run_tests() { |
| 123 | + echo "🧪 Building tests for WebAssembly..." |
| 124 | + $SWIFT_CMD build --build-tests --swift-sdk "$SWIFT_SDK_NAME" |
| 125 | + echo "✅ Test build completed!" |
| 126 | + echo "" |
| 127 | + |
| 128 | + echo "🚀 Running tests with wasmtime..." |
| 129 | + # Note: We use wasmtime instead of 'swift test' because swift test doesn't |
| 130 | + # work directly for WebAssembly targets. For WASM, we must build tests |
| 131 | + # separately and run them with a WASM runtime. |
| 132 | + # See: https://book.swiftwasm.org/getting-started/testing.html |
| 133 | + |
| 134 | + # Find the test binary in any wasm build directory |
| 135 | + TEST_BINARY=$(find .build -path "*/debug/MatftPackageTests.wasm" -o -path "*/debug/MatftPackageTests.xctest" 2>/dev/null | grep -E "wasm|wasi" | head -1) |
| 136 | + |
| 137 | + if [ -z "$TEST_BINARY" ]; then |
| 138 | + echo "❌ Error: Could not find test binary" |
| 139 | + echo " Searched in .build/*/debug/ for MatftPackageTests.wasm or .xctest" |
| 140 | + exit 1 |
| 141 | + fi |
| 142 | + |
| 143 | + echo "📍 Test binary: $TEST_BINARY" |
| 144 | + |
| 145 | + # Determine wasmtime flags based on SDK type |
| 146 | + WASMTIME_FLAGS="--dir ." |
| 147 | + if echo "$SWIFT_SDK_NAME" | grep -q "threads"; then |
| 148 | + WASMTIME_FLAGS="$WASMTIME_FLAGS --wasm threads=y --wasi threads=y" |
| 149 | + fi |
| 150 | + |
| 151 | + wasmtime run $WASMTIME_FLAGS "$TEST_BINARY" |
| 152 | + echo "" |
| 153 | +} |
| 154 | + |
| 155 | +# Main execution |
| 156 | +detect_toolchain |
| 157 | +install_swift_wasm_sdk |
| 158 | +install_wasmtime |
| 159 | +build_project |
| 160 | +run_tests |
| 161 | + |
| 162 | +echo "🎉 ==========================================" |
| 163 | +echo "🎉 All WASM tests passed successfully!" |
| 164 | +echo "🎉 ==========================================" |
0 commit comments