From 2b568055af67b4fb04c13ef81dc2b3ca3035ac8f Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 2 Aug 2019 15:14:11 -0700 Subject: [PATCH] Basic ARM and Aarch64 support for emsdk (#277) This adds an "arch" field to various structures, so ARM and Aarch64 Linux can download appropriate versions of node and in theory other tools, without trying to download x86 builds. Since there are no prebuilt packages for clang and binaryen on ARM or Aarch64 this will require building them, which can take a long time, but works once installed. Node 4.1.1 and 8.9.1 entries for ARM (armv7l) and aarch64 are added, and the various x86/x86_64-only things are marked as such to be filtered out on ARM machines. Other downloads work as long as they don't have an arch specified, which indicates they're expected to be arch-independent. Does not yet fully work on ARM64 Windows (but works in WSL as the Linux support is fine). --- emsdk | 76 ++++++++++++++++++++++++++++---------- emsdk_manifest.json | 90 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 19 deletions(-) diff --git a/emsdk b/emsdk index adc1521..f197be0 100755 --- a/emsdk +++ b/emsdk @@ -79,6 +79,22 @@ if not OSX and (platform.system() == 'Linux' or os.name == 'posix'): LINUX = True ENVPATH_SEPARATOR = ':' +UNIX = (OSX or LINUX) + +ARCH = 'unknown' +machine = platform.machine() +if machine.startswith('x64') or machine.startswith('amd64') or machine.startswith('x86_64'): + ARCH = 'x86_64' +elif machine.endswith('86'): + ARCH = 'x86' +elif machine.startswith('aarch64') or machine.lower().startswith('arm64'): + ARCH = 'aarch64' +elif platform.machine().startswith('arm'): + ARCH = 'arm' +else: + print("Warning: unknown machine architecture " + machine) + print() + # Don't saturate all cores to not steal the whole system, but be aggressive. CPU_CORES = max(multiprocessing.cpu_count() - 1, 1) @@ -973,9 +989,19 @@ def build_llvm_tool(tool): enable_assertions = ENABLE_LLVM_ASSERTIONS.lower() == 'on' or (ENABLE_LLVM_ASSERTIONS == 'auto' and build_type.lower() != 'release' and build_type.lower() != 'minsizerel') only_supports_wasm = hasattr(tool, 'only_supports_wasm') - targets_to_build = 'X86' + if ARCH == 'x86' or ARCH == 'x86_64': + targets_to_build = 'X86' + elif ARCH == 'arm': + targets_to_build = 'ARM' + elif ARCH == 'aarch64': + targets_to_build = 'AArch64' + else: + # May have problems with emconfigure + targets_to_build = '' if not only_supports_wasm: - targets_to_build += ';JSBackend' + if targets_to_build != '': + targets_to_build += ';' + targets_to_build += 'JSBackend' args = ['-DLLVM_TARGETS_TO_BUILD=' + targets_to_build, '-DLLVM_INCLUDE_EXAMPLES=OFF', '-DCLANG_INCLUDE_EXAMPLES=OFF', '-DLLVM_INCLUDE_TESTS=' + tests_arg, '-DCLANG_INCLUDE_TESTS=' + tests_arg, '-DLLVM_ENABLE_ASSERTIONS=' + ('ON' if enable_assertions else 'OFF')] if os.environ.get('LLVM_CMAKE_ARGS'): extra_args = os.environ['LLVM_CMAKE_ARGS'].split(',') @@ -1370,11 +1396,17 @@ class Tool(object): else: return [] + def compatible_with_this_arch(self): + if hasattr(self, 'arch'): + if self.arch != ARCH: + return False + return True + def compatible_with_this_os(self): if hasattr(self, 'os'): if self.os == 'all': return True - if (WINDOWS and 'win' in self.os) or (LINUX and ('linux' in self.os or 'unix' in self.os)) or (OSX and ('osx' in self.os or 'unix' in self.os)): + if self.compatible_with_this_arch() and ((WINDOWS and 'win' in self.os) or (LINUX and ('linux' in self.os or 'unix' in self.os)) or (OSX and ('osx' in self.os or 'unix' in self.os))): return True else: return False @@ -1382,16 +1414,16 @@ class Tool(object): if not hasattr(self, 'osx_url') and not hasattr(self, 'windows_url') and not hasattr(self, 'unix_url') and not hasattr(self, 'linux_url'): return True - if OSX and hasattr(self, 'osx_url'): + if OSX and hasattr(self, 'osx_url') and self.compatible_with_this_arch(): return True - if LINUX and hasattr(self, 'linux_url'): + if LINUX and hasattr(self, 'linux_url') and self.compatible_with_this_arch(): return True - if WINDOWS and (hasattr(self, 'windows_url') or hasattr(self, 'windows_install_path')): + if WINDOWS and (hasattr(self, 'windows_url') or hasattr(self, 'windows_install_path')) and self.compatible_with_this_arch(): return True - if (LINUX or OSX) and hasattr(self, 'unix_url'): + if UNIX and hasattr(self, 'unix_url'): return True return hasattr(self, 'url') @@ -1517,7 +1549,7 @@ class Tool(object): return self.osx_url elif LINUX and hasattr(self, 'linux_url'): return self.linux_url - elif (OSX or LINUX) and hasattr(self, 'unix_url'): + elif UNIX and hasattr(self, 'unix_url'): return self.unix_url elif hasattr(self, 'url'): return self.url @@ -2502,16 +2534,22 @@ def main(): if cmd == 'list': print('') - print('The *recommended* precompiled SDK download is %s (%s).' % (find_latest_releases_version(), find_latest_releases_hash())) - print() - print('To install/activate it, use one of:') - print(' latest [default (fastcomp) backend]') - print(' latest-upstream [upstream LLVM wasm backend]') - print('') - print('Those are equivalent to installing/activating the following:') - print(' %s' % find_latest_releases_version()) - print(' %s-upstream' % find_latest_releases_version()) - print('') + if (LINUX or OSX or WINDOWS) and (ARCH == 'x86' or ARCH == 'x86_64'): + print('The *recommended* precompiled SDK download is %s (%s).' % (find_latest_releases_version(), find_latest_releases_hash())) + print() + print('To install/activate it, use one of:') + print(' latest [default (fastcomp) backend]') + print(' latest-upstream [upstream LLVM wasm backend]') + print('') + print('Those are equivalent to installing/activating the following:') + print(' %s' % find_latest_releases_version()) + print(' %s-upstream' % find_latest_releases_version()) + print('') + else: + print('Warning: your platform does not have precompiled SDKs available.') + print('You may install components from source.') + print('') + print('All recent (non-legacy) installable versions are:') releases_versions = sorted(load_releases_versions()) releases_versions.reverse() @@ -2612,7 +2650,7 @@ def main(): tools_to_activate = process_tool_list(tools_to_activate, log_errors=True) env_string = construct_env(tools_to_activate, len(sys.argv) >= 3 and 'perm' in sys.argv[2]) open(outfile, 'w').write(env_string) - if LINUX or OSX: + if UNIX: os.chmod(outfile, 0o755) return 0 elif cmd == 'update': diff --git a/emsdk_manifest.json b/emsdk_manifest.json index f1d69e1..23730ff 100644 --- a/emsdk_manifest.json +++ b/emsdk_manifest.json @@ -4,6 +4,7 @@ "id": "clang", "version": "3.2", "bitness": 32, + "arch": "x86", "windows_url": "clang_3.2_32bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "LLVM_ROOT='%installation_dir%'", @@ -14,6 +15,7 @@ "id": "clang", "version": "3.2", "bitness": 64, + "arch": "x86_64", "windows_url": "clang_3.2_64bit.zip", "activated_path": "%installation_dir%/bin", "activated_cfg": "LLVM_ROOT='%installation_dir%/bin'", @@ -24,6 +26,7 @@ "id": "clang", "version": "3.3", "bitness": 32, + "arch": "x86", "windows_url": "clang_3.3_32bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "LLVM_ROOT='%installation_dir%'", @@ -34,6 +37,7 @@ "id": "clang", "version": "3.3", "bitness": 64, + "arch": "x86_64", "windows_url": "clang_3.3_64bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "LLVM_ROOT='%installation_dir%'", @@ -44,6 +48,7 @@ "id": "clang", "version": "3.2", "bitness": 64, + "arch": "x86_64", "osx_url": "clang%2Bllvm-3.2-x86_64-apple-darwin11.tar.gz", "activated_path": "%installation_dir%/bin", "activated_cfg": "LLVM_ROOT='%installation_dir%/bin'", @@ -54,6 +59,7 @@ "id": "clang", "version": "3.3", "bitness": 64, + "arch": "x86_64", "osx_url": "clang%2Bllvm-3.3-x86_64-apple-darwin12.tar.gz", "activated_path": "%installation_dir%/bin", "activated_cfg": "LLVM_ROOT='%installation_dir%/bin'", @@ -94,6 +100,7 @@ "id": "clang", "version": "nightly-e%nightly-llvm-64bit%", "bitness": 64, + "arch": "x86_64", "append_bitness": false, "windows_url": "llvm/nightly/win_64bit/emscripten-llvm-e%nightly-llvm-64bit%.zip", "osx_url": "llvm/nightly/osx_64bit/emscripten-llvm-e%nightly-llvm-64bit%.tar.gz", @@ -163,6 +170,7 @@ "id": "releases", "version": "upstream-%releases-tag%", "bitness": 64, + "arch": "x86_64", "linux_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/%releases-tag%/wasm-binaries.tbz2", "osx_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/%releases-tag%/wasm-binaries.tbz2", "windows_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/%releases-tag%/wasm-binaries.zip", @@ -177,6 +185,7 @@ "id": "releases", "version": "fastcomp-%releases-tag%", "bitness": 64, + "arch": "x86_64", "linux_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/%releases-tag%/wasm-binaries.tbz2", "osx_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/%releases-tag%/wasm-binaries.tbz2", "windows_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/%releases-tag%/wasm-binaries.zip", @@ -192,6 +201,7 @@ "id": "clang", "version": "e1.13.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.13.0.zip", "osx_url": "emscripten-clang_e1.13.0.tar.gz", "activated_path": "%installation_dir%", @@ -203,6 +213,7 @@ "id": "clang", "version": "e1.13.1", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.13.1.zip", "osx_url": "emscripten-clang_e1.13.1.tar.gz", "activated_path": "%installation_dir%", @@ -214,6 +225,7 @@ "id": "clang", "version": "e1.16.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.16.0.zip", "osx_url": "emscripten-clang_e1.16.0.tar.gz", "activated_path": "%installation_dir%", @@ -225,6 +237,7 @@ "id": "clang", "version": "e1.21.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.21.0.zip", "osx_url": "emscripten-clang_e1.21.0.tar.gz", "activated_path": "%installation_dir%", @@ -236,6 +249,7 @@ "id": "clang", "version": "e1.22.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.22.0.zip", "osx_url": "emscripten-clang_e1.22.0.tar.gz", "activated_path": "%installation_dir%", @@ -247,6 +261,7 @@ "id": "clang", "version": "e1.25.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.25.0.zip", "osx_url": "emscripten-clang_e1.25.0.tar.gz", "activated_path": "%installation_dir%", @@ -258,6 +273,7 @@ "id": "clang", "version": "e1.27.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.27.0.zip", "osx_url": "emscripten-clang_e1.27.0.tar.gz", "activated_path": "%installation_dir%", @@ -269,6 +285,7 @@ "id": "clang", "version": "e1.29.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.29.0.zip", "osx_url": "emscripten-clang_e1.29.0.tar.gz", "activated_path": "%installation_dir%", @@ -280,6 +297,7 @@ "id": "clang", "version": "e1.30.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.30.0.zip", "osx_url": "emscripten-clang_e1.30.0.tar.gz", "activated_path": "%installation_dir%", @@ -290,6 +308,7 @@ "id": "clang", "version": "e1.34.1", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.34.1.zip", "osx_url": "emscripten-clang_e1.34.1.tar.gz", "activated_path": "%installation_dir%", @@ -300,6 +319,7 @@ "id": "clang", "version": "e1.35.0", "bitness": 64, + "arch": "x86_64", "windows_url": "emscripten-clang_e1.35.0.zip", "osx_url": "emscripten-clang_e1.35.0.tar.gz", "activated_path": "%installation_dir%", @@ -310,6 +330,7 @@ "id": "clang", "version": "e1.37.1", "bitness": 64, + "arch": "x86_64", "windows_url": "llvm/tag/win_64bit/emscripten-llvm-e1.37.1.zip", "osx_url": "llvm/tag/osx_64bit/emscripten-llvm-e1.37.1.tar.gz", "linux_url": "llvm/tag/linux_64bit/emscripten-llvm-e1.37.1.tar.gz", @@ -321,6 +342,7 @@ "id": "clang", "version": "e%precompiled_tag32%", "bitness": 32, + "arch": "x86", "windows_url": "llvm/tag/win_64bit/emscripten-llvm-e%precompiled_tag32%.zip", "osx_url": "llvm/tag/osx_64bit/emscripten-llvm-e%precompiled_tag32%.tar.gz", "linux_url": "llvm/tag/linux_64bit/emscripten-llvm-e%precompiled_tag32%.tar.gz", @@ -332,6 +354,7 @@ "id": "clang", "version": "e%precompiled_tag64%", "bitness": 64, + "arch": "x86_64", "windows_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/old/win/emscripten-llvm-e%precompiled_tag64%.zip", "osx_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/old/mac/emscripten-llvm-e%precompiled_tag64%.tar.gz", "linux_url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/old/linux/emscripten-llvm-e%precompiled_tag64%.tar.gz", @@ -343,6 +366,7 @@ "id": "node", "version": "0.10.17", "bitness": 32, + "arch": "x86", "windows_url": "node_0.10.17_32bit.exe", "windows_install_path": "node/0.10.17_32bit/node.exe", "activated_path": "%installation_dir%", @@ -354,6 +378,7 @@ "id": "node", "version": "0.10.17", "bitness": 64, + "arch": "x86_64", "windows_url": "node_0.10.17_64bit.exe", "windows_install_path": "node/0.10.17_64bit/node.exe", "activated_path": "%installation_dir%", @@ -365,6 +390,7 @@ "id": "node", "version": "0.10.18", "bitness": 64, + "arch": "x86_64", "osx_url": "node-v0.10.18-darwin-x64.tar.gz", "activated_path": "%installation_dir%/bin", "activated_cfg": "NODE_JS='%installation_dir%/bin/node'", @@ -375,6 +401,7 @@ "id": "node", "version": "0.12.2", "bitness": 32, + "arch": "x86", "windows_url": "node_0.12.2_32bit.exe", "windows_install_path": "node/0.12.2_32bit/node.exe", "activated_path": "%installation_dir%", @@ -386,6 +413,7 @@ "id": "node", "version": "0.12.2", "bitness": 64, + "arch": "x86_64", "windows_url": "node_0.12.2_64bit.exe", "windows_install_path": "node/0.12.2_64bit/node.exe", "activated_path": "%installation_dir%", @@ -397,6 +425,7 @@ "id": "node", "version": "0.12.2", "bitness": 64, + "arch": "x86_64", "osx_url": "node-v0.12.2-darwin-x64.tar.gz", "activated_path": "%installation_dir%/bin", "activated_cfg": "NODE_JS='%installation_dir%/bin/node'", @@ -407,16 +436,28 @@ "id": "node", "version": "4.1.1", "bitness": 32, + "arch": "x86", "windows_url": "node_4.1.1_32bit.zip", "linux_url": "node-v4.1.1-linux-x86.tar.gz", "activated_path": "%installation_dir%/bin", "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" }, + { + "id": "node", + "version": "4.1.1", + "bitness": 32, + "arch": "arm", + "linux_url": "https://nodejs.org/download/release/v4.1.1/node-v4.1.1-linux-armv7l.tar.xz", + "activated_path": "%installation_dir%/bin", + "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", + "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" + }, { "id": "node", "version": "4.1.1", "bitness": 64, + "arch": "x86_64", "osx_url": "node-v4.1.1-darwin-x64.tar.gz", "windows_url": "node_4.1.1_64bit.zip", "linux_url": "node-v4.1.1-linux-x64.tar.gz", @@ -424,20 +465,42 @@ "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" }, + { + "id": "node", + "version": "4.1.1", + "bitness": 64, + "arch": "aarch64", + "linux_url": "https://nodejs.org/download/release/v4.1.1/node-v4.1.1-linux-arm64.tar.gz", + "activated_path": "%installation_dir%/bin", + "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", + "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" + }, { "id": "node", "version": "8.9.1", "bitness": 32, + "arch": "x86", "windows_url": "node-v8.9.1-win-x86.zip", "linux_url": "node-v8.9.1-linux-x86.tar.xz", "activated_path": "%installation_dir%/bin", "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" }, + { + "id": "node", + "version": "8.9.1", + "arch": "arm", + "bitness": 32, + "linux_url": "https://nodejs.org/dist/v8.9.1/node-v8.9.1-linux-armv7l.tar.xz", + "activated_path": "%installation_dir%/bin", + "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", + "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" + }, { "id": "node", "version": "8.9.1", "bitness": 64, + "arch": "x86_64", "osx_url": "node-v8.9.1-darwin-x64.tar.gz", "windows_url": "node-v8.9.1-win-x64.zip", "linux_url": "node-v8.9.1-linux-x64.tar.xz", @@ -445,10 +508,21 @@ "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" }, + { + "id": "node", + "version": "8.9.1", + "arch": "aarch64", + "bitness": 64, + "linux_url": "https://nodejs.org/dist/v8.9.1/node-v8.9.1-linux-arm64.tar.xz", + "activated_path": "%installation_dir%/bin", + "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'", + "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%" + }, { "id": "python", "version": "2.7.5.1", "bitness": 32, + "arch": "x86", "windows_url": "python_2.7.5.1_32bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "PYTHON='%installation_dir%/python%.exe%'", @@ -459,6 +533,7 @@ "id": "python", "version": "2.7.5", "bitness": 64, + "arch": "x86_64", "windows_url": "python_2.7.5_64bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "PYTHON='%installation_dir%/python%.exe%'", @@ -469,6 +544,7 @@ "id": "python", "version": "2.7.5.3", "bitness": 32, + "arch": "x86", "windows_url": "python_2.7.5.3_32bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "PYTHON='%installation_dir%/python%.exe%'", @@ -479,6 +555,7 @@ "id": "python", "version": "2.7.5.3", "bitness": 64, + "arch": "x86_64", "windows_url": "python_2.7.5.3_64bit.zip", "activated_path": "%installation_dir%", "activated_cfg": "PYTHON='%installation_dir%/python%.exe%'", @@ -489,6 +566,7 @@ "id": "python", "version": "2.7.13.1", "bitness": 32, + "arch": "x86", "windows_url": "WinPython-32bit-2.7.13.1Zero.zip", "activated_path": "%installation_dir%/python-2.7.13", "activated_cfg": "PYTHON='%installation_dir%/python-2.7.13/python%.exe%'", @@ -498,6 +576,7 @@ "id": "python", "version": "2.7.13.1", "bitness": 64, + "arch": "x86_64", "windows_url": "WinPython-64bit-2.7.13.1Zero.zip", "activated_path": "%installation_dir%/python-2.7.13.amd64", "activated_cfg": "PYTHON='%installation_dir%/python-2.7.13.amd64/python%.exe%'", @@ -507,6 +586,7 @@ "id": "python", "version": "3.5.4", "bitness": 32, + "arch": "x86", "windows_url": "WinPython-32bit-3.5.4.1Zero.zip", "activated_path": "%installation_dir%/python-3.5.4", "activated_cfg": "PYTHON='%installation_dir%/python-3.5.4/python%.exe%'", @@ -516,6 +596,7 @@ "id": "python", "version": "3.5.4", "bitness": 64, + "arch": "x86_64", "windows_url": "WinPython-64bit-3.5.4.1Zero.zip", "activated_path": "%installation_dir%/python-3.5.4.amd64", "activated_cfg": "PYTHON='%installation_dir%/python-3.5.4.amd64/python%.exe%'", @@ -525,6 +606,7 @@ "id": "java", "version": "7.45", "bitness": 32, + "arch": "x86", "windows_url": "portable_jre_7_update_45_32bit.zip", "activated_path": "%installation_dir%/bin", "activated_env": "JAVA_HOME=%installation_dir%", @@ -534,6 +616,7 @@ "id": "java", "version": "7.45", "bitness": 64, + "arch": "x86_64", "windows_url": "portable_jre_7_update_45_64bit.zip", "activated_path": "%installation_dir%/bin", "activated_env": "JAVA_HOME=%installation_dir%", @@ -543,6 +626,7 @@ "id": "java", "version": "8.152", "bitness": 32, + "arch": "x86", "windows_url": "portable_jre_8_update_152_32bit.zip", "activated_path": "%installation_dir%/bin", "activated_env": "JAVA_HOME=%installation_dir%", @@ -552,6 +636,7 @@ "id": "java", "version": "8.152", "bitness": 64, + "arch": "x86_64", "windows_url": "portable_jre_8_update_152_64bit.zip", "activated_path": "%installation_dir%/bin", "activated_env": "JAVA_HOME=%installation_dir%", @@ -561,6 +646,7 @@ "id": "spidermonkey", "version": "27.0.1", "bitness": 64, + "arch": "x86_64", "windows_url": "spidermonkey-27.0.1.zip", "osx_url": "spidermonkey-27.0.1.tar.gz", "activated_path": "%installation_dir%", @@ -571,6 +657,7 @@ "id": "spidermonkey", "version": "nightly-2014-03-13", "bitness": 64, + "arch": "x86_64", "windows_url": "spidermonkey-nightly-2014-03-13.zip", "osx_url": "spidermonkey-nightly-2014-03-13.tar.gz", "activated_path": "%installation_dir%", @@ -581,6 +668,7 @@ "id": "spidermonkey", "version": "30.0.0", "bitness": 64, + "arch": "x86_64", "windows_url": "spidermonkey-30.0.0.zip", "osx_url": "spidermonkey-30.0.0.tar.gz", "activated_path": "%installation_dir%", @@ -591,6 +679,7 @@ "id": "spidermonkey", "version": "37.0.1", "bitness": 64, + "arch": "x86_64", "windows_url": "spidermonkey-37.0.1_64bit.zip", "osx_url": "spidermonkey-37.0.1_64bit.tar.gz", "activated_path": "%installation_dir%", @@ -600,6 +689,7 @@ "id": "spidermonkey", "version": "nightly-2015-04-12", "bitness": 64, + "arch": "x86_64", "windows_url": "spidermonkey-nightly-2015-04-12_64bit.zip", "osx_url": "spidermonkey-nightly-2015-04-12_64bit.tar.gz", "activated_path": "%installation_dir%",