use std::env;
use std::fs;
use std::path::PathBuf;
fn generate_config_cmake() {
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR not set"));
let cmake_build_dir = out_dir.join("build");
let _ = fs::create_dir_all(&cmake_build_dir);
let path = cmake_build_dir.join("config.cmake");
let contents = "set(XGRAMMAR_BUILD_PYTHON_BINDINGS OFF CACHE BOOL \"\" FORCE)\n";
fs::write(&path, contents).expect("write config.cmake failed");
}
fn main() {
generate_config_cmake();
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").expect("CARGO_CFG_TARGET_ARCH is not set");
let cxx_flags = if target_arch == "x86_64" {
"-Wno-deprecated-declarations"
} else {
"-Wno-deprecated-declarations -fno-lto"
};
let xgrammar = cmake::Config::new("thirdparty/xgrammar")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("CMAKE_CXX_FLAGS", cxx_flags)
.build_target("xgrammar")
.build();
println!("cargo:rustc-link-search=native={}/build", xgrammar.display());
println!("cargo:rustc-link-lib=static=xgrammar");
let mut config = cpp_build::Config::new();
config
.include("thirdparty/xgrammar/include/")
.include("thirdparty/xgrammar/3rdparty/dlpack/include/")
.include("thirdparty/xgrammar/3rdparty/picojson/")
.flag("-std=c++17");
config.build("src/lib.rs");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=thirdparty/xgrammar/include/xgrammar/");
println!("cargo:rerun-if-changed=thirdparty/xgrammar/3rdparty/dlpack/include/dlpack/");
println!("cargo:rerun-if-changed=thirdparty/xgrammar/3rdparty/picojson/");
}