From a61cac8e0425187ef3dd7d6f53cd116583fcadb1 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 17 Jul 2024 04:10:52 -0700 Subject: [PATCH] `tools/build.rs`: Only run when compiling for `*-windows-msvc`, and error if trying to cross compile to `*-windows-msvc`. --- tools/build.rs | 68 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/tools/build.rs b/tools/build.rs index 7746efacc..878080ba1 100644 --- a/tools/build.rs +++ b/tools/build.rs @@ -1,38 +1,52 @@ +use std::env; + fn main() { + let os = env::var("CARGO_CFG_TARGET_OS").unwrap(); + let env = env::var("CARGO_CFG_TARGET_ENV").unwrap(); + + let os = os.as_str(); + let env = env.as_str(); + + match (os, env) { + ("windows", "msvc") => { + if !cfg!(all(target_os = "windows", target_env = "msvc")) { + panic!("Cannot cross compile to *-windows-msvc"); + } + } + #[allow(clippy::needless_return)] + _ => return, + } + // NOTE: we rely on libraries that are only distributed for Windows so // targeting Windows/MSVC is not supported when cross compiling. #[cfg(all(target_os = "windows", target_env = "msvc"))] { use cc::windows_registry; - use std::env; - let os = env::var("CARGO_CFG_TARGET_OS").expect("missing CARGO_CFG_TARGET_OS"); - let target = env::var("TARGET").expect("missing TARGET"); - if os == "windows" { - // for sprintf, snprintf, etc. - println!("cargo:rustc-link-lib=static=oldnames"); - let tool = windows_registry::find_tool(&target, "cl.exe") - .expect("couldn't find cl.exe; are the Visual Studio C++ tools installed?"); - let lib_paths = &tool - .env() - .iter() - .find(|(key, _val)| key == "LIB") - .expect("LIB path not found") - .1; - for path in lib_paths.to_str().unwrap().split(';') { - if path != "" { - println!("cargo:rustc-link-search={path}"); - } + // for sprintf, snprintf, etc. + let target = env::var("TARGET").unwrap(); + println!("cargo:rustc-link-lib=static=oldnames"); + let tool = windows_registry::find_tool(&target, "cl.exe") + .expect("couldn't find cl.exe; are the Visual Studio C++ tools installed?"); + let lib_paths = &tool + .env() + .iter() + .find(|(key, _val)| key == "LIB") + .expect("LIB path not found") + .1; + for path in lib_paths.to_str().unwrap().split(';') { + if path != "" { + println!("cargo:rustc-link-search={path}"); } - - let getopt = "getopt"; - cc::Build::new() - .files([&"../tools/compat/getopt.c"]) - .include("../include/compat") - .debug(cfg!(debug_assertions)) - .compile(&getopt); - // cc automatically outputs the following line - // println!("cargo:rustc-link-lib=static={getopt}"); } + + let getopt = "getopt"; + cc::Build::new() + .files([&"../tools/compat/getopt.c"]) + .include("../include/compat") + .debug(cfg!(debug_assertions)) + .compile(&getopt); + // cc automatically outputs the following line + // println!("cargo:rustc-link-lib=static={getopt}"); } }