1use std::env;
2use std::fs;
3use std::path::{Path, PathBuf};
4
5pub struct Build {
6 out_dir: Option<PathBuf>,
7 include_dirs: Vec<PathBuf>,
8}
9
10impl Build {
11 pub fn new() -> Build {
12 Build {
13 out_dir: env::var_os("OUT_DIR").map(|s| PathBuf::from(s).join("yuescript-build")),
14 include_dirs: vec![],
15 }
16 }
17
18 pub fn out_dir<P: AsRef<Path>>(&mut self, path: P) -> &mut Build {
19 self.out_dir = Some(path.as_ref().to_path_buf());
20 self
21 }
22
23 pub fn include_dirs(&mut self, include_dirs: Vec<PathBuf>) -> &mut Self {
24 self.include_dirs = include_dirs;
25 self
26 }
27
28 pub fn build(&mut self) {
29 let out_dir = self.out_dir.as_ref().expect("OUT_DIR not set");
30 let lib_dir = out_dir.join("lib");
31 let include_dir = out_dir.join("include");
32
33 let source_dir_base = Path::new(env!("CARGO_MANIFEST_DIR"));
34 let source_dir = source_dir_base.join("yuescript/src");
35
36 if lib_dir.exists() {
37 fs::remove_dir_all(&lib_dir).unwrap();
38 }
39 fs::create_dir_all(&lib_dir).unwrap();
40
41 if include_dir.exists() {
42 fs::remove_dir_all(&include_dir).unwrap();
43 }
44 fs::create_dir_all(&include_dir).unwrap();
45
46 cc::Build::new()
47 .cpp(true)
48 .opt_level(3)
49 .include(source_dir_base.join("yuescript/src"))
50 .includes(&self.include_dirs)
51 .file(source_dir.join("yuescript/ast.cpp"))
52 .file(source_dir.join("yuescript/parser.cpp"))
53 .file(source_dir.join("yuescript/yue_compiler.cpp"))
54 .file(source_dir.join("yuescript/yue_parser.cpp"))
55 .file(source_dir.join("yuescript/yuescript.cpp"))
56 .flag_if_supported("-std=c++17")
57 .out_dir(&lib_dir)
58 .compile("yue");
59
60 for f in &[
61 "yuescript/ast.hpp",
62 "yuescript/parser.hpp",
63 "yuescript/yue_compiler.h",
64 "yuescript/yue_parser.h",
65 "yuescript/yuescript.h",
66 ] {
67 fs::create_dir_all(include_dir.join(f).parent().unwrap()).unwrap();
68 fs::copy(source_dir.join(f), include_dir.join(f)).unwrap();
69 }
70
71 println!("cargo:include={}", include_dir.display());
72 println!("cargo:lib={}", lib_dir.display());
73 println!("cargo:rustc-link-lib=static={}", "yue");
74 }
75}