From 2d053d63143af14de673b50386ce9997086cbbf0 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 31 Aug 2022 10:20:58 -0700 Subject: [PATCH] Switch to separate setting for loading shared libraries globally --- packages/cpp-exceptions-test/meta.yaml | 1 + packages/sharedlib-test/meta.yaml | 1 + packages/sqlite3/meta.yaml | 1 + pyodide-build/pyodide_build/buildall.py | 3 +++ pyodide-build/pyodide_build/io.py | 3 +++ src/js/load-package.ts | 10 ++++++++-- 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/cpp-exceptions-test/meta.yaml b/packages/cpp-exceptions-test/meta.yaml index f27b523753b..816df440209 100644 --- a/packages/cpp-exceptions-test/meta.yaml +++ b/packages/cpp-exceptions-test/meta.yaml @@ -6,6 +6,7 @@ source: path: src build: sharedlibrary: true + global: true script: | em++ -c throw.cpp -o throw.o ${SIDE_MODULE_CFLAGS} -fexceptions em++ -c catch.cpp -o catch.o ${SIDE_MODULE_CFLAGS} -fexceptions diff --git a/packages/sharedlib-test/meta.yaml b/packages/sharedlib-test/meta.yaml index 1e8ec98bb15..9185c63d314 100644 --- a/packages/sharedlib-test/meta.yaml +++ b/packages/sharedlib-test/meta.yaml @@ -8,6 +8,7 @@ source: build: sharedlibrary: true + global: true script: | emcc -c main.c -o main.o ${SIDE_MODULE_CFLAGS} emcc -c dep.c -o dep.o ${SIDE_MODULE_CFLAGS} diff --git a/packages/sqlite3/meta.yaml b/packages/sqlite3/meta.yaml index 5c13a13e108..923183321b4 100644 --- a/packages/sqlite3/meta.yaml +++ b/packages/sqlite3/meta.yaml @@ -6,6 +6,7 @@ source: path: empty build: sharedlibrary: true + global: true script: | mkdir dist export DISTDIR=$(pwd)/dist diff --git a/pyodide-build/pyodide_build/buildall.py b/pyodide-build/pyodide_build/buildall.py index 915e02a3e70..9d3ff94b51b 100755 --- a/pyodide-build/pyodide_build/buildall.py +++ b/pyodide-build/pyodide_build/buildall.py @@ -44,6 +44,7 @@ class BasePackage: meta: dict[str, Any] library: bool shared_library: bool + global_: bool run_dependencies: list[str] host_dependencies: list[str] dependencies: set[str] # run + host dependencies @@ -99,6 +100,7 @@ def __init__(self, pkgdir: Path): self.library = self.meta["build"].get("library", False) self.shared_library = self.meta["build"].get("sharedlibrary", False) + self.global_ = self.meta["build"].get("global", False) assert self.name == pkgdir.name, f"{self.name} != {pkgdir.name}" @@ -496,6 +498,7 @@ def generate_packagedata( } if pkg.shared_library: pkg_entry["shared_library"] = True + pkg_entry["global"] = pkg.global_ pkg_entry["install_dir"] = "lib" if pkg.cpython_dynlib else "dynlib" pkg_entry["depends"] = [ diff --git a/pyodide-build/pyodide_build/io.py b/pyodide-build/pyodide_build/io.py index 8765bd7adec..92a87c622c1 100644 --- a/pyodide-build/pyodide_build/io.py +++ b/pyodide-build/pyodide_build/io.py @@ -22,6 +22,7 @@ }, "build": { "exports": str | list, # list[str] + "global": bool, "backend-flags": str, "cflags": str, "cxxflags": str, @@ -151,6 +152,8 @@ def _check_config_build(config: dict[str, Any]) -> Iterator[str]: yield "build/library and build/sharedlibrary cannot both be true." allowed_keys = {"library", "sharedlibrary", "script", "cross-script"} + if not library: + allowed_keys |= {"global"} typ = "library" if library else "sharedlibrary" for key in build_metadata.keys(): if key not in PACKAGE_CONFIG_SPEC["build"]: diff --git a/src/js/load-package.ts b/src/js/load-package.ts index aac62b4743d..7645ddff117 100644 --- a/src/js/load-package.ts +++ b/src/js/load-package.ts @@ -226,7 +226,7 @@ async function installPackage( source: channel === DEFAULT_CHANNEL ? "pyodide" : channel, }); for (const dynlib of dynlibs) { - await loadDynlib(dynlib); + await loadDynlib(dynlib, pkg.global); } } @@ -269,7 +269,7 @@ const acquireDynlibLock = createLock(); * @param shared Is this a shared library or not? * @private */ -async function loadDynlib(lib: string) { +async function loadDynlib(lib: string, global: boolean) { const node = Module.FS.lookupPath(lib).node; let byteArray; if (node.mount.type == Module.FS.filesystems.MEMFS) { @@ -301,6 +301,12 @@ async function loadDynlib(lib: string) { }); Module.preloadedWasm[lib] = module; Module.preloadedWasm[lib.split("/").pop()!] = module; + if (global) { + Module.loadDynamicLibrary(lib, { + global: true, + nodelete: true, + }); + } } catch (e: any) { if (e && e.message && e.message.includes("need to see wasm magic number")) { console.warn(