mirror of
https://github.com/openai/codex.git
synced 2026-11-08 20:40:33 +00:00
142 lines
5.0 KiB
Diff
142 lines
5.0 KiB
Diff
diff --git a/builder/cc_builder.rs b/builder/cc_builder.rs
|
|
index 95cacb0..d5d814b 100644
|
|
--- a/builder/cc_builder.rs
|
|
+++ b/builder/cc_builder.rs
|
|
@@ -20,9 +20,10 @@ mod win_x86_64;
|
|
use crate::nasm_builder::NasmBuilder;
|
|
use crate::{
|
|
cargo_env, disable_jitter_entropy, emit_warning, env_name_for_target, env_var_to_bool,
|
|
- execute_command, get_crate_cc, get_crate_cflags, get_crate_cxx, is_no_asm, out_dir,
|
|
- requested_c_std, set_env_for_target, target, target_arch, target_env, target_os, target_vendor,
|
|
- test_clang_cl_command, CStdRequested, EnvGuard, OutputLibType,
|
|
+ execute_command, get_crate_cc, get_crate_cflags, get_crate_cxx,
|
|
+ is_bazel_windows_msvc_build_script, is_no_asm, out_dir, requested_c_std, set_env_for_target,
|
|
+ target, target_arch, target_env, target_os, target_vendor, test_clang_cl_command,
|
|
+ CStdRequested, EnvGuard, OutputLibType,
|
|
};
|
|
use std::cell::Cell;
|
|
use std::collections::HashMap;
|
|
@@ -769,6 +770,30 @@ impl CcBuilder {
|
|
}
|
|
}
|
|
|
|
+fn configure_windows_msvc_clang_cl() {
|
|
+ let should_use_clang_cl = target_os() == "windows"
|
|
+ && target_env() == "msvc"
|
|
+ && (target_arch() == "aarch64" || is_bazel_windows_msvc_build_script());
|
|
+ if !should_use_clang_cl {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ let clang_cl = if test_clang_cl_command() {
|
|
+ Some(String::from("clang-cl"))
|
|
+ } else {
|
|
+ let system_clang_cl = PathBuf::from(r"C:\Program Files\LLVM\bin\clang-cl.exe");
|
|
+ system_clang_cl.is_file().then(|| system_clang_cl.display().to_string())
|
|
+ };
|
|
+ if let Some(clang_cl) = clang_cl {
|
|
+ if get_crate_cc().is_none() {
|
|
+ set_env_for_target("CC", &clang_cl);
|
|
+ }
|
|
+ if get_crate_cxx().is_none() {
|
|
+ set_env_for_target("CXX", &clang_cl);
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
impl crate::Builder for CcBuilder {
|
|
fn check_dependencies(&self) -> Result<(), String> {
|
|
if OutputLibType::Dynamic == self.output_lib_type {
|
|
@@ -784,18 +809,12 @@ impl crate::Builder for CcBuilder {
|
|
return Err("cc_builder for libssl not supported".to_string());
|
|
}
|
|
|
|
+ configure_windows_msvc_clang_cl();
|
|
Ok(())
|
|
}
|
|
|
|
fn build(&self) -> Result<(), String> {
|
|
- if target_os() == "windows"
|
|
- && target_arch() == "aarch64"
|
|
- && target_env() == "msvc"
|
|
- && get_crate_cc().is_none()
|
|
- && test_clang_cl_command()
|
|
- {
|
|
- set_env_for_target("CC", "clang-cl");
|
|
- }
|
|
+ configure_windows_msvc_clang_cl();
|
|
|
|
println!("cargo:root={}", self.out_dir.display());
|
|
let sources = crate::cc_builder::identify_sources();
|
|
|
|
diff --git a/builder/main.rs b/builder/main.rs
|
|
index 51a9bc1..e714ba4 100644
|
|
--- a/builder/main.rs
|
|
+++ b/builder/main.rs
|
|
@@ -723,14 +723,35 @@ fn get_crate_cflags() -> Option<String> {
|
|
.or(optional_env_optional_crate_target("CFLAGS"))
|
|
}
|
|
|
|
+pub(crate) fn is_bazel_windows_build_script() -> bool {
|
|
+ if target_os() != "windows" {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ if optional_env("RULES_RUST_BAZEL_BUILD_SCRIPT_RUNNER").is_some() {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ let cargo_manifest_dir = cargo_env("CARGO_MANIFEST_DIR");
|
|
+ let manifest_dir = Path::new(&cargo_manifest_dir);
|
|
+ manifest_dir
|
|
+ .components()
|
|
+ .any(|component| component.as_os_str() == "bazel-out")
|
|
+}
|
|
+
|
|
+pub(crate) fn is_bazel_windows_msvc_build_script() -> bool {
|
|
+ target().ends_with("windows-msvc") && is_bazel_windows_build_script()
|
|
+}
|
|
+
|
|
fn use_prebuilt_nasm() -> bool {
|
|
+ let use_prebuilt_for_bazel_windows = is_bazel_windows_build_script();
|
|
target_os() == "windows"
|
|
&& target_arch() == "x86_64"
|
|
&& !is_no_asm()
|
|
- && !test_nasm_command() // NASM not found in environment
|
|
&& Some(false) != allow_prebuilt_nasm() // not prevented by environment
|
|
&& !is_disable_prebuilt_nasm() // not prevented by feature
|
|
// permitted by environment or by feature
|
|
+ && (use_prebuilt_for_bazel_windows || !test_nasm_command())
|
|
&& (Some(true) == allow_prebuilt_nasm() || is_prebuilt_nasm())
|
|
}
|
|
|
|
@@ -817,8 +838,12 @@ fn main() {
|
|
initialize();
|
|
prepare_cargo_cfg();
|
|
|
|
- let manifest_dir = current_dir();
|
|
- let manifest_dir = dunce::canonicalize(Path::new(&manifest_dir)).unwrap();
|
|
+ let manifest_dir = if is_bazel_windows_build_script() {
|
|
+ PathBuf::from(cargo_env("CARGO_MANIFEST_DIR"))
|
|
+ } else {
|
|
+ let manifest_dir = current_dir();
|
|
+ dunce::canonicalize(Path::new(&manifest_dir)).unwrap()
|
|
+ };
|
|
let prefix_str = prefix_string();
|
|
let prefix = if is_no_prefix() {
|
|
None
|
|
|
|
diff --git a/builder/nasm_builder.rs b/builder/nasm_builder.rs
|
|
index cf1f5c8..f683274 100644
|
|
--- a/builder/nasm_builder.rs
|
|
+++ b/builder/nasm_builder.rs
|
|
@@ -57,7 +57,7 @@ impl NasmBuilder {
|
|
return vec![];
|
|
}
|
|
|
|
- if test_nasm_command() {
|
|
+ if test_nasm_command() && !use_prebuilt_nasm() {
|
|
for src in &self.files {
|
|
let obj_name = src
|
|
.file_name()
|