blob: 306586189788e2c2d6cef8237bd23b73e56faff8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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"));
}
|