From f4a55f6a3bbc0d8069d948ef428c2a067531ad4c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Wed, 5 Nov 2025 08:37:25 -0800 Subject: [PATCH] Move compiler paths out of top level of shared.py. NFC This is a step towards separating the import of python modules from the initialization of the compiler. The goal here is to remove top level code (i.e. Remove side effects from importing). --- emar.py | 2 +- emcc.py | 10 +++--- emranlib.py | 2 +- emstrip.py | 2 +- test/browser_common.py | 4 +-- test/clang_native.py | 8 ++--- test/common.py | 8 ++--- test/test_benchmark.py | 6 ++-- test/test_browser.py | 5 ++- test/test_core.py | 34 +++++++++++---------- test/test_jslib.py | 4 ++- test/test_other.py | 37 +++++++++++----------- test/test_sanity.py | 3 +- test/test_sockets.py | 12 ++++---- tools/building.py | 41 ++++++++++--------------- tools/emdwp.py | 2 +- tools/emnm.py | 2 +- tools/emscripten.py | 4 +-- tools/file_packager.py | 2 +- tools/link.py | 4 +-- tools/shared.py | 69 ++++++++++++++++++++++++------------------ tools/system_libs.py | 11 ++++--- 22 files changed, 140 insertions(+), 132 deletions(-) diff --git a/emar.py b/emar.py index 8f57837b34fa7..4c655f9329a20 100755 --- a/emar.py +++ b/emar.py @@ -11,4 +11,4 @@ from tools import shared -shared.exec_process([shared.LLVM_AR] + sys.argv[1:]) +shared.exec_process([shared.paths.LLVM_AR] + sys.argv[1:]) diff --git a/emcc.py b/emcc.py index 0b3498e837c0e..0d6a5fd86ef10 100644 --- a/emcc.py +++ b/emcc.py @@ -43,7 +43,7 @@ from tools.cmdline import CLANG_FLAGS_WITH_ARGS, options from tools.response_file import substitute_response_files from tools.settings import COMPILE_TIME_SETTINGS, default_setting, settings, user_settings -from tools.shared import DEBUG, DYLIB_EXTENSIONS, in_temp +from tools.shared import DEBUG, DYLIB_EXTENSIONS, in_temp, paths from tools.toolchain_profiler import ToolchainProfiler from tools.utils import exit_with_error, get_file_suffix, read_file, unsuffixed_basename @@ -168,9 +168,9 @@ def make_relative(filename): @ToolchainProfiler.profile() def main(args): if shared.run_via_emxx: - clang = shared.CLANG_CXX + clang = paths.CLANG_CXX else: - clang = shared.CLANG_CC + clang = paths.CLANG_CC # Special case the handling of `-v` because it has a special/different meaning # when used with no other arguments. In particular, we must handle this early @@ -477,9 +477,9 @@ def phase_setup(state): @ToolchainProfiler.profile_block('compile inputs') def phase_compile_inputs(options, state, newargs): if shared.run_via_emxx: - compiler = [shared.CLANG_CXX] + compiler = [paths.CLANG_CXX] else: - compiler = [shared.CLANG_CC] + compiler = [paths.CLANG_CC] if config.COMPILER_WRAPPER: logger.debug('using compiler wrapper: %s', config.COMPILER_WRAPPER) diff --git a/emranlib.py b/emranlib.py index 3d1659d05de8e..6e467b2fb18a5 100755 --- a/emranlib.py +++ b/emranlib.py @@ -14,4 +14,4 @@ from tools import shared -shared.exec_process([shared.LLVM_RANLIB] + sys.argv[1:]) +shared.exec_process([shared.paths.LLVM_RANLIB] + sys.argv[1:]) diff --git a/emstrip.py b/emstrip.py index 6226b655dc3f2..6b24e3b1c1853 100755 --- a/emstrip.py +++ b/emstrip.py @@ -11,4 +11,4 @@ from tools import shared -shared.exec_process([shared.LLVM_STRIP] + sys.argv[1:]) +shared.exec_process([shared.paths.LLVM_STRIP] + sys.argv[1:]) diff --git a/test/browser_common.py b/test/browser_common.py index 5409f12c5b245..d89e94f038e24 100644 --- a/test/browser_common.py +++ b/test/browser_common.py @@ -36,7 +36,7 @@ from tools import feature_matrix, shared, utils from tools.feature_matrix import UNSUPPORTED -from tools.shared import DEBUG, EMCC, exit_with_error +from tools.shared import DEBUG, exit_with_error, paths from tools.utils import MACOS, WINDOWS, memoize, path_from_root, read_binary logger = logging.getLogger('common') @@ -878,7 +878,7 @@ def compile_btest(self, filename, cflags, reporting=Reporting.FULL): if reporting == Reporting.FULL: # If C reporting (i.e. the REPORT_RESULT macro) is required we # also include report_result.c and force-include report_result.h - self.run_process([EMCC, '-c', '-I' + TEST_ROOT, + self.run_process([paths.EMCC, '-c', '-I' + TEST_ROOT, test_file('report_result.c')] + self.get_cflags(compile_only=True) + (['-fPIC'] if '-fPIC' in cflags else [])) cflags += ['report_result.o', '-include', test_file('report_result.h')] if EMTEST_BROWSER == 'node': diff --git a/test/clang_native.py b/test/clang_native.py index e4dcc61025db8..8065e29d7ab70 100644 --- a/test/clang_native.py +++ b/test/clang_native.py @@ -8,7 +8,7 @@ import platform import sys -from tools.shared import CLANG_CC, CLANG_CXX, PIPE +from tools.shared import PIPE, paths from tools.utils import MACOS, WINDOWS, path_from_root, run_process logger = logging.getLogger('clang_native') @@ -63,9 +63,9 @@ def get_clang_native_env(): return CACHED_CLANG_NATIVE_ENV env = os.environ.copy() - env['CC'] = CLANG_CC - env['CXX'] = CLANG_CXX - env['LD'] = CLANG_CXX + env['CC'] = paths.CLANG_CC + env['CXX'] = paths.CLANG_CXX + env['LD'] = paths.CLANG_CXX if MACOS: path = run_process(['xcrun', '--show-sdk-path'], stdout=PIPE).stdout.strip() diff --git a/test/common.py b/test/common.py index 2145e8c0ec7d9..cab4a0340b15f 100644 --- a/test/common.py +++ b/test/common.py @@ -32,7 +32,7 @@ from tools import building, config, feature_matrix, shared, utils from tools.feature_matrix import Feature from tools.settings import COMPILE_TIME_SETTINGS -from tools.shared import DEBUG, EMCC, EMXX, get_canonical_temp_dir +from tools.shared import DEBUG, get_canonical_temp_dir, paths from tools.utils import ( WINDOWS, exit_with_error, @@ -130,9 +130,9 @@ def copytree(src, dest): def compiler_for(filename, force_c=False): if utils.suffix(filename) in ('.cc', '.cxx', '.cpp') and not force_c: - return EMXX + return paths.EMXX else: - return EMCC + return paths.EMCC def record_flaky_test(test_name, attempt_count, max_attempts, exception_msg): @@ -1272,7 +1272,7 @@ def _test_dylink_dso_needed(self, do_run): ''') def ccshared(src, linkto=None): - cmdv = [EMCC, src, '-o', utils.unsuffixed(src) + '.wasm', '-sSIDE_MODULE'] + self.get_cflags() + cmdv = [paths.EMCC, src, '-o', utils.unsuffixed(src) + '.wasm', '-sSIDE_MODULE'] + self.get_cflags() if linkto: cmdv += linkto self.run_process(cmdv) diff --git a/test/test_benchmark.py b/test/test_benchmark.py index c0d98a9481b60..3a1851997dc9b 100644 --- a/test/test_benchmark.py +++ b/test/test_benchmark.py @@ -25,7 +25,7 @@ from decorators import needs_make from tools import building, utils -from tools.shared import CLANG_CC, CLANG_CXX, EMCC, PIPE, config +from tools.shared import PIPE, config, paths from tools.utils import run_process # standard arguments for timing: @@ -232,7 +232,7 @@ def build(self, parent, filename, args, shared_args, emcc_args, native_args, nat final = final.replace('.cpp', '') utils.delete_file(final) cmd = [ - EMCC, filename, + paths.EMCC, filename, OPTIMIZATIONS, '-sINITIAL_MEMORY=256MB', '-sENVIRONMENT=node,shell', @@ -361,7 +361,7 @@ def get_output_files(self): aot_v8 = (config.V8_ENGINE if config.V8_ENGINE else []) + ['--no-liftoff'] named_benchmarkers = { - 'clang': NativeBenchmarker('clang', [CLANG_CC], [CLANG_CXX]), + 'clang': NativeBenchmarker('clang', [paths.CLANG_CC], [paths.CLANG_CXX]), 'gcc': NativeBenchmarker('gcc', ['gcc', '-no-pie'], ['g++', '-no-pie']), 'size': SizeBenchmarker('size'), 'v8': EmscriptenBenchmarker('v8', aot_v8), diff --git a/test/test_browser.py b/test/test_browser.py index e4e1191770d4c..2887dfceb418c 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -70,9 +70,12 @@ from tools import ports, shared from tools.feature_matrix import Feature -from tools.shared import EMCC, FILE_PACKAGER, PIPE +from tools.shared import PIPE, paths from tools.utils import WINDOWS, delete_dir +EMCC = paths.EMCC +FILE_PACKAGER = paths.FILE_PACKAGER + def make_test_chunked_synchronous_xhr_server(support_byte_ranges, data, port): class ChunkedServerHandler(BaseHTTPRequestHandler): diff --git a/test/test_core.py b/test/test_core.py index e2abcda198dd9..fa9b04093eeb3 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -72,7 +72,7 @@ ) from tools import building, config, shared, utils, webassembly -from tools.shared import EMAR, EMCC, EMXX, FILE_PACKAGER, LLVM_COV, LLVM_PROFDATA, PIPE +from tools.shared import PIPE, paths from tools.utils import LINUX, MACOS, WINDOWS, delete_file, write_file # decorators for limiting which modes a test can run in @@ -82,6 +82,10 @@ EM_SIGINT = 2 EM_SIGABRT = 6 +EMAR = paths.EMAR +EMCC = paths.EMCC +EMXX = paths.EMXX + def esm_integration(func): assert callable(func) @@ -6599,7 +6603,7 @@ def test_neon_wasm_simd(self): @no_big_endian('SIMD support is currently not compatible with big endian') def test_sse1(self, args): src = test_file('sse/test_sse1.cpp') - self.run_process([shared.CLANG_CXX, src, '-msse', '-o', 'test_sse1', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-msse', '-o', 'test_sse1', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_sse1', stdout=PIPE).stdout self.maybe_closure() @@ -6620,7 +6624,7 @@ def test_sse1(self, args): @no_big_endian('SIMD support is currently not compatible with big endian') def test_sse2(self, args): src = test_file('sse/test_sse2.cpp') - self.run_process([shared.CLANG_CXX, src, '-msse2', '-Wno-argument-outside-range', '-o', 'test_sse2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-msse2', '-Wno-argument-outside-range', '-o', 'test_sse2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_sse2', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-msse2', '-fno-inline-functions', '-Wno-argument-outside-range', '-sSTACK_SIZE=1MB'] + args @@ -6634,7 +6638,7 @@ def test_sse2(self, args): @no_big_endian('SIMD support is currently not compatible with big endian') def test_sse3(self): src = test_file('sse/test_sse3.cpp') - self.run_process([shared.CLANG_CXX, src, '-msse3', '-Wno-argument-outside-range', '-o', 'test_sse3', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-msse3', '-Wno-argument-outside-range', '-o', 'test_sse3', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_sse3', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-msse3', '-Wno-argument-outside-range'] @@ -6648,7 +6652,7 @@ def test_sse3(self): @no_big_endian('SIMD support is currently not compatible with big endian') def test_ssse3(self): src = test_file('sse/test_ssse3.cpp') - self.run_process([shared.CLANG_CXX, src, '-mssse3', '-Wno-argument-outside-range', '-o', 'test_ssse3', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-mssse3', '-Wno-argument-outside-range', '-o', 'test_ssse3', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_ssse3', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-mssse3', '-Wno-argument-outside-range'] @@ -6665,7 +6669,7 @@ def test_ssse3(self): def test_sse4_1(self): src = test_file('sse/test_sse4_1.cpp') # Run with inlining disabled to avoid slow LLVM behavior with lots of macro expanded loops inside a function body. - self.run_process([shared.CLANG_CXX, src, '-msse4.1', '-fno-inline-functions', '-Wno-argument-outside-range', '-o', 'test_sse4_1', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-msse4.1', '-fno-inline-functions', '-Wno-argument-outside-range', '-o', 'test_sse4_1', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_sse4_1', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-msse4.1', '-fno-inline-functions', '-Wno-argument-outside-range', '-sSTACK_SIZE=1MB'] @@ -6684,7 +6688,7 @@ def test_sse4_1(self): def test_sse4(self, use_4_2): msse4 = '-msse4.2' if use_4_2 else '-msse4' src = test_file('sse/test_sse4_2.cpp') - self.run_process([shared.CLANG_CXX, src, msse4, '-Wno-argument-outside-range', '-o', 'test_sse4_2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, msse4, '-Wno-argument-outside-range', '-o', 'test_sse4_2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_sse4_2', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), msse4, '-Wno-argument-outside-range'] @@ -6705,7 +6709,7 @@ def test_sse4(self, use_4_2): @no_big_endian('SIMD support is currently not compatible with big endian') def test_avx(self, args): src = test_file('sse/test_avx.cpp') - self.run_process([shared.CLANG_CXX, src, '-mavx', '-Wno-argument-outside-range', '-Wpedantic', '-o', 'test_avx', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-mavx', '-Wno-argument-outside-range', '-Wpedantic', '-o', 'test_avx', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_avx', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-mavx', '-fno-inline-functions', '-Wno-argument-outside-range', '-sSTACK_SIZE=1MB'] + args @@ -6726,7 +6730,7 @@ def test_avx(self, args): @no_big_endian('SIMD support is currently not compatible with big endian') def test_avx2(self, args): src = test_file('sse/test_avx2.cpp') - self.run_process([shared.CLANG_CXX, src, '-mavx2', '-Wno-argument-outside-range', '-Wpedantic', '-o', 'test_avx2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) + self.run_process([paths.CLANG_CXX, src, '-mavx2', '-Wno-argument-outside-range', '-Wpedantic', '-o', 'test_avx2', '-D_CRT_SECURE_NO_WARNINGS=1'] + clang_native.get_clang_native_args(), stdout=PIPE) native_result = self.run_process('./test_avx2', stdout=PIPE).stdout self.cflags += ['-I' + test_file('sse'), '-mavx2', '-Wno-argument-outside-range', '-sSTACK_SIZE=1MB'] + args @@ -6738,9 +6742,7 @@ def test_sse_diagnostics(self): self.cflags.remove('-Werror') src = test_file('sse/test_sse_diagnostic.cpp') - p = self.run_process( - [shared.EMXX, src, '-msse', '-DWASM_SIMD_COMPAT_SLOW'] + self.get_cflags(), - stderr=PIPE) + p = self.run_process([paths.EMXX, src, '-msse', '-DWASM_SIMD_COMPAT_SLOW'] + self.get_cflags(), stderr=PIPE) self.assertContained('Instruction emulated via slow path.', p.stderr) @wasm_relaxed_simd @@ -7960,7 +7962,7 @@ def test_dwarf(self): self.emcc('test_dwarf.c') - out = self.run_process([shared.LLVM_DWARFDUMP, 'a.out.wasm', '-all'], stdout=PIPE).stdout + out = self.run_process([paths.LLVM_DWARFDUMP, 'a.out.wasm', '-all'], stdout=PIPE).stdout # parse the sections sections = {} @@ -9680,7 +9682,7 @@ def test_emscripten_async_load_script(self): create_file('file2.txt', 'second') # `--from-emcc` needed here otherwise the output defines `var Module =` which will shadow the # global `Module`. - self.run_process([FILE_PACKAGER, 'test.data', '--preload', 'file1.txt', 'file2.txt', '--from-emcc', '--js-output=script2.js']) + self.run_process([paths.FILE_PACKAGER, 'test.data', '--preload', 'file1.txt', 'file2.txt', '--from-emcc', '--js-output=script2.js']) self.do_runf('test_emscripten_async_load_script.c', cflags=['-sFORCE_FILESYSTEM']) @node_pthreads @@ -9820,9 +9822,9 @@ def test_fcoverage_mapping(self): self.set_setting('EXIT_RUNTIME') self.do_core_test('test_hello_world.c', cflags=['-fprofile-instr-generate', '-fcoverage-mapping', '-g']) self.assertExists('default.profraw') - self.run_process([LLVM_PROFDATA, 'merge', '-sparse', 'default.profraw', '-o', 'out.profdata']) + self.run_process([paths.LLVM_PROFDATA, 'merge', '-sparse', 'default.profraw', '-o', 'out.profdata']) self.assertExists('out.profdata') - self.assertEqual(expected, self.run_process([LLVM_COV, 'show', 'test_hello_world.wasm', '-instr-profile=out.profdata'], stdout=PIPE).stdout) + self.assertEqual(expected, self.run_process([paths.LLVM_COV, 'show', 'test_hello_world.wasm', '-instr-profile=out.profdata'], stdout=PIPE).stdout) # Generate tests for everything def make_run(name, cflags=None, settings=None, env=None, # noqa diff --git a/test/test_jslib.py b/test/test_jslib.py index 0908c803c225d..f16111af111bc 100644 --- a/test/test_jslib.py +++ b/test/test_jslib.py @@ -9,9 +9,11 @@ from common import RunnerCore, create_file, read_file, test_file from decorators import parameterized -from tools.shared import EMCC +from tools.shared import paths from tools.utils import delete_file +EMCC = paths.EMCC + class jslib(RunnerCore): def test_jslib_no_override(self): diff --git a/test/test_other.py b/test/test_other.py index 76f087de046cd..8aee6bd119f63 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -92,21 +92,7 @@ from tools.building import get_building_env from tools.link import binary_encode from tools.settings import settings -from tools.shared import ( - CLANG_CC, - CLANG_CXX, - EMAR, - EMCC, - EMRANLIB, - EMXX, - FILE_PACKAGER, - LLVM_AR, - LLVM_DWARFDUMP, - LLVM_DWP, - LLVM_NM, - WASM_LD, - config, -) +from tools.shared import config, paths from tools.system_libs import DETERMINISTIC_PREFIX from tools.utils import ( MACOS, @@ -126,6 +112,19 @@ emstrip = utils.bat_suffix(path_from_root('emstrip')) emsymbolizer = utils.bat_suffix(path_from_root('emsymbolizer')) +CLANG_CC = paths.CLANG_CC +CLANG_CXX = paths.CLANG_CXX +EMAR = paths.EMAR +EMCC = paths.EMCC +EMRANLIB = paths.EMRANLIB +EMXX = paths.EMXX +FILE_PACKAGER = paths.FILE_PACKAGER +LLVM_AR = paths.LLVM_AR +LLVM_DWARFDUMP = paths.LLVM_DWARFDUMP +LLVM_DWP = paths.LLVM_DWP +LLVM_NM = paths.LLVM_NM +WASM_LD = paths.WASM_LD + def is_bitcode(filename): try: @@ -6291,7 +6290,7 @@ def check(what, args, fail=True, expect=''): import os print(os.environ.get('NM')) ''') - check(EMCONFIGURE, [PYTHON, 'test.py'], expect=shared.LLVM_NM, fail=False) + check(EMCONFIGURE, [PYTHON, 'test.py'], expect=LLVM_NM, fail=False) create_file('test.c', 'int main() { return 0; }') os.mkdir('test_cache') @@ -11532,12 +11531,12 @@ def test_emranlib(self): # Create a library with no archive map self.run_process([EMAR, 'crS', 'liba.a', 'foo.o', 'bar.o']) - output = self.run_process([shared.LLVM_NM, '--print-armap', 'liba.a'], stdout=PIPE).stdout + output = self.run_process([LLVM_NM, '--print-armap', 'liba.a'], stdout=PIPE).stdout self.assertNotContained('Archive map', output) # Add an archive map self.run_process([EMRANLIB, 'liba.a']) - output = self.run_process([shared.LLVM_NM, '--print-armap', 'liba.a'], stdout=PIPE).stdout + output = self.run_process([LLVM_NM, '--print-armap', 'liba.a'], stdout=PIPE).stdout self.assertContained('Archive map', output) def test_pthread_stub(self): @@ -12016,7 +12015,7 @@ def test_missing_malloc_export(self): def test_getrusage(self): self.do_other_test('test_getrusage.c') - @with_env_modify({'EMMAKEN_COMPILER': shared.CLANG_CC}) + @with_env_modify({'EMMAKEN_COMPILER': CLANG_CC}) def test_emmaken_compiler(self): self.assert_fail([EMCC, '-c', test_file('core/test_hello_world.c')], 'emcc: error: `EMMAKEN_COMPILER` is no longer supported') diff --git a/test/test_sanity.py b/test/test_sanity.py index db43f0e01b712..62fb9e0ac9021 100644 --- a/test/test_sanity.py +++ b/test/test_sanity.py @@ -27,10 +27,11 @@ from tools import cache, ports, response_file, shared, utils from tools.config import EM_CONFIG -from tools.shared import EMCC, config +from tools.shared import config, paths from tools.utils import delete_dir, delete_file SANITY_FILE = cache.get_path('sanity.txt') +EMCC = paths.EMCC commands = [[EMCC], [shared.bat_suffix(path_from_root('test/runner')), 'blahblah']] expected_llvm_version = str(shared.EXPECTED_LLVM_VERSION) + '.0.0' diff --git a/test/test_sockets.py b/test/test_sockets.py index 0e94c67124bda..269d50186668b 100644 --- a/test/test_sockets.py +++ b/test/test_sockets.py @@ -29,8 +29,8 @@ ) from tools import config -from tools.shared import CLANG_CC, EMCC -from tools.utils import path_from_root, run_process +from tools.shared import path_from_root, paths +from tools.utils import run_process npm_checked = False @@ -80,7 +80,7 @@ def __enter__(self): # NOTE empty filename support is a hack to support # the current test_enet if self.filename: - cmd = [CLANG_CC, test_file(self.filename), '-o', 'server', '-DSOCKK=%d' % self.target_port] + clang_native.get_clang_native_args() + self.args + cmd = [paths.CLANG_CC, test_file(self.filename), '-o', 'server', '-DSOCKK=%d' % self.target_port] + clang_native.get_clang_native_args() + self.args print(cmd) run_process(cmd, env=clang_native.get_clang_native_env()) process = Popen([os.path.abspath('server')]) @@ -146,7 +146,7 @@ def __enter__(self): # compile the server suffix = '.mjs' if '-sEXPORT_ES6' in self.args else '.js' - proc = run_process([EMCC, '-Werror', test_file(self.filename), '-o', 'server' + suffix, '-DSOCKK=%d' % self.listen_port] + self.args) + proc = run_process([paths.EMCC, '-Werror', test_file(self.filename), '-o', 'server' + suffix, '-DSOCKK=%d' % self.listen_port] + self.args) print('Socket server build: out:', proc.stdout or '', '/ err:', proc.stderr or '') process = Popen(config.NODE_JS + ['server' + suffix]) @@ -355,7 +355,7 @@ def test_nodejs_sockets_echo_subprotocol(self): # server because as long as the subprotocol list contains binary it will configure itself to accept binary # This test also checks that the connect url contains the correct subprotocols. with WebsockifyServerHarness(test_file('sockets/test_sockets_echo_server.c'), [], 59168): - self.run_process([EMCC, '-Werror', test_file('sockets/test_sockets_echo_client.c'), '-o', 'client.js', '-sSOCKET_DEBUG', '-sWEBSOCKET_SUBPROTOCOL="base64, binary"', '-DSOCKK=59168']) + self.run_process([paths.EMCC, '-Werror', test_file('sockets/test_sockets_echo_client.c'), '-o', 'client.js', '-sSOCKET_DEBUG', '-sWEBSOCKET_SUBPROTOCOL="base64, binary"', '-DSOCKK=59168']) out = self.run_js('client.js') self.assertContained('do_msg_read: read 14 bytes', out) @@ -376,7 +376,7 @@ def test_nodejs_sockets_echo_subprotocol_runtime(self): }; ''') with WebsockifyServerHarness(test_file('sockets/test_sockets_echo_server.c'), [], 59168): - self.run_process([EMCC, '-Werror', test_file('sockets/test_sockets_echo_client.c'), '-o', 'client.js', '--pre-js=websocket_pre.js', '-sSOCKET_DEBUG', '-DSOCKK=12345']) + self.run_process([paths.EMCC, '-Werror', test_file('sockets/test_sockets_echo_client.c'), '-o', 'client.js', '--pre-js=websocket_pre.js', '-sSOCKET_DEBUG', '-DSOCKK=12345']) out = self.run_js('client.js') self.assertContained('do_msg_read: read 14 bytes', out) diff --git a/tools/building.py b/tools/building.py index 91f5c67425217..db0c585ab36ef 100644 --- a/tools/building.py +++ b/tools/building.py @@ -28,17 +28,7 @@ from .feature_matrix import UNSUPPORTED from .settings import settings from .shared import ( - CLANG_CC, - CLANG_CXX, DEBUG, - EMAR, - EMCC, - EMRANLIB, - EMXX, - LLVM_DWARFDUMP, - LLVM_NM, - LLVM_OBJCOPY, - WASM_LD, asmjs_mangle, check_call, demangle_c_symbol_name, @@ -46,6 +36,7 @@ get_emscripten_temp_dir, is_c_symbol, path_from_root, + paths, ) from .toolchain_profiler import ToolchainProfiler from .utils import WINDOWS, run_process @@ -69,16 +60,16 @@ def get_building_env(): cache.ensure() env = os.environ.copy() # point CC etc. to the em* tools. - env['CC'] = EMCC - env['CXX'] = EMXX - env['AR'] = EMAR - env['LD'] = EMCC - env['NM'] = LLVM_NM - env['LDSHARED'] = EMCC - env['RANLIB'] = EMRANLIB + env['CC'] = paths.EMCC + env['CXX'] = paths.EMXX + env['AR'] = paths.EMAR + env['LD'] = paths.EMCC + env['NM'] = paths.LLVM_NM + env['LDSHARED'] = paths.EMCC + env['RANLIB'] = paths.EMRANLIB env['EMSCRIPTEN_TOOLS'] = path_from_root('tools') - env['HOST_CC'] = CLANG_CC - env['HOST_CXX'] = CLANG_CXX + env['HOST_CC'] = paths.CLANG_CC + env['HOST_CXX'] = paths.CLANG_CXX env['HOST_CFLAGS'] = '-W' # if set to nothing, CFLAGS is used, which we don't want env['HOST_CXXFLAGS'] = '-W' # if set to nothing, CXXFLAGS is used, which we don't want env['PKG_CONFIG_LIBDIR'] = cache.get_sysroot_dir('local/lib/pkgconfig') + os.path.pathsep + cache.get_sysroot_dir('lib/pkgconfig') @@ -283,8 +274,8 @@ def lld_flags_for_executable(external_symbols): def link_lld(args, target, external_symbols=None): - if not os.path.exists(WASM_LD): - exit_with_error('linker binary not found in LLVM directory: %s', WASM_LD) + if not os.path.exists(paths.WASM_LD): + exit_with_error('linker binary not found in LLVM directory: %s', paths.WASM_LD) # runs lld to link things. # lld doesn't currently support --start-group/--end-group since the # semantics are more like the windows linker where there is no need for @@ -305,7 +296,7 @@ def link_lld(args, target, external_symbols=None): # is passed. args.append('--keep-section=target_features') - cmd = [WASM_LD, '-o', target] + cmd = [paths.WASM_LD, '-o', target] for a in llvm_backend_args(): cmd += ['-mllvm', a] @@ -355,7 +346,7 @@ def get_command_with_possible_response_file(cmd): def emar(action, output_filename, filenames, stdout=None, stderr=None, env=None): utils.delete_file(output_filename) - cmd = [EMAR, action, output_filename] + filenames + cmd = [paths.EMAR, action, output_filename] + filenames cmd = get_command_with_possible_response_file(cmd) run_process(cmd, stdout=stdout, stderr=stderr, env=env) @@ -1016,7 +1007,7 @@ def wasm2js(js_file, wasm_file, opt_level, use_closure_compiler, debug_info, sym def strip(infile, outfile, debug=False, sections=None): """Strip DWARF and/or other specified sections from a wasm file""" - cmd = [LLVM_OBJCOPY, infile, outfile] + cmd = [paths.LLVM_OBJCOPY, infile, outfile] if debug: cmd += ['--remove-section=.debug*'] if sections: @@ -1164,7 +1155,7 @@ def emit_wasm_source_map(wasm_file, map_file, final_wasm): # importlib. wasm_sourcemap = importlib.import_module('tools.wasm-sourcemap') sourcemap_cmd = [wasm_file, - '--dwarfdump=' + LLVM_DWARFDUMP, + '--dwarfdump=' + paths.LLVM_DWARFDUMP, '-o', map_file, '--basepath=' + base_path] diff --git a/tools/emdwp.py b/tools/emdwp.py index 36f9f65e9ec19..244a2eb71e29e 100755 --- a/tools/emdwp.py +++ b/tools/emdwp.py @@ -16,4 +16,4 @@ from tools import shared -shared.exec_process([shared.LLVM_DWP] + sys.argv[1:]) +shared.exec_process([shared.paths.LLVM_DWP] + sys.argv[1:]) diff --git a/tools/emnm.py b/tools/emnm.py index 6ad9a7899fd06..0e03e8ce6a219 100755 --- a/tools/emnm.py +++ b/tools/emnm.py @@ -16,4 +16,4 @@ from tools import shared -shared.exec_process([shared.LLVM_NM] + sys.argv[1:]) +shared.exec_process([shared.paths.LLVM_NM] + sys.argv[1:]) diff --git a/tools/emscripten.py b/tools/emscripten.py index 97235d59f3e7f..0c83552f2243d 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -29,7 +29,7 @@ webassembly, ) from tools.settings import settings, user_settings -from tools.shared import DEBUG, asmjs_mangle, in_temp +from tools.shared import DEBUG, asmjs_mangle, in_temp, paths from tools.toolchain_profiler import ToolchainProfiler from tools.utils import exit_with_error, path_from_root, removeprefix @@ -497,7 +497,7 @@ def finalize_wasm(infile, outfile, js_syms): with shared.get_temp_files().get_file('.bin') as url_file: utils.write_binary(url_file, leb128.u.encode(len(base_url)) + base_url.encode('utf-8')) - cmd = [shared.LLVM_OBJCOPY, + cmd = [paths.LLVM_OBJCOPY, '--add-section', 'sourceMappingURL=' + url_file, infile] diff --git a/tools/file_packager.py b/tools/file_packager.py index 8eae3ce6a33ac..b17d19e99951a 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -328,7 +328,7 @@ def generate_object_file(data_files): .dc.a 0 .size __emscripten_embedded_file_data, {total_size} ''')) - cmd = [shared.EMCC, '-c', asm_file, '-o', options.obj_output] + cmd = [shared.paths.EMCC, '-c', asm_file, '-o', options.obj_output] if options.wasm64: target = 'wasm64-unknown-emscripten' cmd.append('-Wno-experimental') diff --git a/tools/link.py b/tools/link.py index e779c761b6d15..21be68e0988a7 100644 --- a/tools/link.py +++ b/tools/link.py @@ -45,7 +45,7 @@ settings, user_settings, ) -from .shared import DEBUG, DYLIB_EXTENSIONS, do_replace, in_temp +from .shared import DEBUG, DYLIB_EXTENSIONS, do_replace, in_temp, paths from .toolchain_profiler import ToolchainProfiler from .utils import ( WINDOWS, @@ -3061,7 +3061,7 @@ def package_files(options, target): rtn.append(object_file) cmd = building.get_command_with_possible_response_file( - [shared.FILE_PACKAGER, utils.replace_suffix(target, '.data')] + file_args) + [paths.FILE_PACKAGER, utils.replace_suffix(target, '.data')] + file_args) if options.preload_files: # Preloading files uses --pre-js code that runs before the module is loaded. file_code = shared.check_call(cmd, stdout=PIPE).stdout diff --git a/tools/shared.py b/tools/shared.py index a51ca7974e26c..9ee6d87d2b916 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -219,9 +219,9 @@ def get_npm_cmd(name, missing_ok=False): @memoize def get_clang_version(): - if not os.path.exists(CLANG_CC): - exit_with_error('clang executable not found at `%s`' % CLANG_CC) - proc = check_call([CLANG_CC, '--version'], stdout=PIPE) + if not os.path.exists(paths.CLANG_CC): + exit_with_error('clang executable not found at `%s`' % paths.CLANG_CC) + proc = check_call([paths.CLANG_CC, '--version'], stdout=PIPE) m = re.search(r'[Vv]ersion\s+(\d+\.\d+)', proc.stdout) return m and m.group(1) @@ -236,19 +236,20 @@ def check_llvm_version(): if 'BUILDBOT_BUILDNUMBER' in os.environ: if actual.startswith('%d.' % (EXPECTED_LLVM_VERSION + 1)): return True - diagnostics.warning('version-check', 'LLVM version for clang executable "%s" appears incorrect (seeing "%s", expected "%s")', CLANG_CC, actual, EXPECTED_LLVM_VERSION) + diagnostics.warning('version-check', 'LLVM version for clang executable "%s" appears incorrect (seeing "%s", expected "%s")', paths.CLANG_CC, actual, EXPECTED_LLVM_VERSION) return False def get_clang_targets(): - if not os.path.exists(CLANG_CC): - exit_with_error('clang executable not found at `%s`' % CLANG_CC) + clang = paths.CLANG_CC + if not os.path.exists(clang): + exit_with_error('clang executable not found at `%s`' % clang) try: - target_info = utils.run_process([CLANG_CC, '-print-targets'], stdout=PIPE).stdout + target_info = utils.run_process([clang, '-print-targets'], stdout=PIPE).stdout except subprocess.CalledProcessError: - exit_with_error('error running `clang -print-targets`. Check your llvm installation (%s)' % CLANG_CC) + exit_with_error('error running `clang -print-targets`. Check your llvm installation (%s)' % clang) if 'Registered Targets:' not in target_info: - exit_with_error('error parsing output of `clang -print-targets`. Check your llvm installation (%s)' % CLANG_CC) + exit_with_error('error parsing output of `clang -print-targets`. Check your llvm installation (%s)' % clang) return target_info.split('Registered Targets:')[1] @@ -367,7 +368,7 @@ def perform_sanity_checks(quiet=False): check_node() with ToolchainProfiler.profile_block('sanity LLVM'): - for cmd in (CLANG_CC, LLVM_AR): + for cmd in (paths.CLANG_CC, paths.LLVM_AR): if not os.path.exists(cmd) and not os.path.exists(cmd + '.exe'): # .exe extension required for Windows exit_with_error('cannot find %s, check the paths in %s', cmd, config.EM_CONFIG) @@ -617,7 +618,34 @@ def get_llvm_target(): return 'wasm32-unknown-emscripten' +class Paths: + pass + + +def setup_paths(): + paths.CLANG_CC = clang_tool_path('clang') + paths.CLANG_CXX = clang_tool_path('clang++') + paths.CLANG_SCAN_DEPS = llvm_tool_path('clang-scan-deps') + paths.LLVM_AR = llvm_tool_path('llvm-ar') + paths.LLVM_DWP = llvm_tool_path('llvm-dwp') + paths.LLVM_RANLIB = llvm_tool_path('llvm-ranlib') + paths.LLVM_NM = llvm_tool_path('llvm-nm') + paths.LLVM_DWARFDUMP = llvm_tool_path('llvm-dwarfdump') + paths.LLVM_OBJCOPY = llvm_tool_path('llvm-objcopy') + paths.LLVM_STRIP = llvm_tool_path('llvm-strip') + paths.WASM_LD = llvm_tool_path('wasm-ld') + paths.LLVM_PROFDATA = llvm_tool_path('llvm-profdata') + paths.LLVM_COV = llvm_tool_path('llvm-cov') + + paths.EMCC = bat_suffix(path_from_root('emcc')) + paths.EMXX = bat_suffix(path_from_root('em++')) + paths.EMAR = bat_suffix(path_from_root('emar')) + paths.EMRANLIB = bat_suffix(path_from_root('emranlib')) + paths.FILE_PACKAGER = bat_suffix(path_from_root('tools/file_packager')) + + def init(): + setup_paths() utils.set_version_globals() setup_temp_dirs() @@ -630,29 +658,10 @@ def init(): # file. TODO(sbc): We should try to reduce that amount we do here and instead # have consumers explicitly call initialization functions. -CLANG_CC = clang_tool_path('clang') -CLANG_CXX = clang_tool_path('clang++') -CLANG_SCAN_DEPS = llvm_tool_path('clang-scan-deps') -LLVM_AR = llvm_tool_path('llvm-ar') -LLVM_DWP = llvm_tool_path('llvm-dwp') -LLVM_RANLIB = llvm_tool_path('llvm-ranlib') -LLVM_NM = llvm_tool_path('llvm-nm') -LLVM_DWARFDUMP = llvm_tool_path('llvm-dwarfdump') -LLVM_OBJCOPY = llvm_tool_path('llvm-objcopy') -LLVM_STRIP = llvm_tool_path('llvm-strip') -WASM_LD = llvm_tool_path('wasm-ld') -LLVM_PROFDATA = llvm_tool_path('llvm-profdata') -LLVM_COV = llvm_tool_path('llvm-cov') - -EMCC = bat_suffix(path_from_root('emcc')) -EMXX = bat_suffix(path_from_root('em++')) -EMAR = bat_suffix(path_from_root('emar')) -EMRANLIB = bat_suffix(path_from_root('emranlib')) -FILE_PACKAGER = bat_suffix(path_from_root('tools/file_packager')) # Windows .dll suffix is not included in this list, since those are never # linked to directly on the command line. DYLIB_EXTENSIONS = ['.dylib', '.so'] - run_via_emxx = False +paths = Paths() init() diff --git a/tools/system_libs.py b/tools/system_libs.py index a8210062ba4e2..cd9feeb2f52a6 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -18,6 +18,7 @@ from . import building, cache, diagnostics, shared, utils from .settings import settings +from .shared import paths from .toolchain_profiler import ToolchainProfiler from .utils import read_file @@ -194,9 +195,9 @@ def create_ninja_file(input_files, filename, libname, cflags, asflags=None, cust ASFLAGS = {join_cmd(asflags)} CFLAGS = {join_cmd(cflags)} -EMCC = {shared.EMCC} -EMXX = {shared.EMXX} -EMAR = {shared.EMAR} +EMCC = {paths.EMCC} +EMXX = {paths.EMXX} +EMAR = {paths.EMAR} rule cc depfile = $out.d @@ -496,9 +497,9 @@ def build_objects(self, build_dir): for src in self.get_files(): ext = utils.suffix(src) if ext in {'.s', '.S', '.c'}: - cmd = shared.EMCC + cmd = paths.EMCC else: - cmd = shared.EMXX + cmd = paths.EMXX cmd = [cmd, '-c'] if ext == '.s': # .s files are processed directly by the assembler. In this case we can't pass