程序员阿江(Relakkes) 97da3ae180 Build macOS notification bridge for the target arch
The macOS notification bridge is compiled by build.rs outside Cargo's Rust target handling. On Apple Silicon, clang defaulted macos_notifications.o to arm64 even when Cargo was building x86_64, so the x64 release job ignored the object and missed the exported notification symbols.

Constraint: The ObjC bridge is linked manually through cargo:rustc-link-arg
Constraint: Release workflow builds both aarch64-apple-darwin and x86_64-apple-darwin from macOS runners
Rejected: Rely on clang default architecture | Apple Silicon defaults arm64 and breaks x86_64 linking
Confidence: high
Scope-risk: narrow
Directive: Keep native ObjC bridge compilation aligned with Cargo TARGET when adding platform bridge files
Tested: cargo fmt --check
Tested: git diff --check
Tested: cargo check --target aarch64-apple-darwin
Tested: cargo build --target x86_64-apple-darwin --release
Tested: file target/x86_64-apple-darwin/release/.../macos_notifications.o reports Mach-O 64-bit object x86_64
Not-tested: Full GitHub release workflow after retag before pushing
2026-05-05 23:04:12 +08:00

47 lines
1.6 KiB
Rust

fn main() {
#[cfg(target_os = "macos")]
{
use std::{env, path::PathBuf, process::Command};
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR is set by Cargo"));
let target = env::var("TARGET").expect("TARGET is set by Cargo");
let arch = match target.as_str() {
"aarch64-apple-darwin" => "arm64",
"x86_64-apple-darwin" => "x86_64",
_ => panic!("unsupported macOS notification bridge target: {target}"),
};
let object_path = out_dir.join("macos_notifications.o");
let source_path = PathBuf::from("src/macos_notifications.m");
println!("cargo:rerun-if-changed={}", source_path.display());
println!("cargo:rerun-if-env-changed=TARGET");
let status = Command::new("clang")
.args([
"-fobjc-arc",
"-c",
"-arch",
arch,
source_path
.to_str()
.expect("notification bridge path is UTF-8"),
"-o",
object_path
.to_str()
.expect("compiled notification bridge path is UTF-8"),
])
.status()
.expect("failed to invoke clang for macOS notification bridge");
if !status.success() {
panic!("failed to compile macOS notification bridge");
}
println!("cargo:rustc-link-arg={}", object_path.display());
println!("cargo:rustc-link-lib=framework=Foundation");
println!("cargo:rustc-link-lib=framework=UserNotifications");
}
tauri_build::build()
}