summaryrefslogtreecommitdiff
path: root/gcc/gcc-test/build.rs
blob: f81833b124c98c2d77368af7fcfb444340083b83 (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
89
90
extern crate gcc;

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();

    gcc::Config::new()
        .file("src/foo.c")
        .define("FOO", None)
        .define("BAR", Some("1"))
        .compile("libfoo.a");

    gcc::Config::new()
        .file("src/bar1.c")
        .file("src/bar2.c")
        .include("src/include")
        .compile("libbar.a");

    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" });
    gcc::Config::new()
        .file(file)
        .compile("libasm.a");

    gcc::Config::new()
        .file("src/baz.cpp")
        .cpp(true)
        .compile("libbaz.a");

    if target.contains("windows") {
        gcc::Config::new()
            .file("src/windows.c")
            .compile("libwindows.a");
    }

    // 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 = gcc::windows_registry::find(&target, "nmake.exe")
            .unwrap()
            .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 = gcc::windows_registry::find(&target, "nmake.exe")
            .unwrap()
            .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.
    gcc::Config::new()
        .cargo_metadata(false)
        .file("src/opt_linkage.c")
        .compile("libOptLinkage.a");

    let out = gcc::Config::new()
        .file("src/expand.c")
        .expand();
    let out = String::from_utf8(out).unwrap();
    assert!(out.contains("hello world"));
}