mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-16 13:03:31 +08:00
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
47 lines
1.6 KiB
Rust
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()
|
|
}
|