From 883d8c66bbf4d2ef0129db6bb39a45ca88ee5809 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Sun, 23 Jan 2022 23:48:41 +0000 Subject: [PATCH 1/4] EMSCRIPTEN: Add Emscripten toolchain --- check-versions/config.py | 4 ++ toolchains/emscripten/Dockerfile.m4 | 70 +++++++++++++++++++ toolchains/emscripten/functions-platform.sh | 14 ++++ .../emscripten/packages/toolchain/build.sh | 23 ++++++ 4 files changed, 111 insertions(+) create mode 100644 toolchains/emscripten/Dockerfile.m4 create mode 100644 toolchains/emscripten/functions-platform.sh create mode 100755 toolchains/emscripten/packages/toolchain/build.sh diff --git a/check-versions/config.py b/check-versions/config.py index 41d1b066..08432d6b 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 00000000..b1f2f2e5 --- /dev/null +++ b/toolchains/emscripten/Dockerfile.m4 @@ -0,0 +1,70 @@ +m4_include(`paths.m4')m4_dnl +m4_include(`packages.m4')m4_dnl + +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 + +local_package(toolchain) + +# We add PATH here for *-config and platform specific binaries +ENV \ + def_aclocal(`${PREFIX}') \ + def_pkg_config(`${PREFIX}') \ + PATH=$PATH:${EMSDK}:${EMSDK}/node/14.18.2_64bit/bin:${EMSDK}/upstream/emscripten:${PREFIX}/bin \ + CPPFLAGS="-I${PREFIX}/include" \ + LDFLAGS="-L${PREFIX}/lib" + +RUN emcc -s USE_ZLIB -E - < /dev/null + +RUN emcc -s USE_LIBPNG=1 -E - < /dev/null + +RUN emcc -s USE_LIBJPEG=1 -E - < /dev/null + +RUN emcc -s USE_GIFLIB=1 -E - < /dev/null + +helpers_package(libmad, --with-pic --enable-fpm=no) + +RUN emcc -s USE_OGG=1 -E - < /dev/null + +RUN emcc -s USE_VORBIS=1 -E - < /dev/null + +helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1") + +# TODO: flac + +helpers_package(faad2, , CFLAGS="-fPIC") + +helpers_package(mpeg2dec, , CFLAGS="-fPIC") + +helpers_package(a52dec, , CFLAGS="-fPIC") + +# TODO: openssl + +# TODO: curl + +# TODO: fluidlite + +RUN emcc -s USE_FREETYPE=1 -E - < /dev/null + +# TODO: fribidi + +RUN emcc -s USE_SDL=2 -E - < /dev/null + +RUN emcc -s USE_SDL_NET=2 -E - < /dev/null diff --git a/toolchains/emscripten/functions-platform.sh b/toolchains/emscripten/functions-platform.sh new file mode 100644 index 00000000..06a7a02b --- /dev/null +++ b/toolchains/emscripten/functions-platform.sh @@ -0,0 +1,14 @@ +do_configure () { + emconfigure ./configure --prefix=$PREFIX --host=$HOST --disable-shared "$@" +} + +do_cmake () { + mkdir -p build + cd build + emcmake cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DBUILD_SHARED_LIBS=no "$@" .. +} + +do_make () { + emmake make "$@" +} diff --git a/toolchains/emscripten/packages/toolchain/build.sh b/toolchains/emscripten/packages/toolchain/build.sh new file mode 100755 index 00000000..208541dd --- /dev/null +++ b/toolchains/emscripten/packages/toolchain/build.sh @@ -0,0 +1,23 @@ +#! /bin/sh + +EMSDK_VERSION=3.1.1 + +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} + +do_clean_bdir + +# Cleanup wget HSTS +rm -f $HOME/.wget-hsts From cf17cbb23f87fdf79d06940bdc49010c5e8bf76b Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Wed, 15 Jun 2022 12:04:37 +0100 Subject: [PATCH 2/4] Emscripten WIP --- toolchains/emscripten/Dockerfile.m4 | 7 +- .../emscripten/packages/toolchain/build.sh | 2 +- .../toolchain/patches/emscripten-15893.patch | 332 ++++++++++++++++++ .../toolchain/patches/emscripten-sdl.patch | 13 + 4 files changed, 351 insertions(+), 3 deletions(-) create mode 100644 toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch create mode 100644 toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch diff --git a/toolchains/emscripten/Dockerfile.m4 b/toolchains/emscripten/Dockerfile.m4 index b1f2f2e5..aa20f6b0 100644 --- a/toolchains/emscripten/Dockerfile.m4 +++ b/toolchains/emscripten/Dockerfile.m4 @@ -43,9 +43,12 @@ helpers_package(libmad, --with-pic --enable-fpm=no) RUN emcc -s USE_OGG=1 -E - < /dev/null -RUN emcc -s USE_VORBIS=1 -E - < /dev/null +# Emscripten has an official port for vorbis, but it doesn't properly link vorbisfile https://github.com/emscripten-core/emscripten/pull/14005 +# RUN emcc -s USE_VORBIS=1 -E - < /dev/null +helpers_package(libvorbis, , CFLAGS="-fPIC -s USE_OGG=1") -helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1") +# helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1") +helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1") # TODO: flac diff --git a/toolchains/emscripten/packages/toolchain/build.sh b/toolchains/emscripten/packages/toolchain/build.sh index 208541dd..aafc4d20 100755 --- a/toolchains/emscripten/packages/toolchain/build.sh +++ b/toolchains/emscripten/packages/toolchain/build.sh @@ -1,6 +1,6 @@ #! /bin/sh -EMSDK_VERSION=3.1.1 +EMSDK_VERSION=3.1.6 PACKAGE_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) HELPERS_DIR=$PACKAGE_DIR/../.. diff --git a/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch b/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch new file mode 100644 index 00000000..60bf8e9e --- /dev/null +++ b/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch @@ -0,0 +1,332 @@ +From af4322618a2a6fd0474ff4d52e2e4f39b796c154 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Thu, 6 Jan 2022 14:55:48 +0900 +Subject: [PATCH 1/9] import mutable globals used in Asyncify pass + +--- + emcc.py | 9 +++++++++ + emscripten.py | 1 + + src/library.js | 6 ++++++ + 3 files changed, 16 insertions(+) + +diff --git a/emcc.py b/emcc.py +index fa3076eb8e0..2e3c816e7ef 100755 +--- a/emcc.py ++++ b/emcc.py +@@ -559,6 +559,8 @@ def get_binaryen_passes(): + passes += ['--fpcast-emu'] + if settings.ASYNCIFY: + passes += ['--asyncify'] ++ if settings.MAIN_MODULE or settings.SIDE_MODULE: ++ passes += ['--pass-arg=asyncify-side-module'] + if settings.ASSERTIONS: + passes += ['--pass-arg=asyncify-asserts'] + if settings.ASYNCIFY_ADVISE: +@@ -1771,6 +1773,13 @@ def phase_linker_setup(options, state, newargs, user_settings): + '__heap_base', + '__stack_pointer', + ] ++ ++ if settings.ASYNCIFY: ++ settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ ++ '__asyncify_state', ++ '__asyncify_data' ++ ] ++ + # Unconditional dependency in library_dylink.js + settings.REQUIRED_EXPORTS += ['setThrew'] + +diff --git a/emscripten.py b/emscripten.py +index b19c0f97eb9..beabb6fca3b 100644 +--- a/emscripten.py ++++ b/emscripten.py +@@ -344,6 +344,7 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): + + if settings.ASYNCIFY: + exports += ['asyncify_start_unwind', 'asyncify_stop_unwind', 'asyncify_start_rewind', 'asyncify_stop_rewind'] ++ metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] + + report_missing_symbols(forwarded_json['libraryFunctions']) + +diff --git a/src/library.js b/src/library.js +index b1947fc69d7..dcb54aae883 100644 +--- a/src/library.js ++++ b/src/library.js +@@ -3619,6 +3619,12 @@ LibraryManager.library = { + __c_longjmp: "new WebAssembly.Tag({'parameters': ['{{{ POINTER_TYPE }}}']})", + __c_longjmp_import: true, + #endif ++#if ASYNCIFY ++ __asyncify_state: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, 0)", ++ __asyncify_state__import: true, ++ __asyncify_data: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, 0)", ++ __asyncify_data__import: true, ++#endif + #endif + }; + + +From aeb0ce56b8a778b75182d2b3791ffa63b2080f44 Mon Sep 17 00:00:00 2001 +From: nokotan +Date: Sun, 23 Jan 2022 21:54:03 +0900 +Subject: [PATCH 2/9] move globals metadata modification + +--- + emscripten.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/emscripten.py b/emscripten.py +index beabb6fca3b..271213ad728 100644 +--- a/emscripten.py ++++ b/emscripten.py +@@ -324,6 +324,9 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): + if settings.INITIAL_TABLE == -1: + settings.INITIAL_TABLE = dylink_sec.table_size + 1 + ++ if settings.ASYNCIFY: ++ metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] ++ + glue, forwarded_data = compile_settings() + if DEBUG: + logger.debug(' emscript: glue took %s seconds' % (time.time() - t)) +@@ -344,7 +347,6 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): + + if settings.ASYNCIFY: + exports += ['asyncify_start_unwind', 'asyncify_stop_unwind', 'asyncify_start_rewind', 'asyncify_stop_rewind'] +- metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] + + report_missing_symbols(forwarded_json['libraryFunctions']) + + +From 1010d46660efb3322580ee6628412f5a78a7c6b8 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Tue, 25 Jan 2022 22:00:21 +0900 +Subject: [PATCH 3/9] Remove redundant spaces + +--- + emcc.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/emcc.py b/emcc.py +index 2e3c816e7ef..45b1eba4319 100755 +--- a/emcc.py ++++ b/emcc.py +@@ -1779,7 +1779,7 @@ def phase_linker_setup(options, state, newargs, user_settings): + '__asyncify_state', + '__asyncify_data' + ] +- ++ + # Unconditional dependency in library_dylink.js + settings.REQUIRED_EXPORTS += ['setThrew'] + + +From fe54d139855728e6c52956c05b231b4ae19c4f67 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Tue, 25 Jan 2022 22:10:36 +0900 +Subject: [PATCH 4/9] Add test_asyncify_side_module + +--- + tests/test_core.py | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/tests/test_core.py b/tests/test_core.py +index ca8ad60f9f8..f6033f83fe7 100644 +--- a/tests/test_core.py ++++ b/tests/test_core.py +@@ -7870,6 +7870,34 @@ def test_asyncify_indirect_lists(self, args, should_pass): + if should_pass: + raise + ++ @needs_dylink ++ @no_memory64('TODO: asyncify for wasm64') ++ def test_asyncify_side_module(self): ++ self.set_setting('ASYNCIFY') ++ self.emcc_args += ['-sASYNCIFY_IMPORTS=["_Z8my_sleepi"]'] ++ self.dylink_test(r''' ++ #include ++ #include "header.h" ++ ++ int main() { ++ my_sleep(1); ++ return 0; ++ } ++ ''', r''' ++ #include ++ #include ++ #include "header.h" ++ ++ void my_sleep(int milli_seconds) { ++ // put variable onto stack ++ volatile int value = 42; ++ printf("%d ", value); ++ emscripten_sleep(milli_seconds); ++ // variable on stack in side module function should be restored. ++ printf("%d\n", value); ++ } ++ ''', '42 42', header='void my_sleep(int);') ++ + @no_asan('asyncify stack operations confuse asan') + @no_memory64('TODO: asyncify for wasm64') + def test_emscripten_scan_registers(self): + +From afba627a0c6a1666b8d20aa2cbb08657b6694692 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Wed, 26 Jan 2022 01:29:14 +0900 +Subject: [PATCH 5/9] flake8, add EXIT_RUNTIME + +--- + tests/test_core.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tests/test_core.py b/tests/test_core.py +index f6033f83fe7..d7f5cead083 100644 +--- a/tests/test_core.py ++++ b/tests/test_core.py +@@ -7874,13 +7874,14 @@ def test_asyncify_indirect_lists(self, args, should_pass): + @no_memory64('TODO: asyncify for wasm64') + def test_asyncify_side_module(self): + self.set_setting('ASYNCIFY') ++ self.set_setting('EXIT_RUNTIME', 1) + self.emcc_args += ['-sASYNCIFY_IMPORTS=["_Z8my_sleepi"]'] + self.dylink_test(r''' + #include + #include "header.h" + + int main() { +- my_sleep(1); ++ my_sleep(1); + return 0; + } + ''', r''' + +From 1af80c0d84b794bb5fc807f788524066c06422a0 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Sun, 30 Jan 2022 02:39:01 +0900 +Subject: [PATCH 6/9] add instrumentWasmExports + +--- + src/library_dylink.js | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/library_dylink.js b/src/library_dylink.js +index 8ed16752912..9d1c69ec768 100644 +--- a/src/library_dylink.js ++++ b/src/library_dylink.js +@@ -570,6 +570,9 @@ var LibraryDylink = { + // add new entries to functionsInTableMap + updateTableMap(tableBase, metadata.tableSize); + moduleExports = relocateExports(instance.exports, memoryBase); ++#if ASYNCIFY ++ moduleExports = Asyncify.instrumentWasmExports(moduleExports); ++#endif + if (!flags.allowUndefined) { + reportUndefinedSymbols(); + } + +From d5a90f3deec595fd6f0de0d16caf6183b20ad6c3 Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Sun, 30 Jan 2022 02:39:56 +0900 +Subject: [PATCH 7/9] add searched symbols in getDataRewindFunc + +--- + src/library_async.js | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/library_async.js b/src/library_async.js +index da09a1ae2d8..0ceb072dd37 100644 +--- a/src/library_async.js ++++ b/src/library_async.js +@@ -205,6 +205,11 @@ mergeInto(LibraryManager.library, { + var id = {{{ makeGetValue('ptr', C_STRUCTS.asyncify_data_s.rewind_id, 'i32') }}}; + var name = Asyncify.callStackIdToName[id]; + var func = Module['asm'][name]; ++#if RELOCATABLE ++ if (!func) { ++ func = Module[asmjsMangle(name)]; ++ } ++#endif + return func; + }, + + +From 23f45459f660f307012c725449eec1240c389a4c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=BCndig?= +Date: Fri, 18 Feb 2022 18:15:53 +0100 +Subject: [PATCH 8/9] Fixing dlsym for emscripten-core/emscripten#15893 + +--- + src/library_dylink.js | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/library_dylink.js b/src/library_dylink.js +index 9d1c69ec768..e2ed388a1fc 100644 +--- a/src/library_dylink.js ++++ b/src/library_dylink.js +@@ -962,6 +962,12 @@ var LibraryDylink = { + #if DYLINK_DEBUG + err('dlsym: ' + symbol + ' getting table slot for: ' + result); + #endif ++ ++#if ASYNCIFY ++ if(symbol in GOT && GOT[symbol].value != 0) { ++ return GOT[symbol].value ++ } ++#endif + // Insert the function into the wasm table. If its a direct wasm function + // the second argument will not be needed. If its a JS function we rely + // on the `sig` attribute being set based on the `__sig` specified + +From de6021f93f6be8c76b5d546ab85b50de8dd63cae Mon Sep 17 00:00:00 2001 +From: kamenokonokotan +Date: Sun, 6 Mar 2022 00:05:00 +0900 +Subject: [PATCH 9/9] Add test case test_asyncify_dlfcn + +--- + tests/test_core.py | 33 +++++++++++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +diff --git a/tests/test_core.py b/tests/test_core.py +index d7f5cead083..e21072d143e 100644 +--- a/tests/test_core.py ++++ b/tests/test_core.py +@@ -7899,6 +7899,39 @@ def test_asyncify_side_module(self): + } + ''', '42 42', header='void my_sleep(int);') + ++ @needs_dylink ++ @no_memory64('TODO: asyncify for wasm64') ++ def test_asyncify_dlfcn(self): ++ self.set_setting('ASYNCIFY') ++ self.set_setting('EXIT_RUNTIME', 1) ++ self.emcc_args += ['-sASYNCIFY_IGNORE_INDIRECT=0'] ++ self.dylink_test(r''' ++ #include ++ #include ++ ++ typedef int (*func_t)(); ++ ++ int main(int argc, char **argv) ++ { ++ void *_dlHandle = dlopen("liblib.so", RTLD_NOW | RTLD_LOCAL); ++ func_t my_func = (func_t)dlsym(_dlHandle, "side_module_run"); ++ printf("%d\n", my_func()); ++ return 0; ++ } ++ ''', r''' ++ #include ++ #include ++ ++ extern "C" ++ { ++ int side_module_run() ++ { ++ emscripten_sleep(1000); ++ return 42; ++ } ++ } ++ ''', '42', need_reverse=False) ++ + @no_asan('asyncify stack operations confuse asan') + @no_memory64('TODO: asyncify for wasm64') + def test_emscripten_scan_registers(self): diff --git a/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch b/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch new file mode 100644 index 00000000..8ecd75df --- /dev/null +++ b/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch @@ -0,0 +1,13 @@ +--- a/tools/ports/sdl2.py 2022-03-18 17:48:16.000000000 +0100 ++++ b/tools/ports/sdl2.py 2022-03-18 17:49:49.000000000 +0100 +@@ -5,8 +5,8 @@ + + import os + +-TAG = 'release-2.0.20' +-HASH = '67e1abe1183b04836b35d724fd495c83c9559b4530d4a5c9bcc89648af0ac7cc51c02f7055a1664fe5f5f90953d22a6c431fa8bc5cdd77c94a97f107c47e2d62' ++TAG = 'a485ffc3c8d040fc87893b61cd8cddda4248243f' ++HASH = 'c9014265ad3215edc08414dec1034c10f07f9092ce52b8cb0d0122d470b4565fc09ce9f9e8629417d553d3571384133ba30ee4ba018fb01bccb5b7a0d9b61617' + SUBDIR = 'SDL-' + TAG + + From 5571b12218f18c3a423925698134612eb0c6462c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=BCndig?= Date: Fri, 25 Jul 2025 23:36:06 +0200 Subject: [PATCH 3/4] Update Emscripten WIP --- toolchains/emscripten/Dockerfile.m4 | 7 +- toolchains/emscripten/functions-platform.sh | 3 + .../emscripten/packages/toolchain/build.sh | 2 +- .../toolchain/patches/emscripten-15893.patch | 332 ------------------ .../toolchain/patches/emscripten-sdl.patch | 13 - 5 files changed, 5 insertions(+), 352 deletions(-) delete mode 100644 toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch delete mode 100644 toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch diff --git a/toolchains/emscripten/Dockerfile.m4 b/toolchains/emscripten/Dockerfile.m4 index aa20f6b0..4a3712e1 100644 --- a/toolchains/emscripten/Dockerfile.m4 +++ b/toolchains/emscripten/Dockerfile.m4 @@ -43,9 +43,7 @@ helpers_package(libmad, --with-pic --enable-fpm=no) RUN emcc -s USE_OGG=1 -E - < /dev/null -# Emscripten has an official port for vorbis, but it doesn't properly link vorbisfile https://github.com/emscripten-core/emscripten/pull/14005 -# RUN emcc -s USE_VORBIS=1 -E - < /dev/null -helpers_package(libvorbis, , CFLAGS="-fPIC -s USE_OGG=1") +RUN emcc -s USE_VORBIS=1 -E - < /dev/null # helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1") helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1") @@ -58,9 +56,6 @@ helpers_package(mpeg2dec, , CFLAGS="-fPIC") helpers_package(a52dec, , CFLAGS="-fPIC") -# TODO: openssl - -# TODO: curl # TODO: fluidlite diff --git a/toolchains/emscripten/functions-platform.sh b/toolchains/emscripten/functions-platform.sh index 06a7a02b..cbbe248a 100644 --- a/toolchains/emscripten/functions-platform.sh +++ b/toolchains/emscripten/functions-platform.sh @@ -1,8 +1,10 @@ do_configure () { + source "$EMSDK/emsdk_env.sh" emconfigure ./configure --prefix=$PREFIX --host=$HOST --disable-shared "$@" } do_cmake () { + source "$EMSDK/emsdk_env.sh" mkdir -p build cd build emcmake cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -10,5 +12,6 @@ do_cmake () { } do_make () { + source "$EMSDK/emsdk_env.sh" emmake make "$@" } diff --git a/toolchains/emscripten/packages/toolchain/build.sh b/toolchains/emscripten/packages/toolchain/build.sh index aafc4d20..6793d1ec 100755 --- a/toolchains/emscripten/packages/toolchain/build.sh +++ b/toolchains/emscripten/packages/toolchain/build.sh @@ -1,6 +1,6 @@ #! /bin/sh -EMSDK_VERSION=3.1.6 +EMSDK_VERSION=4.0.10 PACKAGE_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) HELPERS_DIR=$PACKAGE_DIR/../.. diff --git a/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch b/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch deleted file mode 100644 index 60bf8e9e..00000000 --- a/toolchains/emscripten/packages/toolchain/patches/emscripten-15893.patch +++ /dev/null @@ -1,332 +0,0 @@ -From af4322618a2a6fd0474ff4d52e2e4f39b796c154 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Thu, 6 Jan 2022 14:55:48 +0900 -Subject: [PATCH 1/9] import mutable globals used in Asyncify pass - ---- - emcc.py | 9 +++++++++ - emscripten.py | 1 + - src/library.js | 6 ++++++ - 3 files changed, 16 insertions(+) - -diff --git a/emcc.py b/emcc.py -index fa3076eb8e0..2e3c816e7ef 100755 ---- a/emcc.py -+++ b/emcc.py -@@ -559,6 +559,8 @@ def get_binaryen_passes(): - passes += ['--fpcast-emu'] - if settings.ASYNCIFY: - passes += ['--asyncify'] -+ if settings.MAIN_MODULE or settings.SIDE_MODULE: -+ passes += ['--pass-arg=asyncify-side-module'] - if settings.ASSERTIONS: - passes += ['--pass-arg=asyncify-asserts'] - if settings.ASYNCIFY_ADVISE: -@@ -1771,6 +1773,13 @@ def phase_linker_setup(options, state, newargs, user_settings): - '__heap_base', - '__stack_pointer', - ] -+ -+ if settings.ASYNCIFY: -+ settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ -+ '__asyncify_state', -+ '__asyncify_data' -+ ] -+ - # Unconditional dependency in library_dylink.js - settings.REQUIRED_EXPORTS += ['setThrew'] - -diff --git a/emscripten.py b/emscripten.py -index b19c0f97eb9..beabb6fca3b 100644 ---- a/emscripten.py -+++ b/emscripten.py -@@ -344,6 +344,7 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): - - if settings.ASYNCIFY: - exports += ['asyncify_start_unwind', 'asyncify_stop_unwind', 'asyncify_start_rewind', 'asyncify_stop_rewind'] -+ metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] - - report_missing_symbols(forwarded_json['libraryFunctions']) - -diff --git a/src/library.js b/src/library.js -index b1947fc69d7..dcb54aae883 100644 ---- a/src/library.js -+++ b/src/library.js -@@ -3619,6 +3619,12 @@ LibraryManager.library = { - __c_longjmp: "new WebAssembly.Tag({'parameters': ['{{{ POINTER_TYPE }}}']})", - __c_longjmp_import: true, - #endif -+#if ASYNCIFY -+ __asyncify_state: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, 0)", -+ __asyncify_state__import: true, -+ __asyncify_data: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, 0)", -+ __asyncify_data__import: true, -+#endif - #endif - }; - - -From aeb0ce56b8a778b75182d2b3791ffa63b2080f44 Mon Sep 17 00:00:00 2001 -From: nokotan -Date: Sun, 23 Jan 2022 21:54:03 +0900 -Subject: [PATCH 2/9] move globals metadata modification - ---- - emscripten.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/emscripten.py b/emscripten.py -index beabb6fca3b..271213ad728 100644 ---- a/emscripten.py -+++ b/emscripten.py -@@ -324,6 +324,9 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): - if settings.INITIAL_TABLE == -1: - settings.INITIAL_TABLE = dylink_sec.table_size + 1 - -+ if settings.ASYNCIFY: -+ metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] -+ - glue, forwarded_data = compile_settings() - if DEBUG: - logger.debug(' emscript: glue took %s seconds' % (time.time() - t)) -@@ -344,7 +347,6 @@ def emscript(in_wasm, out_wasm, outfile_js, memfile): - - if settings.ASYNCIFY: - exports += ['asyncify_start_unwind', 'asyncify_stop_unwind', 'asyncify_start_rewind', 'asyncify_stop_rewind'] -- metadata['globalImports'] += ['__asyncify_state', '__asyncify_data'] - - report_missing_symbols(forwarded_json['libraryFunctions']) - - -From 1010d46660efb3322580ee6628412f5a78a7c6b8 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Tue, 25 Jan 2022 22:00:21 +0900 -Subject: [PATCH 3/9] Remove redundant spaces - ---- - emcc.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/emcc.py b/emcc.py -index 2e3c816e7ef..45b1eba4319 100755 ---- a/emcc.py -+++ b/emcc.py -@@ -1779,7 +1779,7 @@ def phase_linker_setup(options, state, newargs, user_settings): - '__asyncify_state', - '__asyncify_data' - ] -- -+ - # Unconditional dependency in library_dylink.js - settings.REQUIRED_EXPORTS += ['setThrew'] - - -From fe54d139855728e6c52956c05b231b4ae19c4f67 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Tue, 25 Jan 2022 22:10:36 +0900 -Subject: [PATCH 4/9] Add test_asyncify_side_module - ---- - tests/test_core.py | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/tests/test_core.py b/tests/test_core.py -index ca8ad60f9f8..f6033f83fe7 100644 ---- a/tests/test_core.py -+++ b/tests/test_core.py -@@ -7870,6 +7870,34 @@ def test_asyncify_indirect_lists(self, args, should_pass): - if should_pass: - raise - -+ @needs_dylink -+ @no_memory64('TODO: asyncify for wasm64') -+ def test_asyncify_side_module(self): -+ self.set_setting('ASYNCIFY') -+ self.emcc_args += ['-sASYNCIFY_IMPORTS=["_Z8my_sleepi"]'] -+ self.dylink_test(r''' -+ #include -+ #include "header.h" -+ -+ int main() { -+ my_sleep(1); -+ return 0; -+ } -+ ''', r''' -+ #include -+ #include -+ #include "header.h" -+ -+ void my_sleep(int milli_seconds) { -+ // put variable onto stack -+ volatile int value = 42; -+ printf("%d ", value); -+ emscripten_sleep(milli_seconds); -+ // variable on stack in side module function should be restored. -+ printf("%d\n", value); -+ } -+ ''', '42 42', header='void my_sleep(int);') -+ - @no_asan('asyncify stack operations confuse asan') - @no_memory64('TODO: asyncify for wasm64') - def test_emscripten_scan_registers(self): - -From afba627a0c6a1666b8d20aa2cbb08657b6694692 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Wed, 26 Jan 2022 01:29:14 +0900 -Subject: [PATCH 5/9] flake8, add EXIT_RUNTIME - ---- - tests/test_core.py | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/tests/test_core.py b/tests/test_core.py -index f6033f83fe7..d7f5cead083 100644 ---- a/tests/test_core.py -+++ b/tests/test_core.py -@@ -7874,13 +7874,14 @@ def test_asyncify_indirect_lists(self, args, should_pass): - @no_memory64('TODO: asyncify for wasm64') - def test_asyncify_side_module(self): - self.set_setting('ASYNCIFY') -+ self.set_setting('EXIT_RUNTIME', 1) - self.emcc_args += ['-sASYNCIFY_IMPORTS=["_Z8my_sleepi"]'] - self.dylink_test(r''' - #include - #include "header.h" - - int main() { -- my_sleep(1); -+ my_sleep(1); - return 0; - } - ''', r''' - -From 1af80c0d84b794bb5fc807f788524066c06422a0 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Sun, 30 Jan 2022 02:39:01 +0900 -Subject: [PATCH 6/9] add instrumentWasmExports - ---- - src/library_dylink.js | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/library_dylink.js b/src/library_dylink.js -index 8ed16752912..9d1c69ec768 100644 ---- a/src/library_dylink.js -+++ b/src/library_dylink.js -@@ -570,6 +570,9 @@ var LibraryDylink = { - // add new entries to functionsInTableMap - updateTableMap(tableBase, metadata.tableSize); - moduleExports = relocateExports(instance.exports, memoryBase); -+#if ASYNCIFY -+ moduleExports = Asyncify.instrumentWasmExports(moduleExports); -+#endif - if (!flags.allowUndefined) { - reportUndefinedSymbols(); - } - -From d5a90f3deec595fd6f0de0d16caf6183b20ad6c3 Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Sun, 30 Jan 2022 02:39:56 +0900 -Subject: [PATCH 7/9] add searched symbols in getDataRewindFunc - ---- - src/library_async.js | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/library_async.js b/src/library_async.js -index da09a1ae2d8..0ceb072dd37 100644 ---- a/src/library_async.js -+++ b/src/library_async.js -@@ -205,6 +205,11 @@ mergeInto(LibraryManager.library, { - var id = {{{ makeGetValue('ptr', C_STRUCTS.asyncify_data_s.rewind_id, 'i32') }}}; - var name = Asyncify.callStackIdToName[id]; - var func = Module['asm'][name]; -+#if RELOCATABLE -+ if (!func) { -+ func = Module[asmjsMangle(name)]; -+ } -+#endif - return func; - }, - - -From 23f45459f660f307012c725449eec1240c389a4c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Christian=20K=C3=BCndig?= -Date: Fri, 18 Feb 2022 18:15:53 +0100 -Subject: [PATCH 8/9] Fixing dlsym for emscripten-core/emscripten#15893 - ---- - src/library_dylink.js | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/src/library_dylink.js b/src/library_dylink.js -index 9d1c69ec768..e2ed388a1fc 100644 ---- a/src/library_dylink.js -+++ b/src/library_dylink.js -@@ -962,6 +962,12 @@ var LibraryDylink = { - #if DYLINK_DEBUG - err('dlsym: ' + symbol + ' getting table slot for: ' + result); - #endif -+ -+#if ASYNCIFY -+ if(symbol in GOT && GOT[symbol].value != 0) { -+ return GOT[symbol].value -+ } -+#endif - // Insert the function into the wasm table. If its a direct wasm function - // the second argument will not be needed. If its a JS function we rely - // on the `sig` attribute being set based on the `__sig` specified - -From de6021f93f6be8c76b5d546ab85b50de8dd63cae Mon Sep 17 00:00:00 2001 -From: kamenokonokotan -Date: Sun, 6 Mar 2022 00:05:00 +0900 -Subject: [PATCH 9/9] Add test case test_asyncify_dlfcn - ---- - tests/test_core.py | 33 +++++++++++++++++++++++++++++++++ - 1 file changed, 33 insertions(+) - -diff --git a/tests/test_core.py b/tests/test_core.py -index d7f5cead083..e21072d143e 100644 ---- a/tests/test_core.py -+++ b/tests/test_core.py -@@ -7899,6 +7899,39 @@ def test_asyncify_side_module(self): - } - ''', '42 42', header='void my_sleep(int);') - -+ @needs_dylink -+ @no_memory64('TODO: asyncify for wasm64') -+ def test_asyncify_dlfcn(self): -+ self.set_setting('ASYNCIFY') -+ self.set_setting('EXIT_RUNTIME', 1) -+ self.emcc_args += ['-sASYNCIFY_IGNORE_INDIRECT=0'] -+ self.dylink_test(r''' -+ #include -+ #include -+ -+ typedef int (*func_t)(); -+ -+ int main(int argc, char **argv) -+ { -+ void *_dlHandle = dlopen("liblib.so", RTLD_NOW | RTLD_LOCAL); -+ func_t my_func = (func_t)dlsym(_dlHandle, "side_module_run"); -+ printf("%d\n", my_func()); -+ return 0; -+ } -+ ''', r''' -+ #include -+ #include -+ -+ extern "C" -+ { -+ int side_module_run() -+ { -+ emscripten_sleep(1000); -+ return 42; -+ } -+ } -+ ''', '42', need_reverse=False) -+ - @no_asan('asyncify stack operations confuse asan') - @no_memory64('TODO: asyncify for wasm64') - def test_emscripten_scan_registers(self): diff --git a/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch b/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch deleted file mode 100644 index 8ecd75df..00000000 --- a/toolchains/emscripten/packages/toolchain/patches/emscripten-sdl.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/tools/ports/sdl2.py 2022-03-18 17:48:16.000000000 +0100 -+++ b/tools/ports/sdl2.py 2022-03-18 17:49:49.000000000 +0100 -@@ -5,8 +5,8 @@ - - import os - --TAG = 'release-2.0.20' --HASH = '67e1abe1183b04836b35d724fd495c83c9559b4530d4a5c9bcc89648af0ac7cc51c02f7055a1664fe5f5f90953d22a6c431fa8bc5cdd77c94a97f107c47e2d62' -+TAG = 'a485ffc3c8d040fc87893b61cd8cddda4248243f' -+HASH = 'c9014265ad3215edc08414dec1034c10f07f9092ce52b8cb0d0122d470b4565fc09ce9f9e8629417d553d3571384133ba30ee4ba018fb01bccb5b7a0d9b61617' - SUBDIR = 'SDL-' + TAG - - From d7baa9e3e2a47d0c5fda1834f3cb902545d13e60 Mon Sep 17 00:00:00 2001 From: Le Philousophe Date: Mon, 28 Jul 2025 10:24:32 +0000 Subject: [PATCH 4/4] Emscripten WIP --- buildbot-config/platforms.py | 23 ++++++++ toolchains/emscripten/Dockerfile.m4 | 55 ++++++++++++------- toolchains/emscripten/functions-platform.sh | 25 +++++++-- .../emscripten/packages/toolchain/build.sh | 5 ++ workers/emscripten/Dockerfile.m4 | 36 ++++++++++++ 5 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 workers/emscripten/Dockerfile.m4 diff --git a/buildbot-config/platforms.py b/buildbot-config/platforms.py index 69db7380..d65056d6 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/toolchains/emscripten/Dockerfile.m4 b/toolchains/emscripten/Dockerfile.m4 index 4a3712e1..3aafad3a 100644 --- a/toolchains/emscripten/Dockerfile.m4 +++ b/toolchains/emscripten/Dockerfile.m4 @@ -1,5 +1,8 @@ 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 @@ -19,50 +22,64 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* ENV EMSDK=/usr/local/emscripten HOST=wasm32-unknown-none -ENV PREFIX=$EMSDK/scummvm-libs +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}') \ - def_pkg_config(`${PREFIX}') \ - PATH=$PATH:${EMSDK}:${EMSDK}/node/14.18.2_64bit/bin:${EMSDK}/upstream/emscripten:${PREFIX}/bin \ + 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" -RUN emcc -s USE_ZLIB -E - < /dev/null +# Build system libraries for PIC +em_package(libGL, libal, libhtml5, libstubs, libnoexit, libc, + libdlmalloc, libcompiler_rt, libc++-noexcept, libc++abi-noexcept, libsockets) -RUN emcc -s USE_LIBPNG=1 -E - < /dev/null +em_package(zlib) -RUN emcc -s USE_LIBJPEG=1 -E - < /dev/null +em_package(libpng) -RUN emcc -s USE_GIFLIB=1 -E - < /dev/null +em_package(libjpeg) -helpers_package(libmad, --with-pic --enable-fpm=no) +em_package(giflib) -RUN emcc -s USE_OGG=1 -E - < /dev/null +helpers_package(libmad, --with-pic --enable-fpm=64bit) -RUN emcc -s USE_VORBIS=1 -E - < /dev/null +em_package(ogg) -# helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1 -s USE_VORBIS=1") -helpers_package(libtheora, --disable-asm, CFLAGS="-fPIC -s USE_OGG=1") +em_package(vorbis) -# TODO: flac +# helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1 -sUSE_VORBIS=1") +helpers_package(libtheora, --disable-asm, CFLAGS="$CFLAGS -sUSE_OGG=1") -helpers_package(faad2, , CFLAGS="-fPIC") +# TODO: flac -helpers_package(mpeg2dec, , CFLAGS="-fPIC") +helpers_package(faad2) -helpers_package(a52dec, , CFLAGS="-fPIC") +helpers_package(mpeg2dec) +helpers_package(a52dec) # TODO: fluidlite -RUN emcc -s USE_FREETYPE=1 -E - < /dev/null +em_package(freetype) # TODO: fribidi -RUN emcc -s USE_SDL=2 -E - < /dev/null +# This is needed for SDL2 +em_package(libGL-getprocaddr) + +em_package(sdl2) -RUN emcc -s USE_SDL_NET=2 -E - < /dev/null +em_package(sdl2_net) diff --git a/toolchains/emscripten/functions-platform.sh b/toolchains/emscripten/functions-platform.sh index cbbe248a..19e2fde0 100644 --- a/toolchains/emscripten/functions-platform.sh +++ b/toolchains/emscripten/functions-platform.sh @@ -1,17 +1,30 @@ -do_configure () { - source "$EMSDK/emsdk_env.sh" +__do_configure_emscripten () { emconfigure ./configure --prefix=$PREFIX --host=$HOST --disable-shared "$@" } -do_cmake () { - source "$EMSDK/emsdk_env.sh" +__do_cmake_emscripten () { mkdir -p build cd build emcmake cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DBUILD_SHARED_LIBS=no "$@" .. } -do_make () { - source "$EMSDK/emsdk_env.sh" +__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 index 6793d1ec..ebbd9ef7 100755 --- a/toolchains/emscripten/packages/toolchain/build.sh +++ b/toolchains/emscripten/packages/toolchain/build.sh @@ -17,6 +17,11 @@ 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 diff --git a/workers/emscripten/Dockerfile.m4 b/workers/emscripten/Dockerfile.m4 new file mode 100644 index 00000000..648b2045 --- /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