build.rs (11 lines of code) (raw):
// build.rs
// https://doc.rust-lang.org/cargo/reference/build-scripts.html
const BASE_DIR: &'static str = "./libdie++";
#[allow(dead_code)]
const BUILD_DIR: &'static str = "./libdie++/build";
const INSTALL_DIR: &'static str = "./libdie++/install";
const LIB_DIE_PATH: &'static str = "./libdie++/build/_deps/dielibrary-build/src";
#[cfg(target_os = "windows")]
const MSVC_PATH: &'static str = r"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0";
#[cfg(debug_assertions)]
const BUILD_TYPE: &'static str = "Debug";
#[cfg(not(debug_assertions))]
const BUILD_TYPE: &'static str = "Release";
fn cmake_build_die() {
// CMake configure
{
assert!(std::process::Command::new("cmake")
.current_dir(BASE_DIR)
.args(["-S", "."])
.args(["-B", "build"])
.spawn()
.unwrap()
.wait()
.expect("failed to configure cmake")
.success());
}
// CMake build
{
let nb_cpu = "4";
assert!(std::process::Command::new("cmake")
.args(["--build", "build"])
.args(["-j", nb_cpu])
.args(["--config", BUILD_TYPE])
.current_dir(BASE_DIR)
.spawn()
.unwrap()
.wait()
.expect("failed to build with cmake")
.success());
}
// CMake install
{
assert!(std::process::Command::new("cmake")
.args(["--install", "build"])
.args(["--config", BUILD_TYPE])
.args(["--prefix", "install"])
.current_dir(BASE_DIR)
.spawn()
.unwrap()
.wait()
.expect("failed to install with cmake")
.success());
}
}
fn install_common() {
// die & die++
println!("cargo:rustc-link-lib=static=die++");
println!("cargo:rustc-link-lib=static=die");
// die 3rd party
println!("cargo:rustc-link-lib=static=bzip2");
println!("cargo:rustc-link-lib=static=lzma");
println!("cargo:rustc-link-lib=static=zlib");
println!("cargo:rustc-link-lib=static=capstone_x86");
// qt
println!("cargo:rerun-if-env-changed=QT6_LIB_PATH");
if let Some(qt_lib_path) = option_env!("QT6_LIB_PATH") {
println!("cargo:rustc-link-search=native={}", qt_lib_path);
}
if BUILD_TYPE == "Release" {
println!("cargo:rustc-link-lib=static=Qt6Core");
println!("cargo:rustc-link-lib=static=Qt6Qml");
println!("cargo:rustc-link-lib=static=Qt6Network");
println!("cargo:rustc-link-lib=dylib=Qt6Core");
println!("cargo:rustc-link-lib=dylib=Qt6Qml");
println!("cargo:rustc-link-lib=dylib=Qt6Network");
}
}
#[cfg(target_os = "linux")]
fn install_linux() {
println!("cargo:rustc-link-search=native={}/die", INSTALL_DIR);
println!("cargo:rustc-link-search=native={}/die/lib", INSTALL_DIR);
println!("cargo:rustc-link-lib=dylib=stdc++");
println!("cargo:rustc-link-lib=dylib=Qt6Core");
println!("cargo:rustc-link-lib=dylib=Qt6Qml");
println!("cargo:rustc-link-lib=dylib=Qt6Network");
println!("cargo:rustc-link-search=native=/usr/lib/x86_64-linux-gnu");
println!("cargo:rustc-link-search=native={}/XCapstone", LIB_DIE_PATH);
for _mod in ["bzip2", "lzma", "zlib"].iter() {
println!(
"cargo:rustc-link-search=native={}/XArchive/3rdparty/{}",
LIB_DIE_PATH, _mod
);
}
}
#[cfg(target_os = "macos")]
fn install_macos() {
println!("cargo:rustc-link-search=native={}/die", INSTALL_DIR);
println!("cargo:rustc-link-search=native={}/die/lib", INSTALL_DIR);
println!("cargo:rustc-link-lib=dylib=c++");
if let Some(qt_lib_path) = option_env!("QT6_LIB_PATH") {
println!("cargo:rustc-link-search=framework={}/", qt_lib_path);
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", qt_lib_path);
}
println!("cargo:rustc-link-lib=framework=QtCore");
println!("cargo:rustc-link-lib=framework=QtQml");
println!("cargo:rustc-link-lib=framework=QtNetwork");
println!("cargo:rustc-link-search=native={}/XCapstone", LIB_DIE_PATH);
for _mod in ["bzip2", "lzma", "zlib"].iter() {
println!(
"cargo:rustc-link-search=native={}/XArchive/3rdparty/{}",
LIB_DIE_PATH, _mod
);
}
}
#[cfg(target_os = "windows")]
fn install_windows() {
println!("cargo:rustc-link-search=native={}/die/dielib", INSTALL_DIR);
println!(
"cargo:rustc-link-search=native={}/{}",
BUILD_DIR, BUILD_TYPE
);
println!(
"cargo:rustc-link-search=native={}/_deps/dielibrary-build/src/dielib/{}",
BUILD_DIR, BUILD_TYPE
);
for _mod in ["bzip2", "lzma", "zlib"].iter() {
println!(
"cargo:rustc-link-search=native={}/XArchive/3rdparty/{}/{}",
LIB_DIE_PATH, _mod, BUILD_TYPE
);
}
println!(
"cargo:rustc-link-search=native={}/XCapstone/{}",
LIB_DIE_PATH, BUILD_TYPE
);
println!("cargo:rustc-link-lib=dylib=Crypt32");
println!("cargo:rustc-link-lib=dylib=Wintrust");
if BUILD_TYPE == "Debug" {
println!("cargo:rustc-link-lib=static=Qt6Cored");
println!("cargo:rustc-link-lib=static=Qt6Qmld");
println!("cargo:rustc-link-lib=static=Qt6Networkd");
println!("cargo:rustc-link-lib=dylib=Qt6Cored");
println!("cargo:rustc-link-lib=dylib=Qt6Qmld");
println!("cargo:rustc-link-lib=dylib=Qt6Networkd");
println!("cargo:rustc-link-search=native={}/ucrt/x64", MSVC_PATH);
println!("cargo:rustc-link-lib=static=ucrtd");
}
}
fn main() {
cmake_build_die();
install_common();
if cfg!(target_os = "linux") {
#[cfg(target_os = "linux")]
install_linux();
} else if cfg!(target_os = "macos") {
#[cfg(target_os = "macos")]
install_macos();
} else if cfg!(target_os = "windows") {
#[cfg(target_os = "windows")]
install_windows();
} else {
unimplemented!();
}
println!("cargo:rerun-if-changed=src/lib.rs");
}