diff --git a/buildbot-config/platforms.py b/buildbot-config/platforms.py index 69db738..d65056d 100644 --- a/buildbot-config/platforms.py +++ b/buildbot-config/platforms.py @@ -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" diff --git a/check-versions/config.py b/check-versions/config.py index 41d1b06..08432d6 100644 --- a/check-versions/config.py +++ b/check-versions/config.py @@ -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', diff --git a/toolchains/emscripten/Dockerfile.m4 b/toolchains/emscripten/Dockerfile.m4 new file mode 100644 index 0000000..3aafad3 --- /dev/null +++ b/toolchains/emscripten/Dockerfile.m4 @@ -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) diff --git a/toolchains/emscripten/functions-platform.sh b/toolchains/emscripten/functions-platform.sh new file mode 100644 index 0000000..19e2fde --- /dev/null +++ b/toolchains/emscripten/functions-platform.sh @@ -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 diff --git a/toolchains/emscripten/packages/toolchain/build.sh b/toolchains/emscripten/packages/toolchain/build.sh new file mode 100755 index 0000000..ebbd9ef --- /dev/null +++ b/toolchains/emscripten/packages/toolchain/build.sh @@ -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 diff --git a/workers/emscripten/Dockerfile.m4 b/workers/emscripten/Dockerfile.m4 new file mode 100644 index 0000000..648b204 --- /dev/null +++ b/workers/emscripten/Dockerfile.m4 @@ -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