Skip to content

Commit 72fdaac

Browse files
committed
Make macOS use dynamic lookup for its linking
1 parent ababe10 commit 72fdaac

File tree

5 files changed

+323
-22
lines changed

5 files changed

+323
-22
lines changed

.github/workflows/CI.yml

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,42 @@ concurrency:
2929
cancel-in-progress: true
3030

3131
jobs:
32+
build-wasm:
33+
runs-on: ubuntu-latest
34+
steps:
35+
- uses: actions/checkout@v4
36+
with:
37+
fetch-depth: 0
38+
- name: Install Rust toolchain
39+
uses: dtolnay/rust-toolchain@stable
40+
with:
41+
targets: wasm32-wasip1
42+
- name: Cache cargo
43+
uses: actions/cache@v4
44+
with:
45+
path: |
46+
~/.cargo/registry/index/
47+
~/.cargo/registry/cache/
48+
~/.cargo/git/db/
49+
.cargo-cache
50+
target/
51+
key: wasm-cargo-cache-${{ hashFiles('**/Cargo.lock') }}
52+
- name: Build WASM
53+
run: |
54+
rustup target add wasm32-wasip1
55+
cd fix-python-soname
56+
cargo build --target wasm32-wasip1 --release
57+
cp target/wasm32-wasip1/release/fix-python-soname.wasm ..
58+
- name: Upload WASM artifacts
59+
uses: actions/upload-artifact@v4
60+
with:
61+
name: wasm-bindings
62+
path: |
63+
fix-python-soname.wasm
64+
fix-python-soname.js
65+
3266
build:
67+
needs: build-wasm
3368
strategy:
3469
fail-fast: false
3570
matrix:
@@ -57,6 +92,11 @@ jobs:
5792
runs-on: ${{ matrix.settings.host }}
5893
steps:
5994
- uses: actions/checkout@v4
95+
- name: Download WASM artifacts
96+
uses: actions/download-artifact@v4
97+
with:
98+
name: wasm-bindings
99+
path: .
60100
- uses: webfactory/ssh-agent@v0.9.0
61101
with:
62102
ssh-private-key: |
@@ -149,7 +189,6 @@ jobs:
149189
git config --global url."ssh://git@github.com-http-handler/platformatic/http-handler.git".insteadOf "ssh://git@github.com/platformatic/http-handler.git"
150190
git config --global url."ssh://git@github.com-http-rewriter/platformatic/http-rewriter.git".insteadOf "ssh://git@github.com/platformatic/http-rewriter.git"
151191
152-
npm run build:wasm
153192
${{ matrix.settings.build }}
154193
- name: Build
155194
run: ${{ matrix.settings.build }}
@@ -431,7 +470,7 @@ jobs:
431470
exit 1
432471
fi
433472
shell: bash
434-
- name: Copy fix-python-soname files to Linux packages
473+
- name: Copy fix-python-soname files to Linux and macOS packages
435474
run: |
436475
# Find the WASM and JS files from Linux artifacts
437476
WASM_FILE=$(find artifacts -name "fix-python-soname.wasm" | head -n 1)
@@ -441,9 +480,9 @@ jobs:
441480
echo "Found WASM file: $WASM_FILE"
442481
echo "Found JS file: $JS_FILE"
443482
444-
# Copy to all Linux npm directories
483+
# Copy to all Linux and macOS npm directories
445484
for dir in npm/*/; do
446-
if [[ "$dir" == *"linux"* ]]; then
485+
if [[ "$dir" == *"linux"* ]] || [[ "$dir" == *"darwin"* ]]; then
447486
echo "Copying files to $dir"
448487
cp "$WASM_FILE" "$dir"
449488
cp "$JS_FILE" "$dir"

fix-python-soname.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,24 @@ function isDevInstall() {
4242
return false
4343
}
4444

45-
// Only patch soname on Linux
46-
if (platform !== 'linux') {
45+
// Only patch on Linux and macOS
46+
if (platform !== 'linux' && platform !== 'darwin') {
4747
console.log(`No need to fix soname on platform: ${platform}`)
4848
process.exit(0)
4949
}
5050

51-
// Get the node file path
52-
const nodeFilePath = path.join(__dirname, `python-node.linux-${arch}-gnu.node`)
51+
// Get the node file path based on platform
52+
const nodeFilePath = platform === 'linux'
53+
? path.join(__dirname, `python-node.linux-${arch}-gnu.node`)
54+
: path.join(__dirname, `python-node.darwin-${arch}.node`)
5355
if (!fs.existsSync(nodeFilePath)) {
5456
if (isDevInstall()) {
5557
// No .node file found during dev install - this is expected, skip silently
56-
console.log(`${nodeFilePath} not found during development install, skipping soname fix`)
58+
console.log(`${nodeFilePath} not found during development install, skipping binary patching`)
5759
process.exit(0)
5860
} else {
5961
// No .node file found when installed as dependency - this is an error
60-
console.error(`Error: Could not find "${nodeFilePath}" to fix soname`)
62+
console.error(`Error: Could not find "${nodeFilePath}" to patch binary`)
6163
process.exit(1)
6264
}
6365
}
@@ -67,7 +69,7 @@ const wasmPath = path.join(__dirname, 'fix-python-soname.wasm')
6769
if (!fs.existsSync(wasmPath)) {
6870
if (isDevInstall()) {
6971
// WASM file not found during dev install - this is expected, skip with warning
70-
console.log('WASM file not found during development install, skipping soname fix')
72+
console.log('WASM file not found during development install, skipping binary patching')
7173
process.exit(0)
7274
} else {
7375
// WASM file not found when installed as dependency - this is an error
@@ -76,7 +78,7 @@ if (!fs.existsSync(wasmPath)) {
7678
}
7779
}
7880

79-
console.log(`Running soname fix on ${nodeFilePath}`)
81+
console.log(`Running binary patch on ${nodeFilePath}`)
8082

8183
// Create a WASI instance
8284
const wasi = new WASI({

0 commit comments

Comments
 (0)