From: Marc-André Lureau <marcandre.lureau@redhat.com>
Note that Debian packaging & testing is currently lacking:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=979665 Furthermore,
emsdk is based on Ubuntu Jammy. So we use rustup for now.
bindgen doesn't use clang & libclang from /emsdk, it probably should but
libclang is missing https://github.com/emscripten-core/emsdk/issues/1605
Finally, there is a linking issue I don't understand and I can't solve yet:
wasm-ld: error: unable to find library -llibqemuutil.a
...
A manual test like this work:
emmake rustc -v --target wasm32-unknown-emscripten -C
linker=/emsdk/upstream/emscripten/emcc --crate-type bin --edition=2021
-C link-arg=-m32 test.rs -Clink-arg=libfoo.a
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
configure | 4 +++
.gitlab-ci.d/buildtest-template.yml | 2 +-
.gitlab-ci.d/buildtest.yml | 2 +-
.../dockerfiles/emsdk-wasm32-cross.docker | 27 ++++++++++++++++++-
tests/docker/test-wasm | 12 +++++++++
5 files changed, 44 insertions(+), 3 deletions(-)
create mode 100755 tests/docker/test-wasm
diff --git a/configure b/configure
index 78445cbb4b..fdae1b4133 100755
--- a/configure
+++ b/configure
@@ -1228,6 +1228,10 @@ if test "$rust" != disabled && test -z "$rust_target_triple"; then
rust_machine=apple
;;
+ emscripten)
+ rust_arch=wasm32
+ ;;
+
linux)
# detect android/glibc/musl
if check_define __ANDROID__; then
diff --git a/.gitlab-ci.d/buildtest-template.yml b/.gitlab-ci.d/buildtest-template.yml
index d866cb12bb..307b927927 100644
--- a/.gitlab-ci.d/buildtest-template.yml
+++ b/.gitlab-ci.d/buildtest-template.yml
@@ -148,5 +148,5 @@
fi || exit 1;
- section_end configure
- section_start build "Building QEMU"
- - emmake make -j"$JOBS"
+ - CPATH="$CPATH:/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl:/emsdk/upstream/emscripten/cache/sysroot/include/compat:/emsdk/upstream/lib/clang/18/include:/emsdk/upstream/emscripten/cache/sysroot/include" emmake make -j"$JOBS"
- section_end build
diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml
index 34d8c1a496..dc0a0282b2 100644
--- a/.gitlab-ci.d/buildtest.yml
+++ b/.gitlab-ci.d/buildtest.yml
@@ -794,4 +794,4 @@ build-wasm:
- job: wasm-emsdk-cross-container
variables:
IMAGE: emsdk-wasm32-cross
- CONFIGURE_ARGS: --static --disable-tools --enable-debug --enable-tcg-interpreter
+ CONFIGURE_ARGS: --static --disable-tools --enable-debug --enable-tcg-interpreter --enable-rust
diff --git a/tests/docker/dockerfiles/emsdk-wasm32-cross.docker b/tests/docker/dockerfiles/emsdk-wasm32-cross.docker
index 6b1642a207..85d0a0fd8d 100644
--- a/tests/docker/dockerfiles/emsdk-wasm32-cross.docker
+++ b/tests/docker/dockerfiles/emsdk-wasm32-cross.docker
@@ -17,10 +17,11 @@ ENV EM_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
ENV CFLAGS="-O3 -pthread -DWASM_BIGINT"
ENV CXXFLAGS="$CFLAGS"
ENV LDFLAGS="-sWASM_BIGINT -sASYNCIFY=1 -L$TARGET/lib"
-RUN apt-get update && apt-get install -y \
+RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y \
autoconf \
build-essential \
libglib2.0-dev \
+ libfdt-dev \
libtool \
pkgconf \
ninja-build \
@@ -46,6 +47,30 @@ pkgconfig = ['pkg-config', '--static']
EOT
EOF
+RUN apt-get update && apt-get install -y wget clang libclang-dev
+ENV RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
+ENV RUSTC=/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc
+ENV RUSTDOC=/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustdoc
+ENV CARGO=/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo
+RUN set -eux && \
+ rustArch='x86_64-unknown-linux-gnu' && \
+ rustupSha256='6aeece6993e902708983b209d04c0d1dbb14ebb405ddb87def578d41f920f56d' && \
+ url="https://static.rust-lang.org/rustup/archive/1.27.1/${rustArch}/rustup-init" && \
+ wget "$url" && \
+ echo "${rustupSha256} *rustup-init" | sha256sum -c - && \
+ chmod +x rustup-init && \
+ ./rustup-init -y --no-modify-path --profile default --default-toolchain nightly --default-host ${rustArch} && \
+ /usr/local/cargo/bin/rustup target add wasm32-unknown-emscripten && \
+ chmod -R a+w $RUSTUP_HOME $CARGO_HOME && \
+ /usr/local/cargo/bin/rustup --version && \
+ /usr/local/cargo/bin/rustup run nightly cargo --version && \
+ /usr/local/cargo/bin/rustup run nightly rustc --version && \
+ test "$CARGO" = "$(/usr/local/cargo/bin/rustup +nightly which cargo)" && \
+ test "$RUSTDOC" = "$(/usr/local/cargo/bin/rustup +nightly which rustdoc)" && \
+ test "$RUSTC" = "$(/usr/local/cargo/bin/rustup +nightly which rustc)"
+ENV PATH=$CARGO_HOME/bin:$PATH
+RUN /usr/local/cargo/bin/rustup run nightly cargo install bindgen-cli
+
FROM build-base AS zlib-dev
ARG ZLIB_VERSION
RUN mkdir -p /zlib
diff --git a/tests/docker/test-wasm b/tests/docker/test-wasm
new file mode 100755
index 0000000000..5f3e4c401c
--- /dev/null
+++ b/tests/docker/test-wasm
@@ -0,0 +1,12 @@
+#!/bin/bash -e
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. common.rc
+
+cd "$BUILD_DIR"
+
+export CPATH="$CPATH:/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl:/emsdk/upstream/emscripten/cache/sysroot/include/compat:/emsdk/upstream/lib/clang/18/include:/emsdk/upstream/emscripten/cache/sysroot/include"
+
+emconfigure $QEMU_SRC/configure --disable-docs --static --disable-tools --enable-debug --enable-tcg-interpreter --disable-sdl --enable-rust
+emmake make $MAKEFLAGS
--
2.51.0