By default try to find global installed unicorn if not specified
This commit is contained in:
11
Cargo.toml
11
Cargo.toml
@@ -34,11 +34,10 @@ bitflags = "1.3"
|
||||
libc = "0.2"
|
||||
|
||||
[build-dependencies]
|
||||
cc = { optional = true, version = "1.0" }
|
||||
cmake = { optional = true, version = "0.1" }
|
||||
pkg-config = { optional = true, version = "0.3" }
|
||||
cc = { version = "1.0" }
|
||||
cmake = { version = "0.1" }
|
||||
pkg-config = { version = "0.3" }
|
||||
|
||||
[features]
|
||||
default = ["build_unicorn_cmake"]
|
||||
build_unicorn_cmake = ["cc", "cmake"]
|
||||
use_system_unicorn = ["pkg-config"]
|
||||
default = []
|
||||
build_unicorn_cmake = []
|
||||
|
||||
@@ -1,23 +1,16 @@
|
||||
#[cfg(feature = "use_system_unicorn")]
|
||||
use pkg_config;
|
||||
#[cfg(feature = "build_unicorn_cmake")]
|
||||
use std::env;
|
||||
#[cfg(feature = "build_unicorn_cmake")]
|
||||
use std::path::PathBuf;
|
||||
#[cfg(feature = "build_unicorn_cmake")]
|
||||
use std::process::Command;
|
||||
|
||||
#[cfg(all(feature = "build_unicorn_cmake"))]
|
||||
fn ninja_available() -> bool {
|
||||
Command::new("ninja").arg("--version").spawn().is_ok()
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "build_unicorn_cmake"))]
|
||||
fn msvc_cmake_tools_available() -> bool {
|
||||
Command::new("cmake").arg("--version").spawn().is_ok() && ninja_available()
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "build_unicorn_cmake"))]
|
||||
fn setup_env_msvc(compiler: &cc::Tool) {
|
||||
// If PATH already contains what we need, skip this
|
||||
if msvc_cmake_tools_available() {
|
||||
@@ -27,20 +20,24 @@ fn setup_env_msvc(compiler: &cc::Tool) {
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let devenv = cc::windows_registry::find_tool(target.as_str(), "devenv");
|
||||
let tool_root: PathBuf = match devenv {
|
||||
Some(devenv_tool) => {
|
||||
devenv_tool.path().parent().unwrap().to_path_buf()
|
||||
},
|
||||
Some(devenv_tool) => devenv_tool.path().parent().unwrap().to_path_buf(),
|
||||
None => {
|
||||
// if devenv (i.e. Visual Studio) was not found, assume compiler is
|
||||
// from standalone Build Tools and look there instead.
|
||||
// this should be done properly in cc crate, but for now it's not.
|
||||
let tools_name = std::ffi::OsStr::new("BuildTools");
|
||||
let compiler_path = compiler.path().to_path_buf();
|
||||
compiler_path.iter().find(|x| *x == tools_name)
|
||||
compiler_path
|
||||
.iter()
|
||||
.find(|x| *x == tools_name)
|
||||
.expect("Failed to find devenv or Build Tools");
|
||||
compiler_path.iter().take_while(|x| *x != tools_name)
|
||||
.collect::<PathBuf>().join(tools_name).join(r"Common7\IDE")
|
||||
},
|
||||
compiler_path
|
||||
.iter()
|
||||
.take_while(|x| *x != tools_name)
|
||||
.collect::<PathBuf>()
|
||||
.join(tools_name)
|
||||
.join(r"Common7\IDE")
|
||||
}
|
||||
};
|
||||
let cmake_pkg_dir = tool_root.join(r"CommonExtensions\Microsoft\CMake");
|
||||
let cmake_path = cmake_pkg_dir.join(r"CMake\bin\cmake.exe");
|
||||
@@ -63,7 +60,6 @@ fn setup_env_msvc(compiler: &cc::Tool) {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "build_unicorn_cmake")]
|
||||
fn build_with_cmake() {
|
||||
let uc_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||
let compiler = cc::Build::new().get_compiler();
|
||||
@@ -92,11 +88,16 @@ fn build_with_cmake() {
|
||||
// unicorn's CMakeLists.txt doesn't properly support 'install', so we use
|
||||
// the build artifacts from the build directory, which cmake crate sets
|
||||
// to "<out_dir>/build/"
|
||||
let dst = config.define("BUILD_SHARED_LIBS", "OFF")
|
||||
let dst = config
|
||||
.define("BUILD_SHARED_LIBS", "OFF")
|
||||
.define("UNICORN_BUILD_TESTS", "OFF")
|
||||
.define("UNICORN_INSTALL", "OFF")
|
||||
.no_build_target(true).build();
|
||||
println!("cargo:rustc-link-search=native={}", dst.join("build").display());
|
||||
.no_build_target(true)
|
||||
.build();
|
||||
println!(
|
||||
"cargo:rustc-link-search=native={}",
|
||||
dst.join("build").display()
|
||||
);
|
||||
|
||||
// Lazymio(@wtdcode): Why do I stick to static link? See: https://github.com/rust-lang/cargo/issues/5077
|
||||
println!("cargo:rustc-link-lib=static=unicorn");
|
||||
@@ -107,14 +108,15 @@ fn build_with_cmake() {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
if cfg!(feature = "use_system_unicorn") {
|
||||
#[cfg(feature = "use_system_unicorn")]
|
||||
pkg_config::Config::new()
|
||||
if cfg!(feature = "build_unicorn_cmake") {
|
||||
build_with_cmake();
|
||||
} else {
|
||||
if !pkg_config::Config::new()
|
||||
.atleast_version("2")
|
||||
.probe("unicorn")
|
||||
.expect("Could not find system unicorn2");
|
||||
} else {
|
||||
#[cfg(feature = "build_unicorn_cmake")]
|
||||
.is_ok()
|
||||
{
|
||||
build_with_cmake();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user