Skip to content

Commit 3630f5d

Browse files
committed
Avoid converting use JS paths to absolute paths. NFC
System library paths are converted to absolute paths, both in link.py and in modules.mjs, but use JS libraries are left in their original form. Added a test to confirm that a user library can have the same name as as system library without issue. Split out from emscripten-core#23787
1 parent 7e56c1d commit 3630f5d

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

src/modules.mjs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,20 +201,15 @@ function calculateLibraries() {
201201
libraries.push('liblittle_endian_heap.js');
202202
}
203203

204+
// Resolve system libraries
205+
libraries = libraries.map((filename) => path.join(systemLibdir, filename));
206+
204207
// Add all user specified JS library files to the link.
205208
// These must be added last after all Emscripten-provided system libraries
206209
// above, so that users can override built-in JS library symbols in their
207210
// own code.
208211
libraries.push(...JS_LIBRARIES);
209212

210-
// Resolve all filenames to absolute paths
211-
libraries = libraries.map((filename) => {
212-
if (!path.isAbsolute(filename) && fs.existsSync(path.join(systemLibdir, filename))) {
213-
filename = path.join(systemLibdir, filename);
214-
}
215-
return path.resolve(filename);
216-
});
217-
218213
// Deduplicate libraries to avoid processing any library file multiple times
219214
libraries = libraries.filter((item, pos) => libraries.indexOf(item) == pos);
220215

test/test_other.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5001,6 +5001,23 @@ def test_jslib_new_objects_non_empty(self):
50015001
err = self.expect_fail([EMCC, test_file('hello_world.c'), '--js-library=lib.js', '-sEXPORTED_FUNCTIONS=obj,_main'])
50025002
self.assertContained('cannot stringify Map with data', err)
50035003

5004+
def test_jslib_system_lib_name(self):
5005+
create_file('libcore.js', r'''
5006+
addToLibrary({
5007+
jslibfunc: (x) => 2 * x
5008+
});
5009+
''')
5010+
create_file('src.c', r'''
5011+
#include <emscripten.h>
5012+
#include <stdio.h>
5013+
int jslibfunc(int x);
5014+
int main() {
5015+
printf("jslibfunc: %d\n", jslibfunc(6));
5016+
return 0;
5017+
}
5018+
''')
5019+
self.do_runf('src.c', 'jslibfunc: 12', emcc_args=['--js-library', 'libcore.js'])
5020+
50045021
def test_EMCC_BUILD_DIR(self):
50055022
# EMCC_BUILD_DIR was necessary in the past since we used to force the cwd to be src/ for
50065023
# technical reasons.

tools/link.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,6 @@ def get_js_sym_info():
217217
assert jslibs
218218
input_files.extend(read_file(jslib) for jslib in sorted(jslibs))
219219
for jslib in settings.JS_LIBRARIES:
220-
if not os.path.isabs(jslib):
221-
jslib = utils.path_from_root('src/lib', jslib)
222220
input_files.append(read_file(jslib))
223221
content = '\n'.join(input_files)
224222
content_hash = hashlib.sha1(content.encode('utf-8')).hexdigest()
@@ -629,6 +627,12 @@ def check_browser_versions():
629627
exit_with_error(f'{key} older than {oldest} is not supported')
630628

631629

630+
def add_system_js_lib(lib):
631+
lib = utils.path_from_root('src/lib', lib)
632+
assert os.path.exists(lib)
633+
settings.JS_LIBRARIES.append(lib)
634+
635+
632636
@ToolchainProfiler.profile_block('linker_setup')
633637
def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
634638
"""Future modifications should consider refactoring to reduce complexity.
@@ -1246,7 +1250,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
12461250
if settings.WASMFS:
12471251
settings.FILESYSTEM = 1
12481252
settings.SYSCALLS_REQUIRE_FILESYSTEM = 0
1249-
settings.JS_LIBRARIES.append('libwasmfs.js')
1253+
add_system_js_lib('libwasmfs.js')
12501254
if settings.ASSERTIONS:
12511255
# used in assertion checks for unflushed content
12521256
settings.REQUIRED_EXPORTS += ['wasmfs_flush']
@@ -1362,14 +1366,14 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
13621366

13631367
if settings.PTHREADS:
13641368
setup_pthreads()
1365-
settings.JS_LIBRARIES.append('libpthread.js')
1369+
add_system_js_lib('libpthread.js')
13661370
if settings.PROXY_TO_PTHREAD:
13671371
settings.PTHREAD_POOL_SIZE_STRICT = 0
13681372
settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$runtimeKeepalivePush']
13691373
else:
13701374
if settings.PROXY_TO_PTHREAD:
13711375
exit_with_error('-sPROXY_TO_PTHREAD requires -pthread to work!')
1372-
settings.JS_LIBRARIES.append('libpthread_stub.js')
1376+
add_system_js_lib('libpthread_stub.js')
13731377

13741378
if settings.MEMORY64:
13751379
# Any "pointers" passed to JS will now be i64's, in both modes.
@@ -1383,7 +1387,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
13831387
# set location of Wasm Worker bootstrap JS file
13841388
if settings.WASM_WORKERS == 1:
13851389
settings.WASM_WORKER_FILE = unsuffixed(os.path.basename(target)) + '.ww.js'
1386-
settings.JS_LIBRARIES.append('libwasm_worker.js')
1390+
add_system_js_lib('libwasm_worker.js')
13871391

13881392
# Set min browser versions based on certain settings such as WASM_BIGINT,
13891393
# PTHREADS, AUDIO_WORKLET
@@ -1401,7 +1405,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
14011405
if settings.AUDIO_WORKLET:
14021406
if settings.AUDIO_WORKLET == 1:
14031407
settings.AUDIO_WORKLET_FILE = unsuffixed(os.path.basename(target)) + '.aw.js'
1404-
settings.JS_LIBRARIES.append('libwebaudio.js')
1408+
add_system_js_lib('libwebaudio.js')
14051409
if not settings.MINIMAL_RUNTIME:
14061410
# If we are in the audio worklet environment, we can only access the Module object
14071411
# and not the global scope of the main JS script. Therefore we need to export
@@ -2774,7 +2778,7 @@ def process_libraries(options, flags):
27742778
# Process `-l` and `--js-library` flags
27752779
for flag in flags:
27762780
if flag.startswith('--js-library='):
2777-
js_lib = os.path.abspath(flag.split('=', 1)[1])
2781+
js_lib = flag.split('=', 1)[1]
27782782
settings.JS_LIBRARIES.append(js_lib)
27792783
continue
27802784
if not flag.startswith('-l'):
@@ -2785,8 +2789,8 @@ def process_libraries(options, flags):
27852789
logger.debug('looking for library "%s"', lib)
27862790

27872791
js_libs = map_to_js_libs(lib)
2788-
if js_libs is not None:
2789-
settings.JS_LIBRARIES += js_libs
2792+
for l in js_libs:
2793+
add_system_js_lib(l)
27902794

27912795
# We don't need to resolve system libraries to absolute paths here, we can just
27922796
# let wasm-ld handle that. However, we do want to map to the correct variant.

0 commit comments

Comments
 (0)