bootstrap: Add directives to not double-link libs
Have all Cargo-built crates pass `--cfg cargobuild` and then add appropriate `#[cfg]` definitions to all crates to avoid linking anything if this is passed. This should help allow libstd to compile with both the makefiles and with Cargo.
This commit is contained in:
parent
4da4970767
commit
eac0a8bc30
15 changed files with 38 additions and 5 deletions
|
@ -17,6 +17,8 @@ use std::process::Command;
|
|||
use build_helper::run;
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rustc-cfg=cargobuild");
|
||||
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let host = env::var("HOST").unwrap();
|
||||
let build_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||
|
|
|
@ -38,7 +38,10 @@ use libc::{c_int, c_void, size_t};
|
|||
not(target_os = "android"),
|
||||
not(target_env = "musl")),
|
||||
link(name = "pthread"))]
|
||||
extern "C" {
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
fn je_mallocx(size: size_t, flags: c_int) -> *mut c_void;
|
||||
fn je_rallocx(ptr: *mut c_void, size: size_t, flags: c_int) -> *mut c_void;
|
||||
fn je_xallocx(ptr: *mut c_void, size: size_t, extra: size_t, flags: c_int) -> size_t;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
extern crate gcc;
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rustc-cfg=cargobuild");
|
||||
gcc::Config::new()
|
||||
.file("../rt/miniz.c")
|
||||
.compile("libminiz.a");
|
||||
|
|
|
@ -79,7 +79,10 @@ impl Drop for Bytes {
|
|||
}
|
||||
|
||||
#[link(name = "miniz", kind = "static")]
|
||||
extern "C" {
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
/// Raw miniz compression function.
|
||||
fn tdefl_compress_mem_to_heap(psrc_buf: *const c_void,
|
||||
src_buf_len: size_t,
|
||||
|
|
|
@ -18,6 +18,8 @@ use std::path::PathBuf;
|
|||
use build_helper::output;
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rustc-cfg=cargobuild");
|
||||
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let llvm_config = env::var_os("LLVM_CONFIG").map(PathBuf::from)
|
||||
.unwrap_or_else(|| {
|
||||
|
|
|
@ -609,6 +609,9 @@ pub mod debuginfo {
|
|||
// automatically updated whenever LLVM is updated to include an up-to-date
|
||||
// set of the libraries we need to link to LLVM for.
|
||||
#[link(name = "rustllvm", kind = "static")]
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
#[linked_from = "rustllvm"] // not quite true but good enough
|
||||
extern {
|
||||
/* Create and destroy contexts. */
|
||||
|
@ -2486,6 +2489,7 @@ impl Drop for OperandBundleDef {
|
|||
// parts of LLVM that rustllvm depends on aren't thrown away by the linker.
|
||||
// Works to the above fix for #15460 to ensure LLVM dependencies that
|
||||
// are only used by rustllvm don't get stripped by the linker.
|
||||
#[cfg(not(cargobuild))]
|
||||
mod llvmdeps {
|
||||
include! { env!("CFG_LLVM_LINKAGE_FILE") }
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
extern crate gcc;
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rustc-cfg=cargobuild");
|
||||
let mut cfg = gcc::Config::new();
|
||||
cfg.file("../rt/hoedown/src/autolink.c")
|
||||
.file("../rt/hoedown/src/buffer.c")
|
||||
|
|
|
@ -157,6 +157,9 @@ struct hoedown_buffer {
|
|||
|
||||
// hoedown FFI
|
||||
#[link(name = "hoedown", kind = "static")]
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
fn hoedown_html_renderer_new(render_flags: libc::c_uint,
|
||||
nesting_level: libc::c_int)
|
||||
|
|
|
@ -19,6 +19,8 @@ use std::process::Command;
|
|||
use build_helper::run;
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rustc-cfg=cargobuild");
|
||||
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let host = env::var("HOST").unwrap();
|
||||
if !target.contains("apple") && !target.contains("msvc") {
|
||||
|
|
|
@ -269,7 +269,10 @@ mod imp {
|
|||
const kSecRandomDefault: *const SecRandom = ptr::null();
|
||||
|
||||
#[link(name = "Security", kind = "framework")]
|
||||
extern "C" {
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
fn SecRandomCopyBytes(rnd: *const SecRandom,
|
||||
count: size_t, bytes: *mut u8) -> c_int;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
//! the standard library This varies per-platform, but these libraries are
|
||||
//! necessary for running libstd.
|
||||
|
||||
#![cfg(not(cargobuild))]
|
||||
|
||||
// LLVM implements the `frem` instruction as a call to `fmod`, which lives in
|
||||
// libm. Hence, we must explicitly link to it.
|
||||
//
|
||||
|
|
|
@ -40,7 +40,7 @@ pub fn print(w: &mut Write, idx: isize, addr: *mut libc::c_void,
|
|||
errnum: libc::c_int);
|
||||
enum backtrace_state {}
|
||||
#[link(name = "backtrace", kind = "static")]
|
||||
#[cfg(not(test))]
|
||||
#[cfg(all(not(test), not(cargobuild)))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
|
|
|
@ -252,6 +252,9 @@ pub mod eh_frame_registry {
|
|||
// See also: rtbegin.rs, `unwind` module.
|
||||
|
||||
#[link(name = "gcc_eh")]
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern {
|
||||
fn __register_frame_info(eh_frame_begin: *const u8, object: *mut u8);
|
||||
fn __deregister_frame_info(eh_frame_begin: *const u8, object: *mut u8);
|
||||
|
|
|
@ -339,7 +339,6 @@ pub fn args() -> Args {
|
|||
pub fn args() -> Args {
|
||||
use mem;
|
||||
|
||||
#[link(name = "objc")]
|
||||
extern {
|
||||
fn sel_registerName(name: *const libc::c_uchar) -> Sel;
|
||||
fn objc_msgSend(obj: NsId, sel: Sel, ...) -> NsId;
|
||||
|
@ -347,6 +346,8 @@ pub fn args() -> Args {
|
|||
}
|
||||
|
||||
#[link(name = "Foundation", kind = "framework")]
|
||||
#[link(name = "objc")]
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
type Sel = *const libc::c_void;
|
||||
|
|
|
@ -966,6 +966,9 @@ pub enum EXCEPTION_DISPOSITION {
|
|||
#[link(name = "userenv")]
|
||||
#[link(name = "shell32")]
|
||||
#[link(name = "advapi32")]
|
||||
#[cfg(not(cargobuild))]
|
||||
extern {}
|
||||
|
||||
extern "system" {
|
||||
pub fn WSAStartup(wVersionRequested: WORD,
|
||||
lpWSAData: LPWSADATA) -> c_int;
|
||||
|
|
Loading…
Add table
Reference in a new issue