yuescript_src/
lib.rs

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}