use std::{
env, fs,
io::Write,
path::Path,
process::{Command, Stdio},
};
fn main() {
let out_dir = env::var("OUT_DIR").expect("No OUT_DIR env var is set by cargo");
let out_dir = Path::new(&out_dir);
let src_dir = out_dir.join("quickjs");
if !src_dir.exists() {
let mut cmd = Command::new("git");
cmd.args([
"clone",
"https://github.com/quickjs-ng/quickjs.git",
&src_dir.to_string_lossy(),
]);
cmd.output().unwrap();
}
let header_files = [
"libbf.h",
"libregexp-opcode.h",
"libregexp.h",
"libunicode-table.h",
"libunicode.h",
"list.h",
"quickjs-atom.h",
"quickjs-libc.h",
"quickjs-opcode.h",
"quickjs.h",
"cutils.h",
];
let source_files = [
"libregexp.c",
"libunicode.c",
"cutils.c",
"quickjs-libc.c",
"quickjs.c",
"libbf.c",
];
let mut defines = vec![
("_GNU_SOURCE", None),
("CONFIG_VERSION", Some("\"2020-01-19\"")),
("CONFIG_BIGNUM", None),
];
for file in source_files.iter().chain(header_files.iter()) {
fs::copy(src_dir.join(file), out_dir.join(file)).expect("Unable to copy source");
}
let mut builder = cc::Build::new();
builder
.extra_warnings(false)
.flag("-Wno-array-bounds")
.flag("-Wno-format-truncation");
for (name, value) in &defines {
builder.define(name, *value);
}
for src in &source_files {
builder.file(out_dir.join(src));
}
builder.compile("libquickjs.a");
}