Skip to content

Commit 2207551

Browse files
committed
Add CI runner for WASM build
Closes KDAB#414
1 parent 64d84f3 commit 2207551

File tree

2 files changed

+130
-1
lines changed

2 files changed

+130
-1
lines changed

.github/workflows/github-cxx-qt-tests.yml

+129
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,135 @@ jobs:
8888
token: ${{ secrets.CODECOV_TOKEN }}
8989
verbose: true
9090

91+
build-wasm:
92+
name: Ubuntu 22.04 (wasm_32) Qt 6
93+
needs: [clang_format, license_check, rust_format_check, markdown_lint, shellcheck]
94+
runs-on: ubuntu-22.04
95+
env:
96+
SCCACHE_CACHE_SIZE: 600M
97+
steps:
98+
- name: "Checkout repository"
99+
uses: actions/checkout@v4
100+
- name: Setup toolchain
101+
run: |
102+
rustup component add clippy rustfmt
103+
rustup target add wasm32-unknown-emscripten
104+
- name: "Rust tools cache"
105+
uses: actions/cache@v4
106+
id: rust-tools-cache
107+
with:
108+
path: |
109+
~/.cargo/bin/sccache
110+
~/.cargo/bin/mdbook
111+
~/.cargo/bin/mdbook-linkcheck
112+
key: ubuntu-22.04_sccache-0.7.6_mdbook-0.4.36_mdbook-linkcheck-0.7.7
113+
- name: "Build Rust tools"
114+
if: steps.rust-tools-cache.outputs.cache-hit != 'true'
115+
# Do not build with storage backends enabled, we only need local
116+
run: |
117+
cargo install --no-default-features sccache
118+
cargo install mdbook mdbook-linkcheck
119+
# We want our compiler cache to always update to the newest state.
120+
# The best way for us to achieve this is to **always** update the cache after every landed commit.
121+
# That way it will closely follow our development.
122+
# And if a PR diverges a lot with its cache that's not a big deal, as it will be merged eventually.
123+
#
124+
# This is a workaround for the fact that GH doesn't support updating existing caches.
125+
# See: https://github.com/azu/github-actions-overwrite-cache-example
126+
#
127+
# Ideally we'd like to use this:
128+
# - name: "Compiler cache"
129+
# uses: actions/cache@v4
130+
# with:
131+
# update: true <------- THIS DOESN'T EXIST YET
132+
# path: /home/runner/.cache/sccache
133+
# key: "Ubuntu 22.04 (wasm_32) Qt6_compiler_cache"
134+
- name: "Restore Compiler Cache"
135+
id: compiler-cache-restore
136+
uses: actions/cache/restore@v4
137+
with:
138+
path: /home/runner/.cache/sccache
139+
key: "Ubuntu 22.04 (wasm_32) Qt6_compiler_cache"
140+
- name: "emsdk cache"
141+
uses: actions/cache@v4
142+
id: emsdk-cache
143+
with:
144+
path: ./emsdk
145+
key: emsdk_2.0.14
146+
- name: "Setup emsdk"
147+
if: steps.emsdk-cache.outputs.cache-hit != 'true'
148+
run: |
149+
git clone https://github.com/emscripten-core/emsdk
150+
./emsdk/emsdk install 2.0.14
151+
./emsdk/emsdk activate 2.0.14
152+
- name: "Install Dependencies"
153+
run: sudo apt-get update && sudo apt-get install -y ninja-build clang-format-12
154+
- name: Install Qt GCC
155+
uses: jurplel/install-qt-action@v3
156+
with:
157+
aqtversion: '==3.1.*'
158+
version: '6.2.4'
159+
host: 'linux'
160+
target: 'desktop'
161+
arch: 'gcc_64'
162+
cache: true
163+
- name: Install Qt WASM
164+
uses: jurplel/install-qt-action@v3
165+
with:
166+
aqtversion: '==3.1.*'
167+
version: '6.2.4'
168+
host: 'linux'
169+
target: 'desktop'
170+
arch: 'wasm_32'
171+
tools: 'tools_cmake'
172+
cache: true
173+
- name: "Configure"
174+
# FIXME: ninja is not being found?
175+
env:
176+
RUSTC_WRAPPER: sccache
177+
run: |
178+
source ./emsdk/emsdk_env.sh
179+
/home/runner/work/cxx-qt/Qt/6.2.4/wasm_32/bin/qt-cmake -DQT_HOST_PATH=/home/runner/work/cxx-qt/Qt/6.2.4/gcc_64 -DBUILD_WASM=ON -Bbuild .
180+
- name: "Build"
181+
env:
182+
RUSTC_WRAPPER: sccache
183+
run: cmake --build build --parallel 4
184+
- name: Test output files exist
185+
run: |
186+
test -f ./build/examples/qml_minimal/example_qml_minimal.html
187+
test -f ./build/examples/qml_minimal/example_qml_minimal.js
188+
test -f ./build/examples/qml_minimal/libqml_minimal.a
189+
test -x ./build/examples/qml_minimal/example_qml_minimal.wasm
190+
test -f ./build/examples/qml_minimal/qtloader.js
191+
test -f ./build/examples/qml_features/example_qml_features.html
192+
test -f ./build/examples/qml_features/example_qml_features.js
193+
test -f ./build/examples/qml_features/libqml_features.a
194+
test -x ./build/examples/qml_features/example_qml_features.wasm
195+
test -f ./build/examples/qml_features/qtloader.js
196+
- name: "Print compiler cache statistics"
197+
run: sccache --show-stats
198+
# This is a workaround for the fact that GH doesn't support updating existing caches.
199+
# See: https://github.com/azu/github-actions-overwrite-cache-example
200+
- name: "Delete previous compiler cache"
201+
# Updating th cache doesn't work from forks
202+
# So update it once it's merged into the repo
203+
if: ${{ steps.compiler-cache-restore.outputs.cache-hit && github.event_name == 'push' }}
204+
working-directory: /home/runner/cxx-qt
205+
continue-on-error: true
206+
run: |
207+
gh extension install actions/gh-actions-cache
208+
gh actions-cache delete "Ubuntu 22.04 (wasm_32) Qt6_compiler_cache" --confirm
209+
env:
210+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
211+
- name: "Save Compiler Cache"
212+
# Updating th cache doesn't work from forks
213+
# So update it once it's merged into the repo
214+
if: ${{ github.event_name == 'push' }}
215+
uses: actions/cache/save@v4
216+
with:
217+
path: /home/runner/.cache/sccache
218+
key: "Ubuntu 22.04 (wasm_32) Qt6_compiler_cache"
219+
91220
build:
92221
# Run after pre checks
93222
needs: [clang_format, license_check, rust_format_check, markdown_lint, shellcheck]

book/src/getting-started/6-wasm-builds.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ To build for WebAssembly in a project that uses CXX-Qt crates, first follow the
7777

7878
### CMakeLists.txt
7979

80-
When compiling a CXX-Qt project for wasm, the Rust target must be set to `wasm32-unknown-emscripten`, and the project must be configured to use POSIX threads. Make sure you have the Emscripten target for `rustc` with `rustup target add wasm-unknown-emscripten`.
80+
When compiling a CXX-Qt project for wasm, the Rust target must be set to `wasm32-unknown-emscripten`, and the project must be configured to use POSIX threads. Make sure you have the Emscripten target for `rustc` with `rustup target add wasm32-unknown-emscripten`.
8181

8282
```cmake
8383
set(Rust_CARGO_TARGET wasm32-unknown-emscripten)

0 commit comments

Comments
 (0)