From d30ba160ed764fbdc6d49363bb8f71d9aa5a29d8 Mon Sep 17 00:00:00 2001 From: juj Date: Fri, 10 Jan 2020 22:11:38 +0200 Subject: [PATCH] Add npm install step as post-build to Emscripten (#404) * Add npm install step as post-build to Emscripten * Address review * Run npm install on releases-upstream and releases-fastcomp * Fix node path * Add node to PATH * Only install production packages with npm * Address review --- emsdk.py | 49 ++++++++++++++++++++++++++++++++++++++++----- emsdk_manifest.json | 42 +++++++++++++++++++++----------------- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/emsdk.py b/emsdk.py index fbc6337..9892d74 100755 --- a/emsdk.py +++ b/emsdk.py @@ -1258,8 +1258,34 @@ def is_optimizer_installed(tool): return os.path.exists(build_root) -def build_optimizer_tool(tool): - debug_print('build_optimizer_tool(' + str(tool) + ')') +# Finds newest tool of given name that is active, or if none are active, finds the newest one that is installed. +def find_latest_active_or_installed_tool(name): + for t in reversed(tools): + if t.id == name and t.is_active(): + return t + + for t in reversed(tools): + if t.id == name and t.is_installed(): + return t + + +# npm install in Emscripten root directory +def emscripten_npm_install(tool, directory): + node_tool = find_latest_active_or_installed_tool('node') + if not node_tool: + print('Failed to run "npm install" in installed Emscripten root directory ' + tool.installation_path() + '! Please install node.js first!') + return False + + node_path = os.path.join(node_tool.installation_path(), 'bin') + npm = os.path.join(node_path, 'npm' + ('.cmd' if WINDOWS else '')) + env = os.environ.copy() + env["PATH"] = node_path + os.pathsep + env["PATH"] + subprocess.check_call([npm, 'install', '--production'], cwd=directory, env=env) + return True + + +def emscripten_post_install(tool): + debug_print('emscripten_post_install(' + str(tool) + ')') src_root = os.path.join(tool.installation_path(), 'tools', 'optimizer') build_root = optimizer_build_root(tool) build_type = decide_cmake_build_type(tool) @@ -1282,7 +1308,12 @@ def build_optimizer_tool(tool): # Make success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32') - return success + if not success: + return False + + success = emscripten_npm_install(tool, tool.installation_path()) + + return True # Binaryen build scripts: @@ -1819,6 +1850,12 @@ class Tool(object): success = tool.install() if not success: return False + if getattr(self, 'custom_install_script', None) == 'emscripten_npm_install': + # upstream tools have hardcoded paths that are not stored in emsdk_manifest.json registry + install_path = 'upstream' if 'releases-upstream' in self.version else 'fastcomp' + success = emscripten_npm_install(self, os.path.join(emsdk_path(), install_path, 'emscripten')) + if not success: + return False print("Done installing SDK '" + str(self) + "'.") return True else: @@ -1859,8 +1896,10 @@ class Tool(object): if success: if hasattr(self, 'custom_install_script'): - if self.custom_install_script == 'build_optimizer': - success = build_optimizer_tool(self) + if self.custom_install_script == 'emscripten_post_install': + success = emscripten_post_install(self) + elif self.custom_install_script == 'emscripten_npm_install': + success = emscripten_npm_install(self, self.installation_path()) elif self.custom_install_script in ('build_fastcomp', 'build_llvm_monorepo'): # 'build_fastcomp' is a special one that does the download on its # own, others do the download manually. diff --git a/emsdk_manifest.json b/emsdk_manifest.json index 7cb7f8d..07af4e4 100644 --- a/emsdk_manifest.json +++ b/emsdk_manifest.json @@ -384,7 +384,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_32bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -399,7 +399,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_64bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -464,7 +464,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_32bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -479,7 +479,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_32bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -494,7 +494,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_64bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -509,7 +509,7 @@ "activated_path": "%installation_dir%", "activated_env": "EMSCRIPTEN=%installation_dir%;EMSCRIPTEN_NATIVE_OPTIMIZER=%installation_dir%%generator_prefix%_64bit_optimizer/%cmake_build_type_on_win%optimizer%.exe%", "cmake_build_type": "Release", - "custom_install_script": "build_optimizer", + "custom_install_script": "emscripten_post_install", "custom_is_installed_script": "is_optimizer_installed", "custom_uninstall_script": "uninstall_optimizer" }, @@ -776,38 +776,44 @@ { "version": "releases-upstream-%releases-tag%", "bitness": 64, - "uses": ["releases-upstream-%releases-tag%-64bit", "node-12.9.1-64bit"], - "os": "linux" + "uses": ["node-12.9.1-64bit", "releases-upstream-%releases-tag%-64bit"], + "os": "linux", + "custom_install_script": "emscripten_npm_install" }, { "version": "releases-upstream-%releases-tag%", "bitness": 64, - "uses": ["releases-upstream-%releases-tag%-64bit", "node-12.9.1-64bit"], - "os": "osx" + "uses": ["node-12.9.1-64bit", "releases-upstream-%releases-tag%-64bit"], + "os": "osx", + "custom_install_script": "emscripten_npm_install" }, { "version": "releases-upstream-%releases-tag%", "bitness": 64, - "uses": ["releases-upstream-%releases-tag%-64bit", "node-12.9.1-64bit", "python-2.7.13.1-64bit", "java-8.152-64bit"], - "os": "win" + "uses": ["node-12.9.1-64bit", "python-2.7.13.1-64bit", "java-8.152-64bit", "releases-upstream-%releases-tag%-64bit"], + "os": "win", + "custom_install_script": "emscripten_npm_install" }, { "version": "releases-fastcomp-%releases-tag%", "bitness": 64, - "uses": ["releases-fastcomp-%releases-tag%-64bit", "node-12.9.1-64bit"], - "os": "linux" + "uses": ["node-12.9.1-64bit", "releases-fastcomp-%releases-tag%-64bit"], + "os": "linux", + "custom_install_script": "emscripten_npm_install" }, { "version": "releases-fastcomp-%releases-tag%", "bitness": 64, - "uses": ["releases-fastcomp-%releases-tag%-64bit", "node-12.9.1-64bit"], - "os": "osx" + "uses": ["node-12.9.1-64bit", "releases-fastcomp-%releases-tag%-64bit"], + "os": "osx", + "custom_install_script": "emscripten_npm_install" }, { "version": "releases-fastcomp-%releases-tag%", "bitness": 64, - "uses": ["releases-fastcomp-%releases-tag%-64bit", "node-12.9.1-64bit", "python-2.7.13.1-64bit", "java-8.152-64bit"], - "os": "win" + "uses": ["node-12.9.1-64bit", "python-2.7.13.1-64bit", "java-8.152-64bit", "releases-fastcomp-%releases-tag%-64bit"], + "os": "win", + "custom_install_script": "emscripten_npm_install" }, { "version": "fastcomp-%precompiled_tag32%",