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.
308 lines
6.5 KiB
308 lines
6.5 KiB
extern crate cc;
|
|
extern crate tempdir;
|
|
|
|
use support::Test;
|
|
|
|
mod support;
|
|
|
|
#[test]
|
|
fn gnu_smoke() {
|
|
let test = Test::gnu();
|
|
test.gcc().file("foo.c").compile("foo");
|
|
|
|
test.cmd(0)
|
|
.must_have("-O2")
|
|
.must_have("foo.c")
|
|
.must_not_have("-g")
|
|
.must_have("-c")
|
|
.must_have("-ffunction-sections")
|
|
.must_have("-fdata-sections");
|
|
test.cmd(1).must_have(test.td.path().join("foo.o"));
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_opt_level_1() {
|
|
let test = Test::gnu();
|
|
test.gcc().opt_level(1).file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_have("-O1").must_not_have("-O2");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_opt_level_s() {
|
|
let test = Test::gnu();
|
|
test.gcc().opt_level_str("s").file("foo.c").compile("foo");
|
|
|
|
test.cmd(0)
|
|
.must_have("-Os")
|
|
.must_not_have("-O1")
|
|
.must_not_have("-O2")
|
|
.must_not_have("-O3")
|
|
.must_not_have("-Oz");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_debug() {
|
|
let test = Test::gnu();
|
|
test.gcc().debug(true).file("foo.c").compile("foo");
|
|
test.cmd(0).must_have("-g");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_warnings_into_errors() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.warnings_into_errors(true)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-Werror");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_warnings() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.warnings(true)
|
|
.flag("-Wno-missing-field-initializers")
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-Wall").must_have("-Wextra");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_warnings_overridable() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.warnings(true)
|
|
.flag("-Wno-missing-field-initializers")
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0)
|
|
.must_have_in_order("-Wall", "-Wno-missing-field-initializers");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_x86_64() {
|
|
for vendor in &["unknown-linux-gnu", "apple-darwin"] {
|
|
let target = format!("x86_64-{}", vendor);
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.target(&target)
|
|
.host(&target)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-fPIC").must_have("-m64");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_x86_64_no_pic() {
|
|
for vendor in &["unknown-linux-gnu", "apple-darwin"] {
|
|
let target = format!("x86_64-{}", vendor);
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.pic(false)
|
|
.target(&target)
|
|
.host(&target)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_not_have("-fPIC");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_i686() {
|
|
for vendor in &["unknown-linux-gnu", "apple-darwin"] {
|
|
let target = format!("i686-{}", vendor);
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.target(&target)
|
|
.host(&target)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-m32");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_i686_pic() {
|
|
for vendor in &["unknown-linux-gnu", "apple-darwin"] {
|
|
let target = format!("i686-{}", vendor);
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.pic(true)
|
|
.target(&target)
|
|
.host(&target)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-fPIC");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_set_stdlib() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.cpp_set_stdlib(Some("foo"))
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_not_have("-stdlib=foo");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_include() {
|
|
let test = Test::gnu();
|
|
test.gcc().include("foo/bar").file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_have("-I").must_have("foo/bar");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_define() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.define("FOO", "bar")
|
|
.define("BAR", None)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-DFOO=bar").must_have("-DBAR");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_compile_assembly() {
|
|
let test = Test::gnu();
|
|
test.gcc().file("foo.S").compile("foo");
|
|
test.cmd(0).must_have("foo.S");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_shared() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.file("foo.c")
|
|
.shared_flag(true)
|
|
.static_flag(false)
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-shared").must_not_have("-static");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_flag_if_supported() {
|
|
if cfg!(windows) {
|
|
return;
|
|
}
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.file("foo.c")
|
|
.flag_if_supported("-Wall")
|
|
.flag_if_supported("-Wflag-does-not-exist")
|
|
.flag_if_supported("-std=c++11")
|
|
.compile("foo");
|
|
|
|
test.cmd(0)
|
|
.must_have("-Wall")
|
|
.must_not_have("-Wflag-does-not-exist")
|
|
.must_not_have("-std=c++11");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_flag_if_supported_cpp() {
|
|
if cfg!(windows) {
|
|
return;
|
|
}
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.cpp(true)
|
|
.file("foo.cpp")
|
|
.flag_if_supported("-std=c++11")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-std=c++11");
|
|
}
|
|
|
|
#[test]
|
|
fn gnu_static() {
|
|
let test = Test::gnu();
|
|
test.gcc()
|
|
.file("foo.c")
|
|
.shared_flag(false)
|
|
.static_flag(true)
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("-static").must_not_have("-shared");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_smoke() {
|
|
let test = Test::msvc();
|
|
test.gcc().file("foo.c").compile("foo");
|
|
|
|
test.cmd(0)
|
|
.must_have("/O2")
|
|
.must_have("foo.c")
|
|
.must_not_have("/Z7")
|
|
.must_have("/c")
|
|
.must_have("/MD");
|
|
test.cmd(1).must_have(test.td.path().join("foo.o"));
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_opt_level_0() {
|
|
let test = Test::msvc();
|
|
test.gcc().opt_level(0).file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_not_have("/O2");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_debug() {
|
|
let test = Test::msvc();
|
|
test.gcc().debug(true).file("foo.c").compile("foo");
|
|
test.cmd(0).must_have("/Z7");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_include() {
|
|
let test = Test::msvc();
|
|
test.gcc().include("foo/bar").file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_have("/I").must_have("foo/bar");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_define() {
|
|
let test = Test::msvc();
|
|
test.gcc()
|
|
.define("FOO", "bar")
|
|
.define("BAR", None)
|
|
.file("foo.c")
|
|
.compile("foo");
|
|
|
|
test.cmd(0).must_have("/DFOO=bar").must_have("/DBAR");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_static_crt() {
|
|
let test = Test::msvc();
|
|
test.gcc().static_crt(true).file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_have("/MT");
|
|
}
|
|
|
|
#[test]
|
|
fn msvc_no_static_crt() {
|
|
let test = Test::msvc();
|
|
test.gcc().static_crt(false).file("foo.c").compile("foo");
|
|
|
|
test.cmd(0).must_have("/MD");
|
|
}
|
|
|