Skip to content

Commit cca34d1

Browse files
committed
WIP
1 parent bea8ba0 commit cca34d1

2 files changed

Lines changed: 70 additions & 133 deletions

File tree

.github/workflows/wasm.yml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,12 @@ jobs:
1111
steps:
1212
- uses: actions/checkout@v4
1313

14+
# Use Swift 6.0.3 to match the pinned SDK version in build-and-test-wasm.sh
15+
# The script will automatically install the 6.0.3-RELEASE WASM SDK
1416
- name: Install Swift
1517
uses: swift-actions/setup-swift@v2
1618
with:
1719
swift-version: "6.0.3"
1820

19-
# Wasmtime is required because `swift test` doesn't work for WebAssembly targets.
20-
# For WASM, we must build tests separately and run them with a WASM runtime.
21-
# See: https://book.swiftwasm.org/getting-started/testing.html
22-
- name: Install Wasmtime
23-
run: |
24-
curl https://wasmtime.dev/install.sh -sSf | bash
25-
echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH
26-
2721
- name: Build and Test
2822
run: ./scripts/build-and-test-wasm.sh

scripts/build-and-test-wasm.sh

Lines changed: 68 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -6,161 +6,104 @@ echo "🌐 Building and Testing Matft for WebAssembly"
66
echo "🌐 =========================================="
77
echo ""
88

9-
# SDK checksums for different Swift versions
10-
# The SDK version must match the Swift compiler version
11-
get_sdk_checksum() {
12-
local VERSION="$1"
13-
case "$VERSION" in
14-
"6.0.3-RELEASE") echo "31d3585b06dd92de390bacc18527801480163188cd7473f492956b5e213a8618" ;;
15-
"6.1-RELEASE") echo "7550b4c77a55f4b637c376f5d192f297fe185607003a6212ad608276928db992" ;;
16-
*) echo "" ;;
17-
esac
18-
}
9+
# Pinned SDK version for reproducible builds (same on CI and local)
10+
PINNED_SDK_VERSION="6.0.3-RELEASE"
11+
PINNED_SDK_NAME="6.0.3-RELEASE-wasm32-unknown-wasi"
12+
PINNED_SDK_CHECKSUM="31d3585b06dd92de390bacc18527801480163188cd7473f492956b5e213a8618"
13+
PINNED_SDK_URL="https://github.com/swiftwasm/swift/releases/download/swift-wasm-${PINNED_SDK_VERSION}/swift-wasm-${PINNED_SDK_VERSION}-wasm32-unknown-wasi.artifactbundle.zip"
1914

20-
# Swift command to use (may be overridden if toolchain detected)
21-
SWIFT_CMD="swift"
22-
USING_DEV_TOOLCHAIN=false
23-
DEV_TOOLCHAIN_DATE=""
24-
SWIFT_VERSION=""
15+
SWIFT_CMD=""
16+
SWIFT_SDK_NAME=""
2517

