1*8574be0eSKohei Tokunaga# syntax = docker/dockerfile:1.5 2*8574be0eSKohei Tokunaga 3*8574be0eSKohei TokunagaARG EMSDK_VERSION_QEMU=3.1.50 4*8574be0eSKohei TokunagaARG ZLIB_VERSION=1.3.1 5*8574be0eSKohei TokunagaARG GLIB_MINOR_VERSION=2.84 6*8574be0eSKohei TokunagaARG GLIB_VERSION=${GLIB_MINOR_VERSION}.0 7*8574be0eSKohei TokunagaARG PIXMAN_VERSION=0.44.2 8*8574be0eSKohei TokunagaARG FFI_VERSION=v3.4.7 9*8574be0eSKohei TokunagaARG MESON_VERSION=1.5.0 10*8574be0eSKohei Tokunaga 11*8574be0eSKohei TokunagaFROM emscripten/emsdk:$EMSDK_VERSION_QEMU AS build-base 12*8574be0eSKohei TokunagaARG MESON_VERSION 13*8574be0eSKohei TokunagaENV TARGET=/builddeps/target 14*8574be0eSKohei TokunagaENV CPATH="$TARGET/include" 15*8574be0eSKohei TokunagaENV PKG_CONFIG_PATH="$TARGET/lib/pkgconfig" 16*8574be0eSKohei TokunagaENV EM_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" 17*8574be0eSKohei TokunagaENV CFLAGS="-O3 -pthread -DWASM_BIGINT" 18*8574be0eSKohei TokunagaENV CXXFLAGS="$CFLAGS" 19*8574be0eSKohei TokunagaENV LDFLAGS="-sWASM_BIGINT -sASYNCIFY=1 -L$TARGET/lib" 20*8574be0eSKohei TokunagaRUN apt-get update && apt-get install -y \ 21*8574be0eSKohei Tokunaga autoconf \ 22*8574be0eSKohei Tokunaga build-essential \ 23*8574be0eSKohei Tokunaga libglib2.0-dev \ 24*8574be0eSKohei Tokunaga libtool \ 25*8574be0eSKohei Tokunaga pkgconf \ 26*8574be0eSKohei Tokunaga ninja-build \ 27*8574be0eSKohei Tokunaga python3-pip 28*8574be0eSKohei TokunagaRUN pip3 install meson==${MESON_VERSION} tomli 29*8574be0eSKohei TokunagaRUN mkdir /build 30*8574be0eSKohei TokunagaWORKDIR /build 31*8574be0eSKohei TokunagaRUN mkdir -p $TARGET 32*8574be0eSKohei TokunagaRUN <<EOF 33*8574be0eSKohei Tokunagacat <<EOT > /cross.meson 34*8574be0eSKohei Tokunaga[host_machine] 35*8574be0eSKohei Tokunagasystem = 'emscripten' 36*8574be0eSKohei Tokunagacpu_family = 'wasm32' 37*8574be0eSKohei Tokunagacpu = 'wasm32' 38*8574be0eSKohei Tokunagaendian = 'little' 39*8574be0eSKohei Tokunaga 40*8574be0eSKohei Tokunaga[binaries] 41*8574be0eSKohei Tokunagac = 'emcc' 42*8574be0eSKohei Tokunagacpp = 'em++' 43*8574be0eSKohei Tokunagaar = 'emar' 44*8574be0eSKohei Tokunagaranlib = 'emranlib' 45*8574be0eSKohei Tokunagapkgconfig = ['pkg-config', '--static'] 46*8574be0eSKohei TokunagaEOT 47*8574be0eSKohei TokunagaEOF 48*8574be0eSKohei Tokunaga 49*8574be0eSKohei TokunagaFROM build-base AS zlib-dev 50*8574be0eSKohei TokunagaARG ZLIB_VERSION 51*8574be0eSKohei TokunagaRUN mkdir -p /zlib 52*8574be0eSKohei TokunagaRUN curl -Ls https://zlib.net/zlib-$ZLIB_VERSION.tar.xz | \ 53*8574be0eSKohei Tokunaga tar xJC /zlib --strip-components=1 54*8574be0eSKohei TokunagaWORKDIR /zlib 55*8574be0eSKohei TokunagaRUN emconfigure ./configure --prefix=$TARGET --static 56*8574be0eSKohei TokunagaRUN emmake make install -j$(nproc) 57*8574be0eSKohei Tokunaga 58*8574be0eSKohei TokunagaFROM build-base AS libffi-dev 59*8574be0eSKohei TokunagaARG FFI_VERSION 60*8574be0eSKohei TokunagaRUN mkdir -p /libffi 61*8574be0eSKohei TokunagaRUN git clone https://github.com/libffi/libffi /libffi 62*8574be0eSKohei TokunagaWORKDIR /libffi 63*8574be0eSKohei TokunagaRUN git checkout $FFI_VERSION 64*8574be0eSKohei TokunagaRUN autoreconf -fiv 65*8574be0eSKohei TokunagaRUN emconfigure ./configure --host=wasm32-unknown-linux \ 66*8574be0eSKohei Tokunaga --prefix=$TARGET --enable-static \ 67*8574be0eSKohei Tokunaga --disable-shared --disable-dependency-tracking \ 68*8574be0eSKohei Tokunaga --disable-builddir --disable-multi-os-directory \ 69*8574be0eSKohei Tokunaga --disable-raw-api --disable-docs 70*8574be0eSKohei TokunagaRUN emmake make install SUBDIRS='include' -j$(nproc) 71*8574be0eSKohei Tokunaga 72*8574be0eSKohei TokunagaFROM build-base AS pixman-dev 73*8574be0eSKohei TokunagaARG PIXMAN_VERSION 74*8574be0eSKohei TokunagaRUN mkdir /pixman/ 75*8574be0eSKohei TokunagaRUN git clone https://gitlab.freedesktop.org/pixman/pixman /pixman/ 76*8574be0eSKohei TokunagaWORKDIR /pixman 77*8574be0eSKohei TokunagaRUN git checkout pixman-$PIXMAN_VERSION 78*8574be0eSKohei TokunagaRUN <<EOF 79*8574be0eSKohei Tokunagacat <<EOT >> /cross.meson 80*8574be0eSKohei Tokunaga[built-in options] 81*8574be0eSKohei Tokunagac_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 82*8574be0eSKohei Tokunagacpp_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 83*8574be0eSKohei Tokunagaobjc_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 84*8574be0eSKohei Tokunagac_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] 85*8574be0eSKohei Tokunagacpp_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] 86*8574be0eSKohei TokunagaEOT 87*8574be0eSKohei TokunagaEOF 88*8574be0eSKohei TokunagaRUN meson setup _build --prefix=$TARGET --cross-file=/cross.meson \ 89*8574be0eSKohei Tokunaga --default-library=static \ 90*8574be0eSKohei Tokunaga --buildtype=release -Dtests=disabled -Ddemos=disabled 91*8574be0eSKohei TokunagaRUN meson install -C _build 92*8574be0eSKohei Tokunaga 93*8574be0eSKohei TokunagaFROM build-base AS glib-dev 94*8574be0eSKohei TokunagaARG GLIB_VERSION 95*8574be0eSKohei TokunagaARG GLIB_MINOR_VERSION 96*8574be0eSKohei TokunagaRUN mkdir -p /stub 97*8574be0eSKohei TokunagaWORKDIR /stub 98*8574be0eSKohei TokunagaRUN <<EOF 99*8574be0eSKohei Tokunagacat <<'EOT' > res_query.c 100*8574be0eSKohei Tokunaga#include <netdb.h> 101*8574be0eSKohei Tokunagaint res_query(const char *name, int class, 102*8574be0eSKohei Tokunaga int type, unsigned char *dest, int len) 103*8574be0eSKohei Tokunaga{ 104*8574be0eSKohei Tokunaga h_errno = HOST_NOT_FOUND; 105*8574be0eSKohei Tokunaga return -1; 106*8574be0eSKohei Tokunaga} 107*8574be0eSKohei TokunagaEOT 108*8574be0eSKohei TokunagaEOF 109*8574be0eSKohei TokunagaRUN emcc ${CFLAGS} -c res_query.c -fPIC -o libresolv.o 110*8574be0eSKohei TokunagaRUN ar rcs libresolv.a libresolv.o 111*8574be0eSKohei TokunagaRUN mkdir -p $TARGET/lib/ 112*8574be0eSKohei TokunagaRUN cp libresolv.a $TARGET/lib/ 113*8574be0eSKohei Tokunaga 114*8574be0eSKohei TokunagaRUN mkdir -p /glib 115*8574be0eSKohei TokunagaRUN curl -Lks https://download.gnome.org/sources/glib/${GLIB_MINOR_VERSION}/glib-$GLIB_VERSION.tar.xz | \ 116*8574be0eSKohei Tokunaga tar xJC /glib --strip-components=1 117*8574be0eSKohei Tokunaga 118*8574be0eSKohei TokunagaCOPY --link --from=zlib-dev /builddeps/ /builddeps/ 119*8574be0eSKohei TokunagaCOPY --link --from=libffi-dev /builddeps/ /builddeps/ 120*8574be0eSKohei Tokunaga 121*8574be0eSKohei TokunagaWORKDIR /glib 122*8574be0eSKohei TokunagaRUN <<EOF 123*8574be0eSKohei TokunagaCFLAGS="$CFLAGS -Wno-incompatible-function-pointer-types" ; 124*8574be0eSKohei Tokunagacat <<EOT >> /cross.meson 125*8574be0eSKohei Tokunaga[built-in options] 126*8574be0eSKohei Tokunagac_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 127*8574be0eSKohei Tokunagacpp_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 128*8574be0eSKohei Tokunagaobjc_args = [$(printf "'%s', " $CFLAGS | sed 's/, $//')] 129*8574be0eSKohei Tokunagac_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] 130*8574be0eSKohei Tokunagacpp_link_args = [$(printf "'%s', " $LDFLAGS | sed 's/, $//')] 131*8574be0eSKohei TokunagaEOT 132*8574be0eSKohei TokunagaEOF 133*8574be0eSKohei TokunagaRUN meson setup _build --prefix=$TARGET --cross-file=/cross.meson \ 134*8574be0eSKohei Tokunaga --default-library=static --buildtype=release --force-fallback-for=pcre2 \ 135*8574be0eSKohei Tokunaga -Dselinux=disabled -Dxattr=false -Dlibmount=disabled -Dnls=disabled \ 136*8574be0eSKohei Tokunaga -Dtests=false -Dglib_debug=disabled -Dglib_assert=false -Dglib_checks=false 137*8574be0eSKohei Tokunaga# FIXME: emscripten doesn't provide some pthread functions in the final link, 138*8574be0eSKohei Tokunaga# which isn't detected during meson setup. 139*8574be0eSKohei TokunagaRUN sed -i -E "/#define HAVE_POSIX_SPAWN 1/d" ./_build/config.h 140*8574be0eSKohei TokunagaRUN sed -i -E "/#define HAVE_PTHREAD_GETNAME_NP 1/d" ./_build/config.h 141*8574be0eSKohei TokunagaRUN meson install -C _build 142*8574be0eSKohei Tokunaga 143*8574be0eSKohei TokunagaFROM build-base 144*8574be0eSKohei TokunagaCOPY --link --from=glib-dev /builddeps/ /builddeps/ 145*8574be0eSKohei TokunagaCOPY --link --from=pixman-dev /builddeps/ /builddeps/ 146