diff options
Diffstat (limited to 'cc/cc-test/build.rs')
-rw-r--r-- | cc/cc-test/build.rs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/cc/cc-test/build.rs b/cc/cc-test/build.rs new file mode 100644 index 0000000..5a7b178 --- /dev/null +++ b/cc/cc-test/build.rs @@ -0,0 +1,94 @@ +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")); +} |