mirror of https://github.com/lukechilds/cc-rs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.7 KiB
90 lines
2.7 KiB
extern crate cc;
|
|
|
|
use std::env;
|
|
use std::fs;
|
|
use std::path::PathBuf;
|
|
|
|
fn main() {
|
|
let out = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
|
fs::remove_dir_all(&out).unwrap();
|
|
fs::create_dir(&out).unwrap();
|
|
|
|
cc::Build::new()
|
|
.file("src/foo.c")
|
|
.flag_if_supported("-Wall")
|
|
.flag_if_supported("-Wfoo-bar-this-flag-does-not-exist")
|
|
.define("FOO", None)
|
|
.define("BAR", "1")
|
|
.compile("foo");
|
|
|
|
cc::Build::new()
|
|
.file("src/bar1.c")
|
|
.file("src/bar2.c")
|
|
.include("src/include")
|
|
.compile("bar");
|
|
|
|
let target = std::env::var("TARGET").unwrap();
|
|
let file = target.split("-").next().unwrap();
|
|
let file = format!(
|
|
"src/{}.{}",
|
|
file,
|
|
if target.contains("msvc") { "asm" } else { "S" }
|
|
);
|
|
cc::Build::new().file(file).compile("asm");
|
|
|
|
cc::Build::new()
|
|
.file("src/baz.cpp")
|
|
.cpp(true)
|
|
.compile("baz");
|
|
|
|
if target.contains("windows") {
|
|
cc::Build::new().file("src/windows.c").compile("windows");
|
|
}
|
|
|
|
// Test that the `windows_registry` module will set PATH by looking for
|
|
// nmake which runs vanilla cl, and then also test it after we remove all
|
|
// the relevant env vars from our own process.
|
|
if target.contains("msvc") {
|
|
let out = out.join("tmp");
|
|
fs::create_dir(&out).unwrap();
|
|
println!("nmake 1");
|
|
let status = cc::windows_registry::find(&target, "nmake.exe")
|
|
.unwrap()
|
|
.env_remove("MAKEFLAGS")
|
|
.arg("/fsrc/NMakefile")
|
|
.env("OUT_DIR", &out)
|
|
.status()
|
|
.unwrap();
|
|
assert!(status.success());
|
|
|
|
fs::remove_dir_all(&out).unwrap();
|
|
fs::create_dir(&out).unwrap();
|
|
|
|
env::remove_var("PATH");
|
|
env::remove_var("VCINSTALLDIR");
|
|
env::remove_var("INCLUDE");
|
|
env::remove_var("LIB");
|
|
println!("nmake 2");
|
|
let status = cc::windows_registry::find(&target, "nmake.exe")
|
|
.unwrap()
|
|
.env_remove("MAKEFLAGS")
|
|
.arg("/fsrc/NMakefile")
|
|
.env("OUT_DIR", &out)
|
|
.status()
|
|
.unwrap();
|
|
assert!(status.success());
|
|
println!("cargo:rustc-link-lib=msvc");
|
|
println!("cargo:rustc-link-search={}", out.display());
|
|
}
|
|
|
|
// This tests whether we can build a library but not link it to the main
|
|
// crate. The test module will do its own linking.
|
|
cc::Build::new()
|
|
.cargo_metadata(false)
|
|
.file("src/opt_linkage.c")
|
|
.compile("OptLinkage");
|
|
|
|
let out = cc::Build::new().file("src/expand.c").expand();
|
|
let out = String::from_utf8(out).unwrap();
|
|
assert!(out.contains("hello world"));
|
|
}
|
|
|