xref: /openbmc/qemu/tests/docker/dockerfiles/emsdk-wasm32-cross.docker (revision c5f122fdcc280a82e7c5f31de890f985aa7ba773)
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