Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions buildbot-config/platforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,29 @@ def dreamcast():
register_platform(platform)
dreamcast()

def emscripten():
platform = Platform("emscripten")
platform.workerimage = "emscripten"
platform.compatibleBuilds = (builds.ScummVMBuild, )
platform.configureargs.append("--host=wasm32-unknown-emscripten")
platform.buildconfigureargs = {
builds.ScummVMBuild: [ "--enable-gif", "--enable-jpeg", "--enable-ogg", "--enable-png", "--enable-vorbis",
"--enable-zlib", "--enable-freetype2", "--enable-a52", "--enable-faad", "--enable-mad",
"--enable-mpeg2", "--enable-theoradec",
"--enable-plugins", "--default-dynamic", "--enable-detection-dynamic" ],
}
platform.packaging_cmd = "dist-emscripten"
platform.built_files = {
builds.ScummVMBuild: [ "build-emscripten" ],
}
platform.archiveext = "tar.xz"

platform.description = "Emscripten"
#platform.icon = ''

register_platform(platform)
emscripten()

def gamecube():
platform = Platform("gamecube")
platform.workerimage = "devkitppc"
Expand Down
4 changes: 4 additions & 0 deletions check-versions/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,10 @@

# This version is set by toolchain configuration
('./toolchains/miyoo/packages/toolchain/build.sh', 'BUILDROOT'): 'ignore',
('./toolchains/emscripten/packages/toolchain/build.sh', 'EMSDK'): {
'check': 'git tag',
'repository': 'https://github.com/emscripten-core/emsdk.git',
},

