From 7b47b9e1ac521a66f0232f0d6ec96efd3bf3b3a3 Mon Sep 17 00:00:00 2001 From: Jason Verley Date: Thu, 5 Feb 2026 10:03:27 -0700 Subject: [PATCH 1/2] Use clang as linker driver on macOS The existing macOS linker configuration passed raw ld64 flags that don't work when using clang as the linker driver. This simplifies macOS linking by using clang, which automatically handles SDK detection, system library linking, and architecture flags. Changes: - Use clang instead of ld/ld64.lld on macOS - Change -dylib to -dynamiclib (clang syntax) - Remove manual -syslibroot and -platform_version flags (clang handles these) - Simplify target specs to only pass -Wl,-undefined,dynamic_lookup - Add build.rs to embed LLVM library rpath for runtime linking - Add MacPorts installation instructions to configure script Tested on macOS with MacPorts LLVM 18 and 21 on Apple Silicon (M1). --- configure | 5 +++- openvaf/linker/src/lib.rs | 30 +++---------------- openvaf/openvaf-driver/build.rs | 17 +++++++++++ .../target/src/spec/aarch64_apple_darwin.rs | 15 +--------- .../target/src/spec/x86_64_apple_darwin.rs | 9 +----- 5 files changed, 27 insertions(+), 49 deletions(-) create mode 100644 openvaf/openvaf-driver/build.rs diff --git a/configure b/configure index 65d1fdbc..3dea093d 100755 --- a/configure +++ b/configure @@ -213,7 +213,10 @@ else echo " 2. Set LLVM_SYS_XXX_PREFIX environment variable" echo "" echo "Installation examples:" - echo " macOS: brew install llvm" + echo " macOS (Homebrew): brew install llvm" + echo " macOS (MacPorts): sudo port install llvm-21 clang-21" + echo " sudo port select --set llvm mp-llvm-21" + echo " sudo port select --set clang mp-clang-21" echo " Ubuntu: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 21" echo " Manual: export LLVM_SYS_211_PREFIX=/path/to/llvm" exit 1 diff --git a/openvaf/linker/src/lib.rs b/openvaf/linker/src/lib.rs index d0a105bd..ded1a8a5 100644 --- a/openvaf/linker/src/lib.rs +++ b/openvaf/linker/src/lib.rs @@ -97,21 +97,6 @@ fn linker_with_args<'a>( // this environment variable too in recent versions. cmd.cmd().env("ZERO_AR_DATE", "1"); - // On macOS, we always need to add the SDK sysroot for linking against system libraries - if flavor == LinkerFlavor::Ld64 && target.options.is_like_osx { - // Detect SDK path using xcrun - if let Ok(output) = std::process::Command::new("xcrun").args(["--show-sdk-path"]).output() { - if output.status.success() { - if let Ok(sdk_path) = String::from_utf8(output.stdout) { - let sdk_path = sdk_path.trim(); - if !sdk_path.is_empty() { - cmd.args(["-syslibroot", sdk_path]); - } - } - } - } - } - cmd.add_pre_link_args(target, flavor); add_objects(&mut *cmd); @@ -170,17 +155,9 @@ fn get_linker<'a>( let path = path.unwrap_or_else(|| { if is_msys2_environment() { "gcc".into() - } else if flavor == LinkerFlavor::Ld64 { - // For macOS, prefer LLVM's ld64.lld if available - if let Some(llvm_prefix) = get_llvm_prefix() { - let llvm_lld = PathBuf::from(llvm_prefix).join("bin/ld64.lld"); - if llvm_lld.exists() { - return llvm_lld; - } - } - "ld".into() + } else if cfg!(target_os = "macos") { + "clang".into() } else { - // On macOS and Linux, use system ld "ld".into() } }); @@ -286,7 +263,8 @@ impl<'a> LdLinker<'a> { fn build_dylib(&mut self) { // On mac we need to tell the linker to let this library be rpathed if self.target.options.is_like_osx { - self.linker_arg("-dylib"); + self.linker_arg("-dynamiclib"); + // clang automatically handles -lSystem } else { self.linker_arg("-shared"); } diff --git a/openvaf/openvaf-driver/build.rs b/openvaf/openvaf-driver/build.rs new file mode 100644 index 00000000..e0836e20 --- /dev/null +++ b/openvaf/openvaf-driver/build.rs @@ -0,0 +1,17 @@ +// build.rs for openvaf-driver + +fn main() { + // Add rpath for LLVM on macOS + #[cfg(target_os = "macos")] + { + if let Ok(output) = std::process::Command::new("llvm-config") + .arg("--libdir") + .output() + { + if output.status.success() { + let libdir = String::from_utf8_lossy(&output.stdout).trim().to_string(); + println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libdir); + } + } + } +} diff --git a/openvaf/target/src/spec/aarch64_apple_darwin.rs b/openvaf/target/src/spec/aarch64_apple_darwin.rs index d598f24e..91a4c85b 100644 --- a/openvaf/target/src/spec/aarch64_apple_darwin.rs +++ b/openvaf/target/src/spec/aarch64_apple_darwin.rs @@ -7,23 +7,10 @@ pub fn target() -> Target { base.pre_link_args.insert( LinkerFlavor::Ld64, vec![ - "-arch".to_string(), - "arm64".to_string(), - "-platform_version".to_string(), - "macos".to_string(), - "11.0".to_string(), - "11.0".to_string(), - "-undefined".to_string(), - "dynamic_lookup".to_string(), + "-Wl,-undefined,dynamic_lookup".to_string(), ], ); - // Link against libSystem which provides dyld_stub_binder - base.post_link_args.insert( - LinkerFlavor::Ld64, - vec!["-lSystem".to_string()], - ); - Target { llvm_target: "arm64-apple-macosx11.0.0".to_owned(), pointer_width: 64, diff --git a/openvaf/target/src/spec/x86_64_apple_darwin.rs b/openvaf/target/src/spec/x86_64_apple_darwin.rs index 4525691b..72993edd 100644 --- a/openvaf/target/src/spec/x86_64_apple_darwin.rs +++ b/openvaf/target/src/spec/x86_64_apple_darwin.rs @@ -8,14 +8,7 @@ pub fn target() -> Target { base.pre_link_args.insert( LinkerFlavor::Ld64, vec![ - "-arch".to_string(), - "x86_64".to_string(), - "-platform_version".to_string(), - "macos".to_string(), - "10.15".to_string(), - "10.15".to_string(), - "-undefined".to_string(), - "dynamic_lookup".to_string(), + "-Wl,-undefined,dynamic_lookup".to_string(), ], ); From d50ef7e12da3edea6352256f0dd5aeb6c630d623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Tue, 24 Feb 2026 14:22:45 +0100 Subject: [PATCH 2/2] cargo fmt --- .github/workflows/rust-ci.yml | 1 + openvaf/openvaf-driver/build.rs | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 23942e7f..9668027c 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -13,6 +13,7 @@ on: - master - main - llvm18 + - verley-macos pull_request: branches: - '**' diff --git a/openvaf/openvaf-driver/build.rs b/openvaf/openvaf-driver/build.rs index e0836e20..2c0a6834 100644 --- a/openvaf/openvaf-driver/build.rs +++ b/openvaf/openvaf-driver/build.rs @@ -4,10 +4,7 @@ fn main() { // Add rpath for LLVM on macOS #[cfg(target_os = "macos")] { - if let Ok(output) = std::process::Command::new("llvm-config") - .arg("--libdir") - .output() - { + if let Ok(output) = std::process::Command::new("llvm-config").arg("--libdir").output() { if output.status.success() { let libdir = String::from_utf8_lossy(&output.stdout).trim().to_string(); println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libdir);