diff --git a/Cargo.lock b/Cargo.lock index 3cee22dedee72..978cc25f96b72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4995,6 +4995,7 @@ version = "0.0.0" dependencies = [ "addr2line", "alloc", + "build_helper", "cfg-if 0.1.10", "compiler_builtins", "core", @@ -5662,6 +5663,7 @@ dependencies = [ name = "unwind" version = "0.0.0" dependencies = [ + "build_helper", "cc", "cfg-if 0.1.10", "compiler_builtins", diff --git a/compiler/rustc_llvm/build.rs b/compiler/rustc_llvm/build.rs index 3b6808d693f21..838567663b51e 100644 --- a/compiler/rustc_llvm/build.rs +++ b/compiler/rustc_llvm/build.rs @@ -2,7 +2,7 @@ use std::env; use std::path::{Path, PathBuf}; use std::process::Command; -use build_helper::{output, tracked_env_var_os}; +use build_helper::{maybe_static_library, output, tracked_env_var_os}; fn detect_llvm_link() -> (&'static str, &'static str) { // Force the link mode we want, preferring static by default, but @@ -307,4 +307,6 @@ fn main() { if target.contains("windows-gnu") { println!("cargo:rustc-link-lib=static:-bundle=pthread"); } + + maybe_static_library("RUSTC_STATIC_CLANG_RT_PATH", "clang_rt"); } diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml index f711174832142..e3ed5e85c4091 100644 --- a/library/std/Cargo.toml +++ b/library/std/Cargo.toml @@ -84,3 +84,6 @@ heap_size = 0x8000000 name = "stdbenches" path = "benches/lib.rs" test = true + +[build-dependencies] +build_helper = { path = "../../src/build_helper" } diff --git a/library/std/build.rs b/library/std/build.rs index 43168e77296ab..d8edd77232e68 100644 --- a/library/std/build.rs +++ b/library/std/build.rs @@ -1,5 +1,7 @@ use std::env; +use build_helper::maybe_static_library; + fn main() { println!("cargo:rerun-if-changed=build.rs"); let target = env::var("TARGET").expect("TARGET was not set"); @@ -47,4 +49,6 @@ fn main() { } println!("cargo:rustc-env=STD_ENV_ARCH={}", env::var("CARGO_CFG_TARGET_ARCH").unwrap()); println!("cargo:rustc-cfg=backtrace_in_libstd"); + + maybe_static_library("RUSTC_STATIC_CLANG_RT_PATH", "clang_rt"); } diff --git a/library/unwind/Cargo.toml b/library/unwind/Cargo.toml index 1941f2b5a0026..310dd2584f204 100644 --- a/library/unwind/Cargo.toml +++ b/library/unwind/Cargo.toml @@ -20,6 +20,7 @@ compiler_builtins = "0.1.0" cfg-if = "0.1.8" [build-dependencies] +build_helper = { path = "../../src/build_helper" } cc = "1.0.69" [features] diff --git a/library/unwind/build.rs b/library/unwind/build.rs index a3f5224151d94..931f7c53ed588 100644 --- a/library/unwind/build.rs +++ b/library/unwind/build.rs @@ -1,9 +1,15 @@ use std::env; +use build_helper::maybe_static_library; + fn main() { println!("cargo:rerun-if-changed=build.rs"); let target = env::var("TARGET").expect("TARGET was not set"); + if maybe_static_library("RUSTC_STATIC_UNWIND_PATH", "unwind") { + return; + } + if target.contains("android") { let build = cc::Build::new(); diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs index b1ec072f3f8aa..adf3489c2c3a2 100644 --- a/src/build_helper/lib.rs +++ b/src/build_helper/lib.rs @@ -203,3 +203,25 @@ fn fail(s: &str) -> ! { println!("\n\n{}\n\n", s); std::process::exit(1); } + +/// if you need for some reason to statically inject some library, like clang_rt +/// here a good place. Anyway, you should use only thin .a file on macOS. +/// You may extract it like: +/// lipo -thin x86_64 -output libclang_rt.a /path/to/llvm/lib/../libclang_rt.osx.a +/// +/// It returns true, when it had injected static library. +pub fn maybe_static_library(env_path_name: &str, library_name: &str) -> bool { + println!("cargo:rerun-if-env-changed={}", env_path_name); + + if let Ok(path) = env::var(env_path_name) { + let target = env::var("TARGET").expect("TARGET was not set"); + println!("cargo:rerun-if-env-changed=TARGET"); + + println!("cargo:rustc-link-search=native={}", path); + println!("cargo:rustc-link-search=native={}/{}", path, target); + println!("cargo:rustc-link-lib=static={}", library_name); + return true; + } + + return false; +}