summaryrefslogtreecommitdiff
path: root/cc/cc-test/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cc/cc-test/build.rs')
-rw-r--r--cc/cc-test/build.rs94
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"));
+}