From 71125d45eb96c1f6a04e28d36555af71fa51b1e5 Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Fri, 3 Jul 2026 20:34:32 +0000 Subject: [PATCH] Factor out common methods from update_***.py (NFC) --- system/lib/update_common.py | 49 ++++++++++++++++++++++++++ system/lib/update_compiler_rt.py | 27 +++----------- system/lib/update_libcxx.py | 60 +++++++------------------------- system/lib/update_libcxxabi.py | 42 ++++------------------ system/lib/update_libunwind.py | 42 ++++------------------ system/lib/update_llvm_libc.py | 45 +++--------------------- system/lib/update_musl.py | 4 +-- 7 files changed, 85 insertions(+), 184 deletions(-) create mode 100644 system/lib/update_common.py diff --git a/system/lib/update_common.py b/system/lib/update_common.py new file mode 100644 index 0000000000000..54f861f03fa55 --- /dev/null +++ b/system/lib/update_common.py @@ -0,0 +1,49 @@ +import os +import sys +import shutil + +script_dir = os.path.abspath(os.path.dirname(__file__)) +emscripten_root = os.path.dirname(os.path.dirname(script_dir)) +default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') + + +def get_llvm_dir(): + if len(sys.argv) > 1: + llvm_dir = os.path.abspath(sys.argv[1]) + else: + llvm_dir = default_llvm_dir + if not os.path.isdir(llvm_dir): + print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) + print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) + sys.exit(1) + return llvm_dir + + +def clean_dir(dirname, preserve_files=()): + if not os.path.exists(dirname): + return + for f in os.listdir(dirname): + if f in preserve_files or 'emscripten' in f: + continue + full = os.path.join(dirname, f) + if os.path.isdir(full): + shutil.rmtree(full) + else: + os.remove(full) + + +def copy_tree(upstream_dir, local_dir, excludes=()): + if not os.path.exists(local_dir): + os.makedirs(local_dir) + for f in os.listdir(upstream_dir): + full = os.path.join(upstream_dir, f) + if os.path.isdir(full): + shutil.copytree(full, os.path.join(local_dir, f)) + elif f not in excludes: + shutil.copy2(full, os.path.join(local_dir, f)) + if excludes: + for root, dirs, files in os.walk(local_dir): + for f in files: + if f in excludes: + full = os.path.join(root, f) + os.remove(full) diff --git a/system/lib/update_compiler_rt.py b/system/lib/update_compiler_rt.py index 997d794986197..b0057e86547fc 100755 --- a/system/lib/update_compiler_rt.py +++ b/system/lib/update_compiler_rt.py @@ -9,9 +9,8 @@ import sys import shutil -script_dir = os.path.abspath(os.path.dirname(__file__)) -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) -default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') +from update_common import * + local_src = os.path.join(script_dir, 'compiler-rt') copy_dirs = [ @@ -30,26 +29,8 @@ preserve_files = ('readme.txt',) -def clear(dirname): - for f in os.listdir(dirname): - if f in preserve_files or 'emscripten' in f: - continue - full = os.path.join(dirname, f) - if os.path.isdir(full): - shutil.rmtree(full) - else: - os.remove(full) - - def main(): - if len(sys.argv) > 1: - llvm_dir = os.path.join(os.path.abspath(sys.argv[1])) - else: - llvm_dir = default_llvm_dir - if not os.path.isdir(llvm_dir): - print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) - print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) - sys.exit(1) + llvm_dir = get_llvm_dir() upstream_dir = os.path.join(llvm_dir, 'compiler-rt') assert os.path.exists(upstream_dir) upstream_src = os.path.join(upstream_dir, 'lib', 'builtins') @@ -61,7 +42,7 @@ def main(): srcdir = os.path.join(upstream_dir, *dirname) assert os.path.exists(srcdir) dest = os.path.join(local_src, *dirname) - clear(dest) + clean_dir(dest, preserve_files) for name in os.listdir(srcdir): if name in ('.clang-format', 'CMakeLists.txt', 'README.txt', 'weak_symbols.txt'): continue diff --git a/system/lib/update_libcxx.py b/system/lib/update_libcxx.py index e9b29bcd98d2d..35d69c92bf266 100755 --- a/system/lib/update_libcxx.py +++ b/system/lib/update_libcxx.py @@ -10,9 +10,8 @@ import shutil import subprocess -script_dir = os.path.abspath(os.path.dirname(__file__)) -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) -default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') +from update_common import * + local_root = os.path.join(script_dir, 'libcxx') local_src = os.path.join(local_root, 'src') local_inc = os.path.join(local_root, 'include') @@ -30,34 +29,6 @@ 'config', ] -def clean_dir(dirname): - if not os.path.exists(dirname): - return - for f in os.listdir(dirname): - if f in preserve_files or 'emscripten' in f: - continue - full = os.path.join(dirname, f) - if os.path.isdir(full): - shutil.rmtree(full) - else: - os.remove(full) - - -def copy_tree(upstream_dir, local_dir): - if not os.path.exists(local_dir): - os.makedirs(local_dir) - for f in os.listdir(upstream_dir): - full = os.path.join(upstream_dir, f) - if os.path.isdir(full): - shutil.copytree(full, os.path.join(local_dir, f)) - elif f not in excludes: - shutil.copy2(full, os.path.join(local_dir, f)) - for root, dirs, files in os.walk(local_dir): - for f in files: - if f in excludes: - full = os.path.join(root, f) - os.remove(full) - def generate_modules(cmake_version: str): dst = os.path.join(local_modules, 'prebuilt') @@ -68,7 +39,7 @@ def generate_modules(cmake_version: str): binary_dir = f'{build_dir}/out' dist = f'{binary_dir}/dist/' - clean_dir(build_dir) + clean_dir(build_dir, preserve_files) os.makedirs(build_dir, exist_ok=True) with open(f'{build_dir}/CMakeLists.txt', 'x', encoding='utf-8') as CMakeLists: CMakeLists.write(f'''\ @@ -101,14 +72,7 @@ def main(): cmake_version = re.search(r'^cmake version (\d+(?:\.\d+)*)', output).group(1) - if len(sys.argv) > 1: - llvm_dir = os.path.abspath(sys.argv[1]) - else: - llvm_dir = default_llvm_dir - if not os.path.isdir(llvm_dir): - print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) - print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) - sys.exit(1) + llvm_dir = get_llvm_dir() libcxx_dir = os.path.join(llvm_dir, 'libcxx') upstream_src = os.path.join(libcxx_dir, 'src') upstream_inc = os.path.join(libcxx_dir, 'include') @@ -118,13 +82,13 @@ def main(): assert os.path.exists(upstream_modules) # Remove old version - clean_dir(local_src) - clean_dir(local_inc) - clean_dir(local_modules) + clean_dir(local_src, preserve_files) + clean_dir(local_inc, preserve_files) + clean_dir(local_modules, preserve_files) - copy_tree(upstream_src, local_src) - copy_tree(upstream_inc, local_inc) - copy_tree(upstream_modules, local_modules) + copy_tree(upstream_src, local_src, excludes) + copy_tree(upstream_inc, local_inc, excludes) + copy_tree(upstream_modules, local_modules, excludes) generate_modules(cmake_version) shutil.copy2(os.path.join(libcxx_dir, 'CREDITS.TXT'), local_root) @@ -140,12 +104,12 @@ def main(): for dirname in libc_copy_dirs: local_dir = os.path.join(libc_local_dir, dirname) - clean_dir(local_dir) + clean_dir(local_dir, preserve_files) for dirname in libc_copy_dirs: upstream_dir = os.path.join(libc_upstream_dir, dirname) local_dir = os.path.join(libc_local_dir, dirname) - copy_tree(upstream_dir, local_dir) + copy_tree(upstream_dir, local_dir, excludes) shutil.copy2(os.path.join(libc_upstream_dir, 'LICENSE.TXT'), libc_local_dir) diff --git a/system/lib/update_libcxxabi.py b/system/lib/update_libcxxabi.py index 7bb76b8cc1cd5..dd8cfc1acd9ce 100755 --- a/system/lib/update_libcxxabi.py +++ b/system/lib/update_libcxxabi.py @@ -8,9 +8,8 @@ import sys import shutil -script_dir = os.path.abspath(os.path.dirname(__file__)) -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) -default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') +from update_common import * + local_root = os.path.join(script_dir, 'libcxxabi') local_src = os.path.join(local_root, 'src') local_inc = os.path.join(local_root, 'include') @@ -19,35 +18,8 @@ preserve_files = ('cxa_exception_js_utils.cpp', '__cpp_exception.S') -def clean_dir(dirname): - for f in os.listdir(dirname): - if f in preserve_files or 'emscripten' in f: - continue - full = os.path.join(dirname, f) - if os.path.isdir(full): - shutil.rmtree(full) - else: - os.remove(full) - - -def copy_tree(upstream_dir, local_dir): - for f in os.listdir(upstream_dir): - full = os.path.join(upstream_dir, f) - if os.path.isdir(full): - shutil.copytree(full, os.path.join(local_dir, f)) - elif f not in excludes: - shutil.copy2(full, os.path.join(local_dir, f)) - - def main(): - if len(sys.argv) > 1: - llvm_dir = os.path.join(os.path.abspath(sys.argv[1])) - else: - llvm_dir = default_llvm_dir - if not os.path.isdir(llvm_dir): - print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) - print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) - sys.exit(1) + llvm_dir = get_llvm_dir() upstream_root = os.path.join(llvm_dir, 'libcxxabi') upstream_src = os.path.join(upstream_root, 'src') upstream_inc = os.path.join(upstream_root, 'include') @@ -55,11 +27,11 @@ def main(): assert os.path.exists(upstream_src) # Remove old version - clean_dir(local_src) - clean_dir(local_inc) + clean_dir(local_src, preserve_files) + clean_dir(local_inc, preserve_files) - copy_tree(upstream_src, local_src) - copy_tree(upstream_inc, local_inc) + copy_tree(upstream_src, local_src, excludes) + copy_tree(upstream_inc, local_inc, excludes) shutil.copy2(os.path.join(upstream_root, 'CREDITS.TXT'), local_root) shutil.copy2(os.path.join(upstream_root, 'LICENSE.TXT'), local_root) diff --git a/system/lib/update_libunwind.py b/system/lib/update_libunwind.py index d559028e5b7ea..7bd85738542aa 100755 --- a/system/lib/update_libunwind.py +++ b/system/lib/update_libunwind.py @@ -8,9 +8,8 @@ import sys import shutil -script_dir = os.path.abspath(os.path.dirname(__file__)) -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) -default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') +from update_common import * + local_root = os.path.join(script_dir, 'libunwind') local_src = os.path.join(local_root, 'src') local_inc = os.path.join(local_root, 'include') @@ -19,35 +18,8 @@ preserve_files = () -def clean_dir(dirname): - for f in os.listdir(dirname): - if f in preserve_files or 'emscripten' in f: - continue - full = os.path.join(dirname, f) - if os.path.isdir(full): - shutil.rmtree(full) - else: - os.remove(full) - - -def copy_tree(upstream_dir, local_dir): - for f in os.listdir(upstream_dir): - full = os.path.join(upstream_dir, f) - if os.path.isdir(full): - shutil.copytree(full, os.path.join(local_dir, f)) - elif f not in excludes: - shutil.copy2(full, os.path.join(local_dir, f)) - - def main(): - if len(sys.argv) > 1: - llvm_dir = os.path.join(os.path.abspath(sys.argv[1])) - else: - llvm_dir = default_llvm_dir - if not os.path.isdir(llvm_dir): - print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) - print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) - sys.exit(1) + llvm_dir = get_llvm_dir() upstream_root = os.path.join(llvm_dir, 'libunwind') upstream_src = os.path.join(upstream_root, 'src') upstream_inc = os.path.join(upstream_root, 'include') @@ -55,11 +27,11 @@ def main(): assert os.path.exists(upstream_src) # Remove old version - clean_dir(local_src) - clean_dir(local_inc) + clean_dir(local_src, preserve_files) + clean_dir(local_inc, preserve_files) - copy_tree(upstream_src, local_src) - copy_tree(upstream_inc, local_inc) + copy_tree(upstream_src, local_src, excludes) + copy_tree(upstream_inc, local_inc, excludes) shutil.copy2(os.path.join(upstream_root, 'LICENSE.TXT'), local_root) diff --git a/system/lib/update_llvm_libc.py b/system/lib/update_llvm_libc.py index 0661f79db3c5a..481eebc4d146c 100755 --- a/system/lib/update_llvm_libc.py +++ b/system/lib/update_llvm_libc.py @@ -9,9 +9,7 @@ import shutil import glob -script_dir = os.path.abspath(os.path.dirname(__file__)) -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) -default_llvm_dir = os.path.join(os.path.dirname(emscripten_root), 'llvm-project') +from update_common import * preserve_files = ('readme.txt', '__assertion_handler', '__config_site') # ryu_long_double_constants.h from libc is unused (and very large) @@ -46,56 +44,21 @@ 'src/strings/str*casecmp_l*', # locale_t is unsupported in Overlay Mode. ] -def clean_dir(dirname): - if not os.path.exists(dirname): - return - for f in os.listdir(dirname): - if f in preserve_files or 'emscripten' in f: - continue - full = os.path.join(dirname, f) - if os.path.isdir(full): - shutil.rmtree(full) - else: - os.remove(full) - - -def copy_tree(upstream_dir, local_dir): - if not os.path.exists(local_dir): - os.makedirs(local_dir) - for f in os.listdir(upstream_dir): - full = os.path.join(upstream_dir, f) - if os.path.isdir(full): - shutil.copytree(full, os.path.join(local_dir, f)) - elif f not in excludes: - shutil.copy2(full, os.path.join(local_dir, f)) - for root, dirs, files in os.walk(local_dir): - for f in files: - if f in excludes: - full = os.path.join(root, f) - os.remove(full) - def main(): - if len(sys.argv) > 1: - llvm_dir = os.path.abspath(sys.argv[1]) - else: - llvm_dir = default_llvm_dir - if not os.path.isdir(llvm_dir): - print(f'LLVM directory not found: {llvm_dir}', file=sys.stderr) - print(f'Usage: {sys.argv[0]} [llvm_dir]', file=sys.stderr) - sys.exit(1) + llvm_dir = get_llvm_dir() libc_upstream_dir = os.path.join(llvm_dir, 'libc') assert os.path.exists(libc_upstream_dir) libc_local_dir = os.path.join(script_dir, 'llvm-libc') for dirname in libc_copy_dirs: local_dir = os.path.join(libc_local_dir, dirname) - clean_dir(local_dir) + clean_dir(local_dir, preserve_files) for dirname in libc_copy_dirs: upstream_dir = os.path.join(libc_upstream_dir, dirname) local_dir = os.path.join(libc_local_dir, dirname) - copy_tree(upstream_dir, local_dir) + copy_tree(upstream_dir, local_dir, excludes) # Certain llvm-libc files that are incompatible in Emscripten for exclusion_pattern in libc_exclusion_patterns: diff --git a/system/lib/update_musl.py b/system/lib/update_musl.py index 4f3a41e5879e5..927fff74c0e97 100755 --- a/system/lib/update_musl.py +++ b/system/lib/update_musl.py @@ -23,9 +23,9 @@ from pathlib import Path -script_dir = os.path.abspath(os.path.dirname(__file__)) +from update_common import * + local_src = os.path.join(script_dir, 'libc', 'musl') -emscripten_root = os.path.dirname(os.path.dirname(script_dir)) default_musl_dir = os.path.join(os.path.dirname(emscripten_root), 'musl') exclude_dirs = ( # Top level directories we don't include