From f4ab42d930f10359320b3a1db61f10b64fe85608 Mon Sep 17 00:00:00 2001 From: lazymio Date: Sat, 23 Apr 2022 22:41:34 +0200 Subject: [PATCH] By default try to find global installed unicorn if not specified --- Cargo.toml | 11 ++++----- bindings/rust/build.rs | 52 ++++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b48ac46b..6b2d64a4 100644 --- a/Cargo.toml +++ b/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 = [] diff --git a/bindings/rust/build.rs b/bindings/rust/build.rs index 6edc1524..180b4eb3 100644 --- a/bindings/rust/build.rs +++ b/bindings/rust/build.rs @@ -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::().join(tools_name).join(r"Common7\IDE") - }, + compiler_path + .iter() + .take_while(|x| *x != tools_name) + .collect::() + .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 "/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")] - build_with_cmake(); + .is_ok() + { + build_with_cmake(); + } } }