Skip to content

Commit d7baa9e

Browse files
committed
Emscripten WIP
1 parent 5571b12 commit d7baa9e

File tree

5 files changed

+119
-25
lines changed

5 files changed

+119
-25
lines changed

buildbot-config/platforms.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,29 @@ def dreamcast():
363363
register_platform(platform)
364364
dreamcast()
365365

366+
def emscripten():
367+
platform = Platform("emscripten")
368+
platform.workerimage = "emscripten"
369+
platform.compatibleBuilds = (builds.ScummVMBuild, )
370+
platform.configureargs.append("--host=wasm32-unknown-emscripten")
371+
platform.buildconfigureargs = {
372+
builds.ScummVMBuild: [ "--enable-gif", "--enable-jpeg", "--enable-ogg", "--enable-png", "--enable-vorbis",
373+
"--enable-zlib", "--enable-freetype2", "--enable-a52", "--enable-faad", "--enable-mad",
374+
"--enable-mpeg2", "--enable-theoradec",
375+
"--enable-plugins", "--default-dynamic", "--enable-detection-dynamic" ],
376+
}
377+
platform.packaging_cmd = "dist-emscripten"
378+
platform.built_files = {
379+
builds.ScummVMBuild: [ "build-emscripten" ],
380+
}
381+
platform.archiveext = "tar.xz"
382+
383+
platform.description = "Emscripten"
384+
#platform.icon = ''
385+
386+
register_platform(platform)
387+
emscripten()
388+
366389
def gamecube():
367390
platform = Platform("gamecube")
368391
platform.workerimage = "devkitppc"
Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
m4_include(`paths.m4')m4_dnl
22
m4_include(`packages.m4')m4_dnl
3+
m4_define(`em_package', RUN embuilder build `m4_foreachq(`pkg', `$@',`pkg ')' && embuilder --pic build `m4_foreachq(`pkg', `$@',`pkg ')' && \
4+
rm -rf /tmp/* ${SYSROOT_DIR}/../ports/*/* ${SYSROOT_DIR}/../build/* && \
5+
if [ -d "${SYSROOT_DIR}/../ports" ]; then find ${SYSROOT_DIR}/../ports -maxdepth 1 -type f -delete; fi)
36

47
m4_dnl Include Debian base preparation steps
58
m4_dnl This ensures all common steps are shared by all toolchains
@@ -19,50 +22,64 @@ RUN apt-get update && \
1922
rm -rf /var/lib/apt/lists/*
2023

2124
ENV EMSDK=/usr/local/emscripten HOST=wasm32-unknown-none
22-
ENV PREFIX=$EMSDK/scummvm-libs
25+
ENV PREFIX=$EMSDK/scummvm-libs SYSROOT_DIR=${EMSDK}/upstream/emscripten/cache/sysroot
2326

2427
local_package(toolchain)
2528

2629
# We add PATH here for *-config and platform specific binaries
2730
ENV \
31+
def_binaries(`${EMSDK}/upstream/emscripten/em', `ar, cc, ranlib, strip') \
32+
def_binaries(`${EMSDK}/upstream/bin/llvm-', `cxxfilt, nm, objcopy, objdump, strings') \
33+
AS=${EMSDK}/upstream/bin/wasm-as \
34+
CXX=${EMSDK}/upstream/emscripten/em++ \
35+
LD=${EMSDK}/upstream/emscripten/emcc \
2836
def_aclocal(`${PREFIX}') \
29-
def_pkg_config(`${PREFIX}') \
30-
PATH=$PATH:${EMSDK}:${EMSDK}/node/14.18.2_64bit/bin:${EMSDK}/upstream/emscripten:${PREFIX}/bin \
37+
PKG_CONFIG_LIBDIR=${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig:${SYSROOT_DIR}/lib/pkgconfig:${SYSROOT_DIR}/local/lib/pkgconfig \
38+
PATH=$PATH:${EMSDK}:${EMSDK}/node/current/bin:${EMSDK}/upstream/emscripten:${SYSROOT_DIR}/bin:${PREFIX}/bin \
39+
EMSDK_NODE=${EMSDK}/node/current/bin/node \
3140
CPPFLAGS="-I${PREFIX}/include" \
41+
CFLAGS="-fPIC" \
42+
CXXFLAGS="-fPIC" \
3243
LDFLAGS="-L${PREFIX}/lib"
3344

34-
RUN emcc -s USE_ZLIB -E - < /dev/null
45+
# Build system libraries for PIC
46+
em_package(libGL, libal, libhtml5, libstubs, libnoexit, libc,
47+
libdlmalloc, libcompiler_rt, libc++-noexcept, libc++abi-noexcept, libsockets)
3548

36-
RUN emcc -s USE_LIBPNG=1 -E - < /dev/null
49+
em_package(zlib)
3750

38-
RUN emcc -s USE_LIBJPEG=1 -E - < /dev/null
51+
em_package(libpng)
3952

40-
RUN emcc -s USE_GIFLIB=1 -E - < /dev/null
53+
em_package(libjpeg)
4154

42-
helpers_package(libmad, --with-pic --enable-fpm=no)
55+
em_package(giflib)
4356

44-
RUN emcc -s USE_OGG=1 -E - < /dev/null
57+
helpers_package(libmad, --with-pic --enable-fpm=64bit)
4558

46-
RUN emcc -s USE_VORBIS=1 -E - < /dev/null
59+
em_package(ogg)
4760

48-
# helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1")
49-
helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1")
61+
em_package(vorbis)
5062

51-
# TODO: flac
63+
# helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1 -sUSE_VORBIS=1")
64+
helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1")
5265

53-
helpers_package(faad2, , CFLAGS="-fPIC")
66+
# TODO: flac
5467

55-
helpers_package(mpeg2dec, , CFLAGS="-fPIC")
68+
helpers_package(faad2)
5669

57-
helpers_package(a52dec, , CFLAGS="-fPIC")
70+
helpers_package(mpeg2dec)
5871

72+
helpers_package(a52dec)
5973

6074
# TODO: fluidlite
6175

62-
RUN emcc -s USE_FREETYPE=1 -E - < /dev/null
76+
em_package(freetype)
6377

6478
# TODO: fribidi
6579

66-
RUN emcc -s USE_SDL=2 -E - < /dev/null
80+
# This is needed for SDL2
81+
em_package(libGL-getprocaddr)
82+
83+
em_package(sdl2)
6784

68-
RUN emcc -s USE_SDL_NET=2 -E - < /dev/null
85+
em_package(sdl2_net)
Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
1-
do_configure () {
2-
source "$EMSDK/emsdk_env.sh"
1+
__do_configure_emscripten () {
32
emconfigure ./configure --prefix=$PREFIX --host=$HOST --disable-shared "$@"
43
}
54

6-
do_cmake () {
7-
source "$EMSDK/emsdk_env.sh"
5+
__do_cmake_emscripten () {
86
mkdir -p build
97
cd build
108
emcmake cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \
119
-DBUILD_SHARED_LIBS=no "$@" ..
1210
}
1311

14-
do_make () {
15-
source "$EMSDK/emsdk_env.sh"
12+
__do_make_emscripten () {
1613
emmake make "$@"
1714
}
15+
16+
__setup_env() {
17+
local pwd
18+
if [ -f "$EMSDK/emsdk_env.sh" ]; then
19+
pwd=$(pwd)
20+
cd "$EMSDK"
21+
. "./emsdk_env.sh"
22+
cd "$pwd"
23+
fi
24+
}
25+
26+
__setup_env
27+
for f in do_configure do_cmake do_make; do
28+
unset -f $f
29+
eval "$f () { __${f}_emscripten \"\$@\"; }"
30+
done

toolchains/emscripten/packages/toolchain/build.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ cd ${EMSDK}
1717
./emsdk install ${EMSDK_VERSION}
1818
./emsdk activate ${EMSDK_VERSION}
1919

20+
# Also create a symink to current node
21+
# This avoids us to track which version of node is active
22+
NODE_JS=$(grep '^NODE_JS =' .emscripten | sed -e "s/.*'\\(.*\\)'$/\1/")
23+
ln -rs "$(dirname "$(dirname "./${NODE_JS}")")" ./node/current
24+
2025
do_clean_bdir
2126

2227
# Cleanup wget HSTS

workers/emscripten/Dockerfile.m4

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
FROM toolchains/emscripten AS toolchain
2+
3+
m4_include(`paths.m4')m4_dnl
4+
5+
m4_include(`debian-builder-base.m4')m4_dnl
6+
7+
ENV EMSDK=/usr/local/emscripten HOST=wasm32-unknown-none
8+
ENV PREFIX=$EMSDK/scummvm-libs SYSROOT_DIR=${EMSDK}/upstream/emscripten/cache/sysroot
9+
10+
# Add libraries needed by toolchain to run
11+
RUN apt-get update && \
12+
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
13+
libatomic1 && \
14+
rm -rf /var/lib/apt/lists/*
15+
16+
COPY --from=toolchain ${EMSDK} ${EMSDK}/
17+
18+
# We add PATH here for *-config and platform specific binaries
19+
# Prevent the build process to build ports
20+
ENV \
21+
EM_FROZEN_CACHE=1 \
22+
def_binaries(`${EMSDK}/upstream/emscripten/em', `ar, cc, ranlib, strip') \
23+
def_binaries(`${EMSDK}/upstream/bin/llvm-', `cxxfilt, nm, objcopy, objdump, strings') \
24+
AS=${EMSDK}/upstream/bin/wasm-as \
25+
CXX=${EMSDK}/upstream/emscripten/em++ \
26+
LD=${EMSDK}/upstream/emscripten/emcc \
27+
def_aclocal(`${PREFIX}') \
28+
PKG_CONFIG_LIBDIR=${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig:${SYSROOT_DIR}/lib/pkgconfig:${SYSROOT_DIR}/local/lib/pkgconfig \
29+
PATH=$PATH:${EMSDK}:${EMSDK}/node/current/bin:${EMSDK}/upstream/emscripten:${SYSROOT_DIR}/bin:${PREFIX}/bin \
30+
EMSDK_NODE=${EMSDK}/node/current/bin/node \
31+
CPPFLAGS="-I${PREFIX}/include" \
32+
CFLAGS="-fPIC" \
33+
CXXFLAGS="-fPIC" \
34+
LDFLAGS="-L${PREFIX}/lib"
35+
36+
m4_include(`run-buildbot.m4')m4_dnl

0 commit comments

Comments
 (0)