You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.9 KiB
54 lines
1.9 KiB
3 years ago
|
#[cfg(feature = "build_keystone_cmake")]
|
||
|
extern crate cmake;
|
||
|
#[cfg(feature = "use_system_keystone")]
|
||
|
extern crate pkg_config;
|
||
|
|
||
|
#[cfg(all(not(windows), feature = "build_keystone_cmake"))]
|
||
|
use std::os::unix::fs::symlink;
|
||
|
#[cfg(all(windows, feature = "build_keystone_cmake"))]
|
||
|
use std::os::windows::fs::symlink_dir as symlink;
|
||
|
|
||
|
#[cfg(feature = "build_keystone_cmake")]
|
||
|
use std::path::Path;
|
||
|
|
||
|
#[cfg(feature = "build_keystone_cmake")]
|
||
|
fn build_with_cmake() {
|
||
|
if !Path::new("keystone").exists() {
|
||
|
// This only happens when using the crate via a `git` reference as the
|
||
|
// published version already embeds keystone's source.
|
||
|
let pwd = std::env::current_dir().unwrap();
|
||
|
let keystone_dir = pwd.ancestors().skip(3).next().unwrap();
|
||
|
symlink(keystone_dir, "keystone").expect("failed to symlink keystone");
|
||
|
}
|
||
|
|
||
|
let dest = cmake::Config::new("keystone")
|
||
|
.define("BUILD_LIBS_ONLY", "1")
|
||
|
.define("BUILD_SHARED_LIBS", "OFF")
|
||
|
.define("LLVM_TARGETS_TO_BUILD", "all")
|
||
|
// Prevent python from leaving behind `.pyc` files which break `cargo package`
|
||
|
.env("PYTHONDONTWRITEBYTECODE", "1")
|
||
|
.build();
|
||
|
|
||
|
println!("cargo:rustc-link-search=native={}/lib", dest.display());
|
||
|
println!("cargo:rustc-link-lib=keystone");
|
||
|
|
||
|
let target = std::env::var("TARGET").unwrap();
|
||
|
if target.contains("apple") {
|
||
|
println!("cargo:rustc-link-lib=dylib=c++");
|
||
|
} else if target.contains("linux") {
|
||
|
println!("cargo:rustc-link-lib=dylib=stdc++");
|
||
|
} else if target.contains("windows") {
|
||
|
println!("cargo:rustc-link-lib=dylib=shell32");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
if cfg!(feature = "use_system_keystone") {
|
||
|
#[cfg(feature = "use_system_keystone")]
|
||
|
pkg_config::find_library("keystone").expect("Could not find system keystone");
|
||
|
} else {
|
||
|
#[cfg(feature = "build_keystone_cmake")]
|
||
|
build_with_cmake();
|
||
|
}
|
||
|
}
|