From 6dfa79013f2e095dd4ef014c911f201f3d92cad6 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 20 Sep 2025 17:42:09 +0300 Subject: [PATCH] feat(loader): respect NM env var --- crates/loader/src/loader.rs | 13 +++++++++---- crates/xtask/src/check_wasm_exports.rs | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 2641eeeb..f6608eb3 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -946,6 +946,11 @@ impl Loader { } else { "" }; + let section = if cfg!(all(target_arch = "powerpc64", target_os = "linux")) { + " D " + } else { + " T " + }; let mut must_have = vec![ format!("{prefix}tree_sitter_{name}_external_scanner_create"), format!("{prefix}tree_sitter_{name}_external_scanner_destroy"), @@ -954,16 +959,16 @@ impl Loader { format!("{prefix}tree_sitter_{name}_external_scanner_scan"), ]; - let command = Command::new("nm") - .arg("-W") - .arg("-U") + let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); + let command = Command::new(nm_cmd) + .arg("--defined-only") .arg(library_path) .output(); if let Ok(output) = command { if output.status.success() { let mut found_non_static = false; for line in String::from_utf8_lossy(&output.stdout).lines() { - if line.contains(" T ") { + if line.contains(section) { if let Some(function_name) = line.split_whitespace().collect::>().get(2) { diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs index b2193bb3..124725b7 100644 --- a/crates/xtask/src/check_wasm_exports.rs +++ b/crates/xtask/src/check_wasm_exports.rs @@ -1,5 +1,6 @@ use std::{ collections::HashSet, + env, io::BufRead, path::PathBuf, process::{Command, Stdio}, @@ -94,7 +95,8 @@ fn check_wasm_exports() -> Result<()> { }), ); - let nm_child = Command::new("nm") + let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); + let nm_child = Command::new(nm_cmd) .arg("-W") .arg("-U") .arg("libtree-sitter.so")