('./toolchains/mxe/Dockerfile.m4', 'MXE'): {
'check': 'git commit',
Expand Down
85 changes: 85 additions & 0 deletions toolchains/emscripten/Dockerfile.m4
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
m4_include(`paths.m4')m4_dnl
m4_include(`packages.m4')m4_dnl
m4_define(`em_package', RUN embuilder build `m4_foreachq(`pkg', `$@',`pkg ')' && embuilder --pic build `m4_foreachq(`pkg', `$@',`pkg ')' && \
rm -rf /tmp/* ${SYSROOT_DIR}/../ports/*/* ${SYSROOT_DIR}/../build/* && \
if [ -d "${SYSROOT_DIR}/../ports" ]; then find ${SYSROOT_DIR}/../ports -maxdepth 1 -type f -delete; fi)

m4_dnl Include Debian base preparation steps
m4_dnl This ensures all common steps are shared by all toolchains
m4_include(`debian-toolchain-base.m4')m4_dnl

COPY functions-platform.sh lib-helpers/

RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
binutils \
build-essential \
ca-certificates \
file \
git \
python3 \
python3-pip && \
rm -rf /var/lib/apt/lists/*

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

local_package(toolchain)

# We add PATH here for *-config and platform specific binaries
ENV \
def_binaries(`${EMSDK}/upstream/emscripten/em', `ar, cc, ranlib, strip') \
def_binaries(`${EMSDK}/upstream/bin/llvm-', `cxxfilt, nm, objcopy, objdump, strings') \
AS=${EMSDK}/upstream/bin/wasm-as \
CXX=${EMSDK}/upstream/emscripten/em++ \
LD=${EMSDK}/upstream/emscripten/emcc \
def_aclocal(`${PREFIX}') \
PKG_CONFIG_LIBDIR=${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig:${SYSROOT_DIR}/lib/pkgconfig:${SYSROOT_DIR}/local/lib/pkgconfig \
PATH=$PATH:${EMSDK}:${EMSDK}/node/current/bin:${EMSDK}/upstream/emscripten:${SYSROOT_DIR}/bin:${PREFIX}/bin \
EMSDK_NODE=${EMSDK}/node/current/bin/node \
CPPFLAGS="-I${PREFIX}/include" \
CFLAGS="-fPIC" \
CXXFLAGS="-fPIC" \
LDFLAGS="-L${PREFIX}/lib"

# Build system libraries for PIC
em_package(libGL, libal, libhtml5, libstubs, libnoexit, libc,
libdlmalloc, libcompiler_rt, libc++-noexcept, libc++abi-noexcept, libsockets)

em_package(zlib)

em_package(libpng)

em_package(libjpeg)

em_package(giflib)

helpers_package(libmad, --with-pic --enable-fpm=64bit)

em_package(ogg)

em_package(vorbis)

# helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1 -sUSE_VORBIS=1")
helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1")

# TODO: flac

helpers_package(faad2)

helpers_package(mpeg2dec)

helpers_package(a52dec)

# TODO: fluidlite

em_package(freetype)

# TODO: fribidi

# This is needed for SDL2
em_package(libGL-getprocaddr)

em_package(sdl2)

em_package(sdl2_net)
30 changes: 30 additions & 0 deletions toolchains/emscripten/functions-platform.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
__do_configure_emscripten () {
emconfigure ./configure --prefix=$PREFIX --host=$HOST --disable-shared "$@"
}

__do_cmake_emscripten () {
mkdir -p build
cd build
emcmake cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \
-DBUILD_SHARED_LIBS=no "$@" ..
}

__do_make_emscripten () {
emmake make "$@"
}

__setup_env() {
local pwd
if [ -f "$EMSDK/emsdk_env.sh" ]; then
pwd=$(pwd)
cd "$EMSDK"
. "./emsdk_env.sh"
cd "$pwd"
fi
}

__setup_env
for f in do_configure do_cmake do_make; do
unset -f $f
eval "$f () { __${f}_emscripten \"\$@\"; }"
done
28 changes: 28 additions & 0 deletions toolchains/emscripten/packages/toolchain/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#! /bin/sh

EMSDK_VERSION=4.0.10

PACKAGE_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
HELPERS_DIR=$PACKAGE_DIR/../..
. $HELPERS_DIR/functions.sh

do_make_bdir

do_http_fetch emsdk "https://github.com/emscripten-core/emsdk/archive/refs/tags/${EMSDK_VERSION}.tar.gz" 'tar xzf'

cd ..
mv emsdk-${EMSDK_VERSION} ${EMSDK}
cd ${EMSDK}

./emsdk install ${EMSDK_VERSION}
./emsdk activate ${EMSDK_VERSION}

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

do_clean_bdir

# Cleanup wget HSTS
rm -f $HOME/.wget-hsts
36 changes: 36 additions & 0 deletions workers/emscripten/Dockerfile.m4
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FROM toolchains/emscripten AS toolchain

m4_include(`paths.m4')m4_dnl

m4_include(`debian-builder-base.m4')m4_dnl

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

# Add libraries needed by toolchain to run
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
libatomic1 && \
rm -rf /var/lib/apt/lists/*

COPY --from=toolchain ${EMSDK} ${EMSDK}/

# We add PATH here for *-config and platform specific binaries
# Prevent the build process to build ports
ENV \
EM_FROZEN_CACHE=1 \
def_binaries(`${EMSDK}/upstream/emscripten/em', `ar, cc, ranlib, strip') \
def_binaries(`${EMSDK}/upstream/bin/llvm-', `cxxfilt, nm, objcopy, objdump, strings') \
AS=${EMSDK}/upstream/bin/wasm-as \
CXX=${EMSDK}/upstream/emscripten/em++ \
LD=${EMSDK}/upstream/emscripten/emcc \
def_aclocal(`${PREFIX}') \
PKG_CONFIG_LIBDIR=${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig:${SYSROOT_DIR}/lib/pkgconfig:${SYSROOT_DIR}/local/lib/pkgconfig \
PATH=$PATH:${EMSDK}:${EMSDK}/node/current/bin:${EMSDK}/upstream/emscripten:${SYSROOT_DIR}/bin:${PREFIX}/bin \
EMSDK_NODE=${EMSDK}/node/current/bin/node \
CPPFLAGS="-I${PREFIX}/include" \
CFLAGS="-fPIC" \
CXXFLAGS="-fPIC" \
LDFLAGS="-L${PREFIX}/lib"

m4_include(`run-buildbot.m4')m4_dnl