-
Notifications
You must be signed in to change notification settings - Fork 7
/
build-vendor.rs
127 lines (112 loc) · 3.44 KB
/
build-vendor.rs
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use cmake::Config;
use copy_dir::copy_dir;
use std::{
env,
path::{Path, PathBuf},
process::Command,
};
pub struct Build {
source_dir: PathBuf,
out_dir: PathBuf,
}
pub struct Artifacts {
include_dir: PathBuf,
lib_dir: PathBuf,
lib: String,
}
impl Build {
pub fn new() -> Build {
Build {
source_dir: Path::new(env!("CARGO_MANIFEST_DIR")).join("boolector"),
out_dir: PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR not set"))
.join("vendor-build"),
}
}
pub fn prerequisites(&mut self) -> &mut Self {
// it is not allowed to modify files outside of OUT_DIR,
// so everything has to be copied to OUT_DIR before the build can be started
if !self.out_dir.exists() {
copy_dir(&self.source_dir, &self.out_dir)
.expect("Unable to copy Boolector sources to OUT_DIR");
}
if !self.out_dir.join("deps/install/lib/liblgl.a").exists() {
self.run_command(
Command::new("/usr/bin/env")
.arg("bash")
.arg(self.out_dir.join("contrib/setup-lingeling.sh"))
.current_dir(&self.out_dir),
"Setup Lingeling",
);
}
println!(
"cargo:rustc-link-search=native={}",
self.out_dir.join("deps/install/lib").display()
);
println!("cargo:rustc-link-lib=static=lgl");
println!(
"cargo:include={}",
self.out_dir.join("deps/install/include").display()
);
println!(
"cargo:lib={}",
self.out_dir.join("deps/install/lib").display()
);
if !self
.out_dir
.join("deps/install/lib/libbtor2parser.a")
.exists()
{
self.run_command(
Command::new("/usr/bin/env")
.arg("bash")
.arg(self.out_dir.join("contrib/setup-btor2tools.sh"))
.current_dir(&self.out_dir),
"Setup btor2tools",
);
}
self
}
pub fn build(&mut self) -> Artifacts {
// TODO: Unfortunately BUILDDIR is not overwriteable either implement
// whole `Configure.sh` or find out how to overwrite `$BUILDDIR`
let target_dir = Config::new(&self.out_dir)
.profile("Release")
.build();
Artifacts {
lib_dir: target_dir.join("lib"),
include_dir: target_dir.join("include"),
lib: "boolector".to_string(),
}
}
fn run_command(&self, command: &mut Command, desc: &str) {
println!("running {:?}", command);
let status = command.status().unwrap();
if !status.success() {
panic!(
"
Error {}:
Command: {:?}
Exit status: {}
",
desc, command, status
);
}
}
}
impl Artifacts {
pub fn include_dir(&self) -> &Path {
&self.include_dir
}
pub fn lib_dir(&self) -> &Path {
&self.lib_dir
}
pub fn lib(&self) -> &String {
&self.lib
}
pub fn print_cargo_metadata(&self) {
println!("cargo:rustc-link-search=native={}", self.lib_dir.display());
println!("cargo:rustc-link-lib=static={}", self.lib);
println!("cargo:include={}", self.include_dir.display());
println!("cargo:lib={}", self.lib_dir.display());
}
}