blob: ad57b08fb74dbdefe8815a86bf57d218cfdc1a4c [file]
import os
import sys
import shutil
import re
import argparse
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 parse_args(default_dir, dir_name='llvm_dir'):
parser = argparse.ArgumentParser(description=f'Update library from {dir_name}')
parser.add_argument('src_dir', nargs='?', default=default_dir, help=f'Path to {dir_name}')
args = parser.parse_args()
src_dir = os.path.abspath(args.src_dir)
if not os.path.isdir(src_dir):
print(f'{dir_name} directory not found: {src_dir}', file=sys.stderr)
parser.print_help(sys.stderr)
sys.exit(1)
return src_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)
def get_llvm_version(upstream_dir):
cmake_file = os.path.join(upstream_dir, 'cmake', 'Modules', 'LLVMVersion.cmake')
if not os.path.exists(cmake_file):
return None, None
with open(cmake_file, 'r') as f:
content = f.read()
major = re.search(r'set\(LLVM_VERSION_MAJOR\s+(\d+)\)', content)
minor = re.search(r'set\(LLVM_VERSION_MINOR\s+(\d+)\)', content)
patch = re.search(r'set\(LLVM_VERSION_PATCH\s+(\d+)\)', content)
if major and minor and patch:
return major.group(1), f'{major.group(1)}.{minor.group(1)}.{patch.group(1)}'
return None, None
def update_readme(local_dir, llvm_dir):
readme_path = os.path.join(local_dir, 'README.md')
if not os.path.exists(readme_path):
return
with open(readme_path, 'r') as f:
content = f.read()
major, full_version = get_llvm_version(llvm_dir)
if major and full_version:
# Find full version numbers in the form of x.y.z and update them
content = re.sub(r'\b\d+\.\d+\.\d+\b', full_version, content)
# Find 'emscripten-libs-NN' strings and update them with the major version
content = re.sub(r'emscripten-libs-\d+', f'emscripten-libs-{major}', content)
with open(readme_path, 'w') as f:
f.write(content)