diff --git a/var/spack/repos/builtin/packages/emscripten/package.py b/var/spack/repos/builtin/packages/emscripten/package.py new file mode 100644 index 00000000000..24ac7f54b96 --- /dev/null +++ b/var/spack/repos/builtin/packages/emscripten/package.py @@ -0,0 +1,74 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os +import re +import sys +from textwrap import dedent + +from spack import * + + +class Emscripten(Package): + """An LLVM-to-WebAssembly Compiler""" + + homepage = "https://emscripten.org" + git = "https://github.com/emscripten-core/emscripten.git" + url = "https://github.com/emscripten-core/emscripten/archive/refs/tags/3.0.0.tar.gz" + + version('latest', branch='main') + version('3.0.0', sha256='c5524755b785d8f4b83eb3214fdd3ac4b2e1b1a4644df4c63f06e5968f48f90e') + + executables = ['emcc', 'em\+\+', 'emconfigure', 'emcmake'] + + # Need f-strings to run emcc, so 3.7+. + depends_on('python@3.7:') + depends_on('npm', type='build') + depends_on('llvm@14:+lld+clang targets=webassembly') + depends_on('binaryen') + depends_on('openjdk') + + phases = ['install'] + + @classmethod + def determine_version(cls, exe_path): + try: + exe = Executable(exe_path) + output = exe('--version', output=str, error=str).splitlines()[0] + m = re.search(r' ([0-9]+\.[0-9]+\.[0-9]+(?:\-git)?)$', output) + if m is None: + return None + (v,) = m.groups() + return Version(v) + except spack.util.executable.ProcessError: + pass + + return None + + def install(self, spec, prefix): + npm = which('npm') + npm('install') + + with open('.emscripten', 'w') as f: + f.write(dedent("""\ + NODE_JS = '{node_js}' + LLVM_ROOT = '{llvm}' + BINARYEN_ROOT = '{binaryen}' + EMSCRIPTEN_ROOT = '{emscripten}' + JAVA = '{java}' + COMPILER_ENGINE = NODE_JS + JS_ENGINES = [NODE_JS] + """.format( + node_js=str(which('node')), + llvm=os.path.dirname(str(which('lld'))), + binaryen=str(self.spec['binaryen'].prefix), + emscripten=str(prefix), + java=str(which('java')), + ))) + + install_tree('.', str(prefix)) + + def setup_run_environment(self, env): + env.prepend_path('PATH', self.prefix)