Skip to content
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
462d45e
adding stubs for embedded sdk built
daskruegge Mar 12, 2026
c16bd44
update JSKit version
daskruegge Mar 12, 2026
e8a5526
add makefile
daskruegge Mar 12, 2026
b2aff9a
no dynamic package dependencies
daskruegge Mar 13, 2026
f73cae2
phony
daskruegge Mar 13, 2026
53e4f80
easier makefile
daskruegge Mar 13, 2026
0d9c285
updates
daskruegge Mar 13, 2026
b982726
update github action
daskruegge Mar 13, 2026
bf587a3
fix
daskruegge Mar 13, 2026
c9358c8
remove package json scripts
daskruegge Mar 13, 2026
1117205
update JSKit
daskruegge Mar 16, 2026
91da0a3
Merge remote-tracking branch 'origin/main' into daskruegge/260312/emb…
daskruegge Mar 16, 2026
1b9afc3
resolve after merge
daskruegge Mar 16, 2026
713cf03
include swiftUnicodeDataTables via linkerSettings
daskruegge Mar 18, 2026
7d544ab
update package json
daskruegge Mar 18, 2026
948b2ed
use node script to install sdks
daskruegge Mar 18, 2026
f5816a1
use official sdk versions
daskruegge Mar 18, 2026
e1b8270
use swiftwasm/setup-swiftwasm github action
daskruegge Mar 18, 2026
10ae09b
Revert "use swiftwasm/setup-swiftwasm github action"
daskruegge Mar 18, 2026
5e52f41
add embedded builds to github action
daskruegge Mar 18, 2026
d3a435e
extra embedded build action
daskruegge Mar 18, 2026
ec4e660
rename action
daskruegge Mar 18, 2026
87dff4c
try with swiftly manually
daskruegge Mar 18, 2026
5f4e612
another try
daskruegge Mar 18, 2026
ef8f2c1
another try
daskruegge Mar 18, 2026
304212c
again
daskruegge Mar 18, 2026
e1331bb
Merge remote-tracking branch 'origin/main' into daskruegge/260312/emb…
daskruegge Mar 19, 2026
62195d4
add linker flag conditionally
daskruegge Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .github/workflows/swift-wasm-embedded.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Build Swift for WASM to verify the WebGPU WASM backend compiles.

name: Build (WASM - Embedded)

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
build:
name: Build (WASM - Embedded)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 24

- name: Read Swift version
id: swift-version
run: echo "version=$(cat .swift-version)" >> "$GITHUB_OUTPUT"

- name: Read CI versions
id: ci-versions
run: echo "tc=$(grep '^CI_TC_VERSION_EMBEDDED=' .swan-config | cut -d= -f2)" >> "$GITHUB_OUTPUT"

- uses: swift-actions/setup-swift@v3
with:
swift-version: "${{ steps.ci-versions.outputs.tc }}"
skip-verify-signature: true

- name: Install Swift WASM SDK
run: make sdk-install

- name: Build WebGPU (Embedded)
run: make wasm-build SWIFT_MODE=embedded

- name: Build BitonicSort (Embedded)
run: make wasm-build-bitonic SWIFT_MODE=embedded
26 changes: 6 additions & 20 deletions .github/workflows/swift-wasm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 24

- name: Read Swift version
id: swift-version
Expand All @@ -24,28 +27,11 @@ jobs:
swift-version: "${{ steps.swift-version.outputs.version }}"
skip-verify-signature: true

- name: Read WASM SDK version
id: wasm-sdk
run: |
sdk="$(cat .wasm-sdk-version)"
# sdk is e.g. "DEVELOPMENT-SNAPSHOT-2026-02-19-a-wasm32-unknown-wasip1"
# Extract the release tag by stripping the "-wasm32-*" triple suffix
tag="swift-wasm-${sdk%-wasm32-*}"
url="https://github.com/swiftwasm/swift/releases/download/${tag}/swift-wasm-${sdk}.artifactbundle.zip"
echo "version=${sdk}" >> "$GITHUB_OUTPUT"
echo "url=${url}" >> "$GITHUB_OUTPUT"

- name: Install Swift WASM SDK
run: |
checksum=$(curl -sL "${{ steps.wasm-sdk.outputs.url }}.sha256" | awk '{ print $1 }')
swift sdk install "${{ steps.wasm-sdk.outputs.url }}" --checksum "$checksum"
run: make sdk-install

- name: Build WebGPU
run: >
SWAN_WASM=1 swift build --target WebGPU
--swift-sdk "${{ steps.wasm-sdk.outputs.version }}"
run: make wasm-build

- name: Build BitonicSort
run: >
SWAN_WASM=1 swift build --target BitonicSort
--swift-sdk "${{ steps.wasm-sdk.outputs.version }}"
run: make wasm-build-bitonic
6 changes: 6 additions & 0 deletions .swan-config
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
CI_TC_VERSION_EMBEDDED=main-snapshot-2026-03-09
CI_SDK_VERSION_EMBEDDED=swift-DEVELOPMENT-SNAPSHOT-2026-03-09-a_wasm

# Versions matching a toolchain from Makefile
6.3-snapshot=swift-6.3-DEVELOPMENT-SNAPSHOT-2026-02-27-a_wasm
main-snapshot=swift-DEVELOPMENT-SNAPSHOT-2026-03-09-a_wasm
1 change: 0 additions & 1 deletion .wasm-sdk-version

This file was deleted.

8 changes: 4 additions & 4 deletions Demos/BitonicSort/BitonicSort.swift
Original file line number Diff line number Diff line change
Expand Up @@ -385,13 +385,13 @@ struct BitonicSortDemo {
}

