From 4a83cfbe32e838818d4234a4d5332ae4d08a3f79 Mon Sep 17 00:00:00 2001 From: Alexey Shamrin Date: Sat, 16 Jul 2022 02:11:17 +0300 Subject: [PATCH 1/3] fix build failures when any parent directory is {"type": "module"} This fixes hard-to-debug failures when any parent directory has package.json with {"type": "module"} in it. Before emconfigure / conftest could fail with config.log error: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" The fix forces commonjs mode for generated Node scripts. fixes #13551 fixes #17431 --- commonjs-loader.mjs | 1 + emcc.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 commonjs-loader.mjs diff --git a/commonjs-loader.mjs b/commonjs-loader.mjs new file mode 100644 index 0000000000000..5ee1ba82d6ba9 --- /dev/null +++ b/commonjs-loader.mjs @@ -0,0 +1 @@ +export async function getFormat() { return { format: "commonjs" } } diff --git a/emcc.py b/emcc.py index f0ef4e95b2664..a2ef423cf5486 100755 --- a/emcc.py +++ b/emcc.py @@ -620,6 +620,12 @@ def make_js_executable(script): cmd = config.JS_ENGINE if settings.WASM_BIGINT: cmd.append('--experimental-wasm-bigint') + + # Force commonjs mode. This prevents build failures when any parent + # directory happen to contain package.json with {"type": "module"}. + # See https://github.com/emscripten-core/emscripten/issues/17431 + cmd.extend(['--experimental-loader', os.path.join(os.path.dirname(__file__), 'commonjs-loader.mjs')]) + cmd = shared.shlex_join(cmd) if not os.path.isabs(config.JS_ENGINE[0]): # TODO: use whereis etc. And how about non-*NIX? From c87888ab66066c4de4548fef2fabaeb603a049cf Mon Sep 17 00:00:00 2001 From: Alexey Shamrin Date: Mon, 18 Jul 2022 01:16:59 +0300 Subject: [PATCH 2/3] write js executable to .cjs file, with a shell wrapper --- emcc.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/emcc.py b/emcc.py index a2ef423cf5486..2eb04eea1c5ae 100755 --- a/emcc.py +++ b/emcc.py @@ -621,20 +621,22 @@ def make_js_executable(script): if settings.WASM_BIGINT: cmd.append('--experimental-wasm-bigint') - # Force commonjs mode. This prevents build failures when any parent - # directory happen to contain package.json with {"type": "module"}. + # Write script file with .cjs extension to force Node to commonjs mode. + # This prevents build failures when any parent directory has + # package.json with {"type": "module"}. In addition, write a shell + # wrapper that calls node with this .cjs script, because autoconf + # does not expect its conftest binary to have an extension. # See https://github.com/emscripten-core/emscripten/issues/17431 - cmd.extend(['--experimental-loader', os.path.join(os.path.dirname(__file__), 'commonjs-loader.mjs')]) - + cjs_script = script + '.cjs' + cmd.append(cjs_script) cmd = shared.shlex_join(cmd) - if not os.path.isabs(config.JS_ENGINE[0]): - # TODO: use whereis etc. And how about non-*NIX? - cmd = '/usr/bin/env -S ' + cmd - logger.debug('adding `#!` to JavaScript file: %s' % cmd) - # add shebang - with open(script, 'w') as f: - f.write('#!%s\n' % cmd) + logger.debug('writing %s JavaScript file' % cjs_script) + with open(cjs_script, 'w') as f: f.write(src) + logger.debug('writing a %s shell wrapper for %s JavaScript file: %s' % (script, cjs_script, cmd)) + with open(script, 'w') as f: + f.write('#!/bin/sh\n') + f.write(cmd) try: os.chmod(script, stat.S_IMODE(os.stat(script).st_mode) | stat.S_IXUSR) # make executable except OSError: From d87fd15d26b01006ee3545254d9d582e0f846a29 Mon Sep 17 00:00:00 2001 From: Alexey Shamrin Date: Mon, 18 Jul 2022 01:21:06 +0300 Subject: [PATCH 3/3] Delete commonjs-loader.mjs --- commonjs-loader.mjs | 1 - 1 file changed, 1 deletion(-) delete mode 100644 commonjs-loader.mjs diff --git a/commonjs-loader.mjs b/commonjs-loader.mjs deleted file mode 100644 index 5ee1ba82d6ba9..0000000000000 --- a/commonjs-loader.mjs +++ /dev/null @@ -1 +0,0 @@ -export async function getFormat() { return { format: "commonjs" } }