Skip to content

Commit fa1fab8

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 fa1fab8

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
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 & 11 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()
@@ -1246,7 +1244,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
12461244
if settings.WASMFS:
12471245
settings.FILESYSTEM = 1
12481246
settings.SYSCALLS_REQUIRE_FILESYSTEM = 0
1249-
settings.JS_LIBRARIES.append('libwasmfs.js')
1247+
add_system_js_lib('libwasmfs.js')
12501248
if settings.ASSERTIONS:
12511249
# used in assertion checks for unflushed content
12521250
settings.REQUIRED_EXPORTS += ['wasmfs_flush']
@@ -1362,14 +1360,14 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
13621360

13631361
if settings.PTHREADS:
13641362
setup_pthreads()
1365-
settings.JS_LIBRARIES.append('libpthread.js')
1363+
add_system_js_lib('libpthread.js')
13661364
if settings.PROXY_TO_PTHREAD:
13671365
settings.PTHREAD_POOL_SIZE_STRICT = 0
13681366
settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$runtimeKeepalivePush']
13691367
else:
13701368
if settings.PROXY_TO_PTHREAD:
13711369
exit_with_error('-sPROXY_TO_PTHREAD requires -pthread to work!')
1372-
settings.JS_LIBRARIES.append('libpthread_stub.js')
1370+
add_system_js_lib('libpthread_stub.js')
13731371

13741372
if settings.MEMORY64:
13751373
# Any "pointers" passed to JS will now be i64's, in both modes.
@@ -1383,7 +1381,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
13831381
# set location of Wasm Worker bootstrap JS file
13841382
if settings.WASM_WORKERS == 1:
13851383
settings.WASM_WORKER_FILE = unsuffixed(os.path.basename(target)) + '.ww.js'
1386-
settings.JS_LIBRARIES.append('libwasm_worker.js')
1384+
add_system_js_lib('libwasm_worker.js')
13871385

13881386
# Set min browser versions based on certain settings such as WASM_BIGINT,
13891387
# PTHREADS, AUDIO_WORKLET
@@ -1401,7 +1399,7 @@ def phase_linker_setup(options, linker_args): # noqa: C901, PLR0912, PLR0915
14011399
if settings.AUDIO_WORKLET:
14021400
if settings.AUDIO_WORKLET == 1:
14031401
settings.AUDIO_WORKLET_FILE = unsuffixed(os.path.basename(target)) + '.aw.js'
1404-
settings.JS_LIBRARIES.append('libwebaudio.js')
1402+
add_system_js_lib('libwebaudio.js')
14051403
if not settings.MINIMAL_RUNTIME:
14061404
# If we are in the audio worklet environment, we can only access the Module object
14071405
# and not the global scope of the main JS script. Therefore we need to export
@@ -2767,14 +2765,20 @@ def map_to_js_libs(library_name):
27672765
return None
27682766

27692767

2768+
def add_system_js_lib(lib):
2769+
lib = utils.path_from_root('src/lib', lib)
2770+
assert os.path.exists(lib)
2771+
settings.JS_LIBRARIES.append(lib)
2772+
2773+
27702774
def process_libraries(options, flags):
27712775
new_flags = []
27722776
system_libs_map = system_libs.Library.get_usable_variations()
27732777

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'):
@@ -2784,9 +2788,8 @@ def process_libraries(options, flags):
27842788

27852789
logger.debug('looking for library "%s"', lib)
27862790

2787-
js_libs = map_to_js_libs(lib)
2788-
if js_libs is not None:
2789-
settings.JS_LIBRARIES += js_libs
2791+
for lib in map_to_js_libs(lib):
2792+
add_system_js_lib(lib)
27902793

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

0 commit comments

Comments
 (0)