26-
# Detect development snapshot toolchain with WASM support
27-
detect_toolchain() {
28-
echo "🔍 Detecting Swift toolchain..."
18+
# Setup Swift command
19+
setup_swift() {
20+
echo "📦 Setting up Swift..."
2921

30-
# Check for development snapshot toolchains in the standard location
22+
# Check for local SwiftWasm toolchain first (macOS development with newer SDK)
3123
TOOLCHAIN_DIR="$HOME/Library/Developer/Toolchains"
32-
3324
if [ -d "$TOOLCHAIN_DIR" ]; then
34-
# Find the most recent development snapshot toolchain
35-
TOOLCHAIN=$(ls -1 "$TOOLCHAIN_DIR" 2>/dev/null | grep -E "swift-DEVELOPMENT-SNAPSHOT.*\.xctoolchain" | sort -r | head -1)
25+
# Look for development snapshot toolchain (needed for newer macOS SDKs)
26+
local WASM_TOOLCHAIN=$(ls -1 "$TOOLCHAIN_DIR" 2>/dev/null | grep -E "swift-DEVELOPMENT-SNAPSHOT.*\.xctoolchain" | sort -r | head -1)
3627

37-
if [ -n "$TOOLCHAIN" ]; then
38-
TOOLCHAIN_SWIFT="$TOOLCHAIN_DIR/$TOOLCHAIN/usr/bin/swift"
28+
if [ -n "$WASM_TOOLCHAIN" ]; then
29+
local TOOLCHAIN_SWIFT="$TOOLCHAIN_DIR/$WASM_TOOLCHAIN/usr/bin/swift"
3930
if [ -x "$TOOLCHAIN_SWIFT" ]; then
4031
SWIFT_CMD="$TOOLCHAIN_SWIFT"
41-
USING_DEV_TOOLCHAIN=true
42-
# Extract date from toolchain name (e.g., 2025-11-03)
43-
DEV_TOOLCHAIN_DATE=$(echo "$TOOLCHAIN" | grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2}")
44-
echo "✅ Found development toolchain: $TOOLCHAIN"
32+
echo "✅ Using local development toolchain: $WASM_TOOLCHAIN"
33+
local VERSION=$($SWIFT_CMD --version 2>/dev/null | head -1)
34+
echo " Version: $VERSION"
35+
echo ""
4536
return 0
4637
fi
4738
fi
4839
fi
4940

50-
echo "ℹ️ Using system Swift"
51-
return 0
52-
}
53-
54-
# Find matching SDK for development toolchain
55-
find_dev_sdk() {
56-
local INSTALLED_SDKS=$($SWIFT_CMD sdk list 2>/dev/null || echo "")
57-
58-
# First, try to find SDK matching the exact toolchain date
59-
if [ -n "$DEV_TOOLCHAIN_DATE" ]; then
60-
local SDK_MATCH=$(echo "$INSTALLED_SDKS" | grep "DEVELOPMENT-SNAPSHOT-${DEV_TOOLCHAIN_DATE}" | grep -E "wasm32-unknown-wasi(p1-threads)?$" | grep -v "embedded" | head -1)
61-
if [ -n "$SDK_MATCH" ]; then
62-
echo "$SDK_MATCH"
63-
return 0
64-
fi
65-
fi
66-
67-
# Fall back to any development snapshot SDK (prefer threads variant)
68-
local SDK_MATCH=$(echo "$INSTALLED_SDKS" | grep "DEVELOPMENT-SNAPSHOT" | grep "wasm32-unknown-wasip1-threads$" | grep -v "embedded" | sort -r | head -1)
69-
if [ -n "$SDK_MATCH" ]; then
70-
echo "$SDK_MATCH"
71-
return 0
72-
fi
73-
74-
# Try non-threads variant
75-
SDK_MATCH=$(echo "$INSTALLED_SDKS" | grep "DEVELOPMENT-SNAPSHOT" | grep -E "wasm32-unknown-wasi$" | grep -v "embedded" | sort -r | head -1)
76-
if [ -n "$SDK_MATCH" ]; then
77-
echo "$SDK_MATCH"
41+
# Use system Swift (CI environment)
42+
if command -v swift &> /dev/null; then
43+
SWIFT_CMD="swift"
44+
local VERSION=$($SWIFT_CMD --version 2>/dev/null | head -1)
45+
echo "✅ Using system Swift"
46+
echo " Version: $VERSION"
47+
echo ""
7848
return 0
7949
fi
8050

81-
return 1
51+
echo "❌ No Swift installation found"
52+
exit 1
8253
}
8354

84-
# Detect Swift version and determine matching SDK
85-
detect_swift_version() {
86-
# Get Swift version (e.g., "6.0.3" or "6.1")
87-
local VERSION_OUTPUT=$($SWIFT_CMD --version 2>/dev/null)
88-
SWIFT_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE "Swift version [0-9]+\.[0-9]+(\.[0-9]+)?" | head -1 | sed 's/Swift version //')
89-
90-
if [ -z "$SWIFT_VERSION" ]; then
91-
echo "⚠️ Could not detect Swift version, defaulting to 6.0.3"
92-
SWIFT_VERSION="6.0.3"
93-
fi
94-
95-
echo " Swift version: $SWIFT_VERSION"
96-
}
97-
98-
# Check and configure the appropriate SDK
99-
ensure_swift_wasm_sdk() {
100-
echo "📦 Checking for Swift WASM SDK..."
55+
# Find or install the WASM SDK
56+
setup_wasm_sdk() {
57+
echo "📦 Setting up WASM SDK..."
10158

10259
local INSTALLED_SDKS=$($SWIFT_CMD sdk list 2>/dev/null || echo "")
10360

104-
if [ "$USING_DEV_TOOLCHAIN" = true ]; then
105-
# For development toolchains, we need a matching development snapshot SDK
106-
echo " Using development toolchain - looking for compatible development SDK..."
61+
# For development toolchain, try to find matching development SDK first
62+
if echo "$SWIFT_CMD" | grep -q "DEVELOPMENT-SNAPSHOT"; then
63+
local TOOLCHAIN_DATE=$(echo "$SWIFT_CMD" | grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2}")
64+
if [ -n "$TOOLCHAIN_DATE" ]; then
65+
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep "DEVELOPMENT-SNAPSHOT-${TOOLCHAIN_DATE}" | grep -E "wasm32-unknown-wasi" | grep -v "embedded" | head -1)
66+
if [ -n "$SWIFT_SDK_NAME" ]; then
67+
echo "✅ Found matching development SDK: $SWIFT_SDK_NAME"
68+
echo ""
69+
return 0
70+
fi
71+
fi
10772

108-
SWIFT_SDK_NAME=$(find_dev_sdk)
73+
# Fallback to any development snapshot SDK
74+
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep "DEVELOPMENT-SNAPSHOT" | grep "wasm32-unknown-wasip1-threads$" | grep -v "embedded" | sort -r | head -1)
10975
if [ -n "$SWIFT_SDK_NAME" ]; then
110-
echo "✅ Found compatible SDK: $SWIFT_SDK_NAME"
76+
echo "✅ Found development SDK: $SWIFT_SDK_NAME"
11177
echo ""
11278
return 0
11379
fi
80+
fi
11481

115-
echo "❌ No compatible development SDK found for toolchain date: $DEV_TOOLCHAIN_DATE"
116-
echo " Development toolchains require matching development snapshot SDKs."
117-
echo " Available SDKs:"
118-
echo "$INSTALLED_SDKS" | grep -E "DEVELOPMENT-SNAPSHOT.*wasm" | sed 's/^/ /'
119-
echo ""
120-
echo " Install a matching SDK from: https://github.com/swiftwasm/swift/releases"
121-
exit 1
122-
else
123-
# For stable Swift, detect version and use matching SDK
124-
detect_swift_version
125-
126-
# Determine SDK version based on Swift version
127-
local SDK_VERSION="${SWIFT_VERSION}-RELEASE"
128-
local SDK_CHECKSUM=$(get_sdk_checksum "$SDK_VERSION")
129-
130-
if [ -z "$SDK_CHECKSUM" ]; then
131-
echo "❌ No SDK checksum found for Swift version $SWIFT_VERSION"
132-
echo " Supported versions: 6.0.3, 6.1"
133-
exit 1
134-
fi
135-
136-
local SDK_URL="https://github.com/swiftwasm/swift/releases/download/swift-wasm-${SDK_VERSION}/swift-wasm-${SDK_VERSION}-wasm32-unknown-wasi.artifactbundle.zip"
137-
138-
echo " Required SDK: swift-wasm-${SDK_VERSION}"
82+
# Use pinned stable SDK (CI and local fallback)
83+
echo " Looking for pinned SDK: $PINNED_SDK_NAME"
13984

140-
# Check for the required stable SDK version
141-
if echo "$INSTALLED_SDKS" | grep -qE "(^|swift-wasm-)${SDK_VERSION}[_-]wasm32-unknown-wasi"; then
142-
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep -E "(^|swift-wasm-)${SDK_VERSION}[_-]wasm32-unknown-wasi" | head -1)
143-
echo "✅ Found required SDK: $SWIFT_SDK_NAME"
144-
echo ""
145-
return 0
146-
fi
147-
148-
# SDK not found, install it
149-
echo "⬇️ Installing Swift WASM SDK ${SDK_VERSION}..."
150-
$SWIFT_CMD sdk install "$SDK_URL" --checksum "$SDK_CHECKSUM"
85+
if echo "$INSTALLED_SDKS" | grep -qE "(^|swift-wasm-)${PINNED_SDK_VERSION}[_-]wasm32-unknown-wasi"; then
86+
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep -E "(^|swift-wasm-)${PINNED_SDK_VERSION}[_-]wasm32-unknown-wasi" | head -1)
87+
echo "✅ Found pinned SDK: $SWIFT_SDK_NAME"
88+
echo ""
89+
return 0
90+
fi
15191

152-
# Verify installation
153-
INSTALLED_SDKS=$($SWIFT_CMD sdk list 2>/dev/null || echo "")
154-
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep -E "(^|swift-wasm-)${SDK_VERSION}[_-]wasm32-unknown-wasi" | head -1)
92+
# Install the pinned SDK
93+
echo "⬇️ Installing WASM SDK ${PINNED_SDK_VERSION}..."
94+
$SWIFT_CMD sdk install "$PINNED_SDK_URL" --checksum "$PINNED_SDK_CHECKSUM"
15595

156-
if [ -z "$SWIFT_SDK_NAME" ]; then
157-
echo "❌ Failed to verify SDK installation"
158-
exit 1
159-
fi
96+
# Verify installation
97+
INSTALLED_SDKS=$($SWIFT_CMD sdk list 2>/dev/null || echo "")
98+
SWIFT_SDK_NAME=$(echo "$INSTALLED_SDKS" | grep -E "(^|swift-wasm-)${PINNED_SDK_VERSION}[_-]wasm32-unknown-wasi" | head -1)
16099

161-
echo "✅ Swift WASM SDK ${SDK_VERSION} installed successfully"
162-
echo ""
100+
if [ -z "$SWIFT_SDK_NAME" ]; then
101+
echo "❌ Failed to install SDK"
102+
exit 1
163103
fi
104+
105+
echo "✅ SDK installed: $SWIFT_SDK_NAME"
106+
echo ""
164107
}
165108

166109
# Check if wasmtime is installed
@@ -222,8 +165,8 @@ run_tests() {
222165
}
223166

224167
# Main execution
225-
detect_toolchain
226-
ensure_swift_wasm_sdk
168+
setup_swift
169+
setup_wasm_sdk
227170
install_wasmtime
228171
build_project
229172
run_tests

0 commit comments

Comments
 (0)