# syntax = docker/dockerfile:1.5 ARG EMSDK_VERSION_QEMU=3.1.50 ARG ZLIB_VERSION=1.3.1 ARG GLIB_MINOR_VERSION=2.84 ARG GLIB_VERSION=${GLIB_MINOR_VERSION}.0 ARG PIXMAN_VERSION=0.44.2 ARG FFI_VERSION=v3.4.7 ARG MESON_VERSION=1.5.0 FROM emscripten/emsdk:$EMSDK_VERSION_QEMU AS build-base ARG MESON_VERSION ENV TARGET=/builddeps/target ENV CPATH="$TARGET/include" ENV PKG_CONFIG_PATH="$TARGET/lib/pkgconfig" 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 \ autoconf \ build-essential \ libglib2.0-dev \ libtool \ pkgconf \ ninja-build \ python3-pip RUN pip3 install meson==${MESON_VERSION} tomli RUN mkdir /build WORKDIR /build RUN mkdir -p $TARGET RUN < /cross.meson [host_machine] system = 'emscripten' cpu_family = 'wasm32' cpu = 'wasm32' endian = 'little' [binaries] c = 'emcc' cpp = 'em++' ar = 'emar' ranlib = 'emranlib' pkgconfig = ['pkg-config', '--static'] EOT EOF FROM build-base AS zlib-dev ARG ZLIB_VERSION RUN mkdir -p /zlib RUN curl -Ls https://zlib.net/zlib-$ZLIB_VERSION.tar.xz | \ tar xJC /zlib --strip-components=1 WORKDIR /zlib RUN emconfigure ./configure --prefix=$TARGET --static RUN emmake make install -j$(nproc) FROM build-base AS libffi-dev ARG FFI_VERSION RUN mkdir -p /libffi RUN git clone https://github.com/libffi/libffi /libffi WORKDIR /libffi RUN git checkout $FFI_VERSION RUN autoreconf -fiv RUN emconfigure ./configure --host=wasm32-unknown-linux \ --prefix=$TARGET --enable-static \ --disable-shared --disable-dependency-tracking \ --disable-builddir --disable-multi-os-directory \ --disable-raw-api --disable-docs RUN emmake make install SUBDIRS='include' -j$(nproc) FROM build-base AS pixman-dev ARG PIXMAN_VERSION RUN mkdir /pixman/ RUN git clone https://gitlab.freedesktop.org/pixman/pixman /pixman/ WORKDIR /pixman RUN git checkout pixman-$PIXMAN_VERSION RUN <> /cross.meson [built-in options] c_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] cpp_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] objc_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] c_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] cpp_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] EOT EOF RUN meson setup _build --prefix=$TARGET --cross-file=/cross.meson \ --default-library=static \ --buildtype=release -Dtests=disabled -Ddemos=disabled RUN meson install -C _build FROM build-base AS glib-dev ARG GLIB_VERSION ARG GLIB_MINOR_VERSION RUN mkdir -p /stub WORKDIR /stub RUN < res_query.c #include int res_query(const char *name, int class, int type, unsigned char *dest, int len) { h_errno = HOST_NOT_FOUND; return -1; } EOT EOF RUN emcc ${CFLAGS} -c res_query.c -fPIC -o libresolv.o RUN ar rcs libresolv.a libresolv.o RUN mkdir -p $TARGET/lib/ RUN cp libresolv.a $TARGET/lib/ RUN mkdir -p /glib RUN curl -Lks https://download.gnome.org/sources/glib/${GLIB_MINOR_VERSION}/glib-$GLIB_VERSION.tar.xz | \ tar xJC /glib --strip-components=1 COPY --link --from=zlib-dev /builddeps/ /builddeps/ COPY --link --from=libffi-dev /builddeps/ /builddeps/ WORKDIR /glib RUN <> /cross.meson [built-in options] c_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] cpp_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] objc_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] c_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] cpp_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] EOT EOF RUN meson setup _build --prefix=$TARGET --cross-file=/cross.meson \ --default-library=static --buildtype=release --force-fallback-for=pcre2 \ -Dselinux=disabled -Dxattr=false -Dlibmount=disabled -Dnls=disabled \ -Dtests=false -Dglib_debug=disabled -Dglib_assert=false -Dglib_checks=false # FIXME: emscripten doesn't provide some pthread functions in the final link, # which isn't detected during meson setup. RUN sed -i -E "/#define HAVE_POSIX_SPAWN 1/d" ./_build/config.h RUN sed -i -E "/#define HAVE_PTHREAD_GETNAME_NP 1/d" ./_build/config.h RUN meson install -C _build FROM build-base COPY --link --from=glib-dev /builddeps/ /builddeps/ COPY --link --from=pixman-dev /builddeps/ /builddeps/