blob: f7994418d0c80d2c137835ab68774c2315f7421f [file] [log] [blame]
David Tolnayee907be2020-10-07 17:38:59 -07001use std::env;
2use std::path::Path;
David Tolnay1d0266a2020-11-11 12:00:20 -08003use std::process::Command;
David Tolnayee907be2020-10-07 17:38:59 -07004
David Tolnay7db73692019-10-20 14:51:12 -04005fn main() {
6 cc::Build::new()
David Tolnay736cbca2020-03-11 16:49:18 -07007 .file("src/cxx.cc")
Christopher Chalmersd24563d2020-05-08 19:23:46 +01008 .cpp(true)
David Tolnay110df7d2020-05-08 13:06:04 -07009 .cpp_link_stdlib(None) // linked via link-cplusplus crate
David Tolnayde1cb772020-08-28 17:25:29 -070010 .flag_if_supported(cxxbridge_flags::STD)
David Tolnay970ed992021-01-02 15:54:24 -080011 .warnings_into_errors(cfg!(deny_warnings))
David Tolnay0f0162f2020-11-16 23:43:37 -080012 .compile("cxxbridge1");
David Tolnay1d0266a2020-11-11 12:00:20 -080013
David Tolnay736cbca2020-03-11 16:49:18 -070014 println!("cargo:rerun-if-changed=src/cxx.cc");
15 println!("cargo:rerun-if-changed=include/cxx.h");
David Tolnay585a9fe2020-08-30 21:03:38 -070016 println!("cargo:rustc-cfg=built_with_cargo");
David Tolnay1d0266a2020-11-11 12:00:20 -080017
David Tolnayee907be2020-10-07 17:38:59 -070018 if let Some(manifest_dir) = env::var_os("CARGO_MANIFEST_DIR") {
19 let cxx_h = Path::new(&manifest_dir).join("include").join("cxx.h");
20 println!("cargo:HEADER={}", cxx_h.to_string_lossy());
21 }
David Tolnay1d0266a2020-11-11 12:00:20 -080022
23 if let Some(rustc) = rustc_version() {
David Tolnaybc413be2020-11-11 12:13:49 -080024 if rustc.minor < 48 {
25 println!("cargo:warning=The cxx crate requires a rustc version 1.48.0 or newer.");
David Tolnay1d0266a2020-11-11 12:00:20 -080026 println!(
27 "cargo:warning=You appear to be building with: {}",
28 rustc.version,
29 );
30 }
31 }
32}
33
34struct RustVersion {
35 version: String,
36 minor: u32,
37}
38
39fn rustc_version() -> Option<RustVersion> {
40 let rustc = env::var_os("RUSTC")?;
41 let output = Command::new(rustc).arg("--version").output().ok()?;
42 let version = String::from_utf8(output.stdout).ok()?;
43 let mut pieces = version.split('.');
44 if pieces.next() != Some("rustc 1") {
45 return None;
46 }
47 let minor = pieces.next()?.parse().ok()?;
48 Some(RustVersion { version, minor })
David Tolnay7db73692019-10-20 14:51:12 -040049}