feat(wasm): add browser QEMU build

This commit is contained in:
2026-07-19 22:31:52 -04:00
parent ca07c02e02
commit 6538cec9f6
10 changed files with 7046 additions and 25 deletions
+7 -2
View File
@@ -564,12 +564,13 @@ index 5f4022f..1477f15 100644
switch (opcode) {
case I2C_OPCODE_RSTART:
i2c_end_transfer(s->bus);
@@ -261,9 +272,16 @@ static void esp32_i2c_init(Object * obj)
@@ -261,9 +272,17 @@ static void esp32_i2c_init(Object * obj)
fifo8_create(&s->rx_fifo, ESP32_I2C_FIFO_LENGTH);
}
+static const Property esp32_i2c_properties[] = {
+ DEFINE_PROP_BOOL("c3", Esp32I2CState, c3, false),
+ DEFINE_PROP_END_OF_LIST(),
+};
+
static void esp32_i2c_class_init(ObjectClass * klass, void * data)
@@ -708,11 +709,15 @@ diff --git i/hw/riscv/Kconfig w/hw/riscv/Kconfig
index 192ab47..293808d 100644
--- i/hw/riscv/Kconfig
+++ w/hw/riscv/Kconfig
@@ -119,4 +119,5 @@ config RISCV_ESP32C3
@@ -119,4 +119,9 @@ config RISCV_ESP32C3
select OPENCORES_ETH
select UNIMP
select ESP_RGB
+ select I2C
+ select SSI
+ select SSI_SD
+ select SSI_M25P80
+ select CAN_SJA1000
diff --git i/hw/riscv/esp32c3.c w/hw/riscv/esp32c3.c
index ed698fb..2f1ccbf 100644
File diff suppressed because it is too large Load Diff
+92
View File
@@ -0,0 +1,92 @@
ARG EMSDK_VERSION=3.1.50
ARG ZLIB_VERSION=1.3.1
ARG GLIB_SERIES=2.75
ARG GLIB_VERSION=2.75.0
ARG FFI_COMMIT=adbcf2b247696dde2667ab552cb93e0c79455c84
FROM emscripten/emsdk:${EMSDK_VERSION} AS base
ENV TARGET=/build/target
ENV CFLAGS="-O2 -matomics -mbulk-memory -DNDEBUG -sWASM_BIGINT -DWASM_BIGINT -pthread -sMALLOC=mimalloc -sASYNCIFY=1"
ENV CXXFLAGS="$CFLAGS"
ENV LDFLAGS="-L$TARGET/lib -O2"
ENV CPATH="$TARGET/include"
ENV PKG_CONFIG_PATH="$TARGET/lib/pkgconfig"
ENV EM_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
ENV CHOST=wasm32-unknown-linux
ENV MAKEFLAGS=-j2
RUN apt-get update && apt-get install -y \
autoconf build-essential libglib2.0-dev libtool ninja-build pkgconf python3-pip
RUN pip3 install meson==1.5.0 tomli
WORKDIR /build
RUN mkdir -p "$TARGET"
FROM base AS zlib
ARG ZLIB_VERSION
RUN mkdir /zlib \
&& curl -Ls "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" \
| tar xzC /zlib --strip-components=1
WORKDIR /zlib
RUN emconfigure ./configure --prefix="$TARGET" --static && make install
FROM base AS libffi
ARG FFI_COMMIT
RUN git clone https://github.com/libffi/libffi /libffi \
&& git -C /libffi checkout "$FFI_COMMIT"
WORKDIR /libffi
RUN autoreconf -fiv \
&& emconfigure ./configure --host="$CHOST" --prefix="$TARGET" \
--enable-static --disable-shared --disable-dependency-tracking \
--disable-builddir --disable-multi-os-directory --disable-raw-api \
--disable-structs --disable-docs \
&& emmake make install SUBDIRS=include
FROM base AS glib
ARG GLIB_SERIES
ARG GLIB_VERSION
COPY --from=zlib /build/ /build/
COPY --from=libffi /build/ /build/
RUN mkdir /stub \
&& printf '%s\n' '#include <netdb.h>' \
'int res_query(const char *n, int c, int t, unsigned char *d, int l) { h_errno = HOST_NOT_FOUND; return -1; }' \
>/stub/res_query.c \
&& emcc $CFLAGS -c /stub/res_query.c -fPIC -o /stub/libresolv.o \
&& ar rcs "$TARGET/lib/libresolv.a" /stub/libresolv.o
RUN mkdir /glib \
&& curl -Lks "https://download.gnome.org/sources/glib/${GLIB_SERIES}/glib-${GLIB_VERSION}.tar.xz" \
| tar xJC /glib --strip-components=1
WORKDIR /glib
ENV CFLAGS="-Wno-error=incompatible-function-pointer-types -O2 -matomics -mbulk-memory -DNDEBUG -pthread -sWASM_BIGINT -sMALLOC=mimalloc -sASYNCIFY=1"
ENV CXXFLAGS="$CFLAGS"
RUN printf '%s\n' \
'#!/bin/bash' \
'set -euo pipefail' \
'cmd="$1"; shift' \
'args=()' \
'for arg in "$@"; do args+=("${arg/-Werror=unused-command-line-argument/-Wno-error=unused-command-line-argument}"); done' \
'"$cmd" "${args[@]}"' \
>/emcc-meson-wrap.sh && chmod +x /emcc-meson-wrap.sh
RUN printf '%s\n' \
'[host_machine]' \
"system = 'emscripten'" \
"cpu_family = 'wasm32'" \
"cpu = 'wasm32'" \
"endian = 'little'" \
'' \
'[binaries]' \
"c = ['bash', '/emcc-meson-wrap.sh', 'emcc']" \
"cpp = ['bash', '/emcc-meson-wrap.sh', 'em++']" \
"ar = 'emar'" \
"ranlib = 'emranlib'" \
"pkgconfig = ['pkg-config', '--static']" \
>/cross.meson
RUN meson setup _build --prefix="$TARGET" --cross-file=/cross.meson \
--default-library=static --buildtype=release --force-fallback-for=pcre2,gvdb \
-Dselinux=disabled -Dxattr=false -Dlibmount=disabled -Dnls=disabled \
-Dtests=false -Dglib_assert=false -Dglib_checks=false \
&& sed -i -E '/#define HAVE_(CLOSE_RANGE|EPOLL_CREATE|KQUEUE|POSIX_SPAWN|FALLOCATE) 1/d' _build/config.h \
&& meson install -C _build
FROM base
COPY --from=glib /build/ /build/
WORKDIR /build
CMD ["sleep", "infinity"]