mutating func handleKey(_ key: String) {
switch key.lowercased() {
case "r":
switch key {
case "r", "R":
self.resetSort()
case "p":
case "p", "P":
self.isPaused.toggle()
print(self.isPaused ? "Paused" : "Resumed")
case "h":
case "h", "H":
self.highlightMode.toggle()
print("Highlight mode: \(self.highlightMode ? "ON" : "OFF")")
default:
Expand Down
109 changes: 109 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
SWIFT_MODE ?=
DEBUG ?= 1

# Load SDK versions as Make variables (6.3-snapshot=..., main-snapshot=...)
include .swan-config

# Strip everything after "snapshot" to get SDK key
# e.g. 6.3-snapshot-2026-03-05 -> 6.3-snapshot
_SWIFT_TC := $(shell cat .swift-version)
_SDK_KEY := $(firstword $(subst snapshot,snapshot ,$(_SWIFT_TC)))
# if CI is set to "true" and SWIFT_MODE is "embedded", _SDK_BASE should be read from CI_SDK_VERSION_EMBEDDED in .swan-config
_SDK_BASE := $(if $(and $(filter true,$(CI)),$(filter embedded,$(SWIFT_MODE))),$(CI_SDK_VERSION_EMBEDDED),$($(_SDK_KEY)))

SWIFT_SDK ?= $(if $(_SDK_BASE),$(_SDK_BASE)$(if $(filter embedded,$(SWIFT_MODE)),-embedded))

BUILD_CONFIG := $(if $(filter 0 false,$(DEBUG)),release,debug)

.PHONY: help
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*##' $(firstword $(MAKEFILE_LIST)) | \
awk 'BEGIN {FS = ":.*## "}; {printf " \033[36m%-25s\033[0m %s\n", $$1, $$2}'
@echo ""
@echo "Environment variables:"
@echo " SWIFT_MODE embedded (append -embedded to SDK) Default: (none)"
@echo " SWIFT_SDK Override derived SDK Default: $(_SDK_BASE)"
@echo " DEBUG 1 or true = debug, 0 or false = release Default: 1"
@echo ""
@echo "Current toolchain: $(_SWIFT_TC)"
@echo "Derived SDK: $(SWIFT_SDK)"
@echo ""
@echo "WASM SDK versions can be downloaded from: https://github.com/swiftwasm/swift/releases"
@echo ""
@echo "Examples:"
@echo " make build # native debug build"
@echo " make build DEBUG=0 # native release build"
@echo " make wasm-build # WASM build"
@echo " make wasm-build SWIFT_MODE=embedded # embedded WASM build"
@echo " make wasm-all DEBUG=0 # clean + release WASM build"
@echo " make wasm-all SWIFT_MODE=embedded DEBUG=0 # clean + release embedded build"

.PHONY: debug
debug: ## Echo all Make variables
@echo "CI: $(CI)"
@echo "DEBUG: $(DEBUG)"
@echo "BUILD_CONFIG: $(BUILD_CONFIG)"
@echo "SWIFT_MODE: $(SWIFT_MODE)"
@echo "SWIFT_SDK: $(SWIFT_SDK)"
@echo "_SWIFT_TC: $(_SWIFT_TC)"
@echo "_SDK_KEY: $(_SDK_KEY)"
@echo "_SDK_BASE: $(_SDK_BASE)"

.PHONY: swift-setup
swift-setup: ## Install and activate Swift toolchain
swiftly install && swiftly use

.PHONY: sdk-install
sdk-install: ## Download and install the current SWIFT_SDK
node Scripts/sdk-install.mjs "$(_SDK_BASE)"

.PHONY: build
build: ## Native Swift build (DEBUG)
swift build -c $(BUILD_CONFIG)

.PHONY: test
test: ## Run Swift tests
swift test

.PHONY: clean
clean: ## Clean build artifacts
swift package clean

.PHONY: resolve
resolve: ## Resolve Swift package dependencies
swift package resolve

.PHONY: format
format: ## Format Swift source code
swift format --in-place --recursive Sources Tests Demos

.PHONY: generate-apinotes
generate-apinotes: ## Generate Dawn API notes
swift package --allow-writing-to-package-directory generate-dawn-apinotes

.PHONY: run-gameoflife
run-gameoflife: ## Run GameOfLife demo
swift run GameOfLife

.PHONY: run-bitonic
run-bitonic: ## Run BitonicSort demo
swift run BitonicSort

.PHONY: wasm-build-bridgejs
wasm-build-bridgejs: ## Generate BridgeJS bindings (SWIFT_MODE)
SWAN_WASM=1 swift package --swift-sdk $(SWIFT_SDK) plugin --allow-writing-to-package-directory bridge-js

.PHONY: wasm-build
wasm-build: wasm-build-bridgejs ## WASM build, depends on bridgejs (SWIFT_MODE, DEBUG)
SWAN_WASM=1 swift build --swift-sdk $(SWIFT_SDK) --target WebGPU -c $(BUILD_CONFIG)

.PHONY: wasm-all
wasm-all: clean wasm-build ## Clean + full WASM build

.PHONY: wasm-build-bitonic
wasm-build-bitonic: wasm-build-bridgejs ## WASM build BitonicSort, depends on bridgejs (SWIFT_MODE, DEBUG)
SWAN_WASM=1 swift build --swift-sdk $(SWIFT_SDK) --target BitonicSort -c $(BUILD_CONFIG)

.PHONY: wasm-run-bitonic
wasm-run-bitonic: wasm-build-bitonic ## Build and serve BitonicSort WASM demo (SWIFT_MODE)
SWAN_WASM=1 swift package --swift-sdk $(SWIFT_SDK) js --product BitonicSort -c $(BUILD_CONFIG) && pnpx serve .
11 changes: 10 additions & 1 deletion Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading