blob: 7c47133d5d305e0a66c66e0c3dc0a6db914cb7f5 [file]
#!/usr/bin/env python3
# Copyright 2026 The Emscripten Authors. All rights reserved.
# Emscripten is available under two separate licenses, the MIT license and the
# University of Illinois/NCSA Open Source License. Both these licenses can be
# found in the LICENSE file.
import os
import shutil
import subprocess
from update_common import (
clean_dir,
copy_tree,
default_llvm_dir,
emscripten_root,
parse_args,
script_dir,
update_readme,
)
# system/lib/openmp (to be updated)
local_root = os.path.join(script_dir, 'openmp')
local_src = os.path.join(local_root, 'src')
local_include = os.path.join(local_root, 'include')
local_prebuilt = os.path.join(local_root, 'prebuilt')
# Files to ignore during copy_tree
excludes = (
'doc',
'build',
'tests',
'CMakeFiles',
'libgomp.a',
'libiomp5.a',
'libomp.a',
)
def main():
llvm_dir = parse_args(default_llvm_dir, 'llvm_dir')
# Output directory for build
output_dir = os.path.join(emscripten_root, 'out')
build_dir = os.path.join(output_dir, 'build_openmp')
# LLVM/OpenMP folder containing latest version
upstream_runtimes = os.path.join(llvm_dir, 'runtimes')
upstream_root = os.path.join(llvm_dir, 'openmp')
upstream_runtime_root = os.path.join(upstream_root, 'runtime/src')
assert os.path.exists(upstream_runtime_root)
# Build output paths
upstream_build_src = os.path.join(build_dir, 'openmp/runtime/src') # contains various *.a and generated *.h
# Remove old version
clean_dir(local_src)
clean_dir(local_include)
clean_dir(local_prebuilt)
# Update source
copy_tree(upstream_runtime_root, local_src, excludes)
# Generates header files for OpenMP library build
subprocess.run([
os.path.join(emscripten_root, 'emcmake'), 'cmake',
'-S', upstream_runtimes,
'-B', build_dir,
'-G', 'Ninja',
'-DLLVM_ENABLE_RUNTIMES=openmp',
'-DLLVM_DEFAULT_TARGET_TRIPLE=wasm32-unknown-emscripten',
'-DOPENMP_ENABLE_LIBOMPTARGET=OFF',
'-DLIBOMP_HAVE_OMPT_SUPPORT=OFF',
'-DLIBOMP_OMPT_SUPPORT=OFF',
'-DLIBOMP_OMPD_SUPPORT=OFF',
'-DLIBOMP_USE_DEBUGGER=OFF',
'-DLIBOMP_FORTRAN_MODULES=OFF',
'-DLIBOMP_ENABLE_SHARED=OFF',
'-DLIBOMP_ARCH=wasm32',
'-DOPENMP_ENABLE_LIBOMPTARGET_PROFILING=OFF',
], check=True)
subprocess.run(['cmake', '--build', '.'], cwd=build_dir, check=True)
# Update license file
shutil.copy2(os.path.join(upstream_root, 'LICENSE.TXT'), local_root)
# Update include headers
header_files = ['omp.h', 'ompx.h']
for file in header_files:
shutil.copy2(os.path.join(upstream_build_src, file), local_include)
# Update generated header files
built_files = ['kmp_config.h', 'kmp_i18n_id.inc', 'kmp_i18n_default.inc']
for file in built_files:
shutil.copy2(os.path.join(upstream_build_src, file), local_prebuilt)
update_readme(local_root, llvm_dir)
if __name__ == '__main__':
main()