From 8245920555a430e8b92d4246d12b1c70e0f1b2fe Mon Sep 17 00:00:00 2001 From: Justin Smith Date: Wed, 18 Sep 2024 13:49:12 -0400 Subject: [PATCH] Better align the CC and CMake builds --- aws-lc-sys/builder/cc_builder.rs | 75 ++++++++++++++++++----------- aws-lc-sys/builder/cmake_builder.rs | 58 +++++----------------- aws-lc-sys/builder/main.rs | 1 + 3 files changed, 62 insertions(+), 72 deletions(-) diff --git a/aws-lc-sys/builder/cc_builder.rs b/aws-lc-sys/builder/cc_builder.rs index 0a017648b32..2575aebcab2 100644 --- a/aws-lc-sys/builder/cc_builder.rs +++ b/aws-lc-sys/builder/cc_builder.rs @@ -14,8 +14,9 @@ mod x86_64_unknown_linux_gnu; mod x86_64_unknown_linux_musl; use crate::{ - cargo_env, emit_warning, env_var_to_bool, execute_command, get_cflags, out_dir, - requested_c_std, target, target_arch, target_os, target_vendor, CStdRequested, OutputLibType, + cargo_env, emit_warning, env_var_to_bool, execute_command, get_cflags, is_no_asm, option_env, + out_dir, requested_c_std, target, target_arch, target_env, target_os, target_vendor, + CStdRequested, OutputLibType, }; use std::path::PathBuf; @@ -96,25 +97,35 @@ impl CcBuilder { } } - fn apply_c_std(cc_build: &mut cc::Build) { + pub(crate) fn create_builder(&self) -> cc::Build { + let mut cc_build = cc::Build::default(); + cc_build.out_dir(&self.out_dir).cpp(false); + + let compiler = cc_build.get_compiler(); + if compiler.is_like_gnu() || compiler.is_like_clang() { + cc_build.flag("-Wno-unused-parameter"); + if target_os() == "linux" || target_env() == "gnu" { + cc_build.define("_XOPEN_SOURCE", "700").flag("-lpthread"); + } + } + match requested_c_std() { - CStdRequested::C99 => cc_build.std("c99"), - _ => cc_build.std("c11"), + CStdRequested::C99 => { + cc_build.std("c99"); + } + CStdRequested::C11 => { + cc_build.std("c11"); + } + CStdRequested::None => {} // Use compiler default }; - } - fn create_builder(&self) -> cc::Build { - let mut cc_build = cc::Build::default(); - cc_build - .out_dir(&self.out_dir) - .flag("-Wno-unused-parameter") - .cpp(false) - .shared_flag(false) - .static_flag(true); - CcBuilder::apply_c_std(&mut cc_build); - if target_os() == "linux" { - cc_build.define("_XOPEN_SOURCE", "700").flag("-lpthread"); + if let Some(cc) = option_env("CC") { + emit_warning(&format!("CC environment variable set: {}", cc.clone())); + } + if let Some(cxx) = option_env("CXX") { + emit_warning(&format!("CXX environment variable set: {}", cxx.clone())); } + if let Some(prefix) = &self.build_prefix { cc_build .define("BORINGSSL_IMPLEMENTATION", "1") @@ -123,17 +134,27 @@ impl CcBuilder { let opt_level = cargo_env("OPT_LEVEL"); match opt_level.as_str() { - "0" | "1" | "2" => {} + "0" | "1" | "2" => { + if is_no_asm() { + cc_build.define("OPENSSL_NO_ASM", "1"); + } + } _ => { - let file_prefix_map_option = - format!("-ffile-prefix-map={}=", self.manifest_dir.display()); - if let Ok(true) = cc_build.is_flag_supported(&file_prefix_map_option) { - cc_build.flag(file_prefix_map_option); - } else { - cc_build.flag_if_supported(format!( - "-fdebug-prefix-map={}=", - self.manifest_dir.display() - )); + assert!( + !is_no_asm(), + "AWS_LC_SYS_NO_ASM only allowed for debug builds!" + ); + if compiler.is_like_gnu() || compiler.is_like_clang() { + let file_prefix_map_option = + format!("-ffile-prefix-map={}=", self.manifest_dir.display()); + if let Ok(true) = cc_build.is_flag_supported(&file_prefix_map_option) { + cc_build.flag(file_prefix_map_option); + } else { + cc_build.flag_if_supported(format!( + "-fdebug-prefix-map={}=", + self.manifest_dir.display() + )); + } } } } diff --git a/aws-lc-sys/builder/cmake_builder.rs b/aws-lc-sys/builder/cmake_builder.rs index 5de30d4dd46..e7f401458b6 100644 --- a/aws-lc-sys/builder/cmake_builder.rs +++ b/aws-lc-sys/builder/cmake_builder.rs @@ -1,12 +1,12 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 OR ISC +use crate::cc_builder::CcBuilder; use crate::OutputLib::{Crypto, RustWrapper, Ssl}; use crate::{ - allow_prebuilt_nasm, cargo_env, emit_warning, execute_command, get_cflags, is_crt_static, - is_no_asm, option_env, requested_c_std, target, target_arch, target_env, target_family, - target_os, target_underscored, target_vendor, test_nasm_command, use_prebuilt_nasm, - CStdRequested, OutputLibType, + allow_prebuilt_nasm, cargo_env, emit_warning, execute_command, is_crt_static, is_no_asm, + option_env, target, target_arch, target_env, target_os, target_underscored, target_vendor, + test_nasm_command, use_prebuilt_nasm, OutputLibType, }; use std::env; use std::ffi::OsString; @@ -89,17 +89,20 @@ impl CmakeBuilder { cmake_cfg.define("CMAKE_BUILD_TYPE", "relwithdebinfo"); } else { cmake_cfg.define("CMAKE_BUILD_TYPE", "release"); - if target_family() == "unix" || target_env() == "gnu" { - cmake_cfg.cflag(format!( - "-ffile-prefix-map={}=", - self.manifest_dir.display() - )); - } } } else { cmake_cfg.define("CMAKE_BUILD_TYPE", "debug"); } + // Use the compiler options identified by CcBuilder + let cc_builder = CcBuilder::new( + self.manifest_dir.clone(), + self.out_dir.clone(), + self.build_prefix.clone(), + self.output_lib_type, + ); + cmake_cfg.init_c_cfg(cc_builder.create_builder()); + if let Some(prefix) = &self.build_prefix { cmake_cfg.define("BORINGSSL_PREFIX", format!("{prefix}_")); let include_path = self.manifest_dir.join("generated-include"); @@ -120,15 +123,6 @@ impl CmakeBuilder { cmake_cfg.define("DISABLE_PERL", "ON"); cmake_cfg.define("DISABLE_GO", "ON"); - if is_no_asm() { - let opt_level = cargo_env("OPT_LEVEL"); - if opt_level == "0" { - cmake_cfg.define("OPENSSL_NO_ASM", "1"); - } else { - panic!("AWS_LC_SYS_NO_ASM only allowed for debug builds!") - } - } - if cfg!(feature = "asan") { env::set_var("CC", "clang"); env::set_var("CXX", "clang++"); @@ -136,23 +130,6 @@ impl CmakeBuilder { cmake_cfg.define("ASAN", "1"); } - match requested_c_std() { - CStdRequested::C99 => { - cmake_cfg.define("CMAKE_C_STANDARD", "99"); - } - CStdRequested::C11 => { - cmake_cfg.define("CMAKE_C_STANDARD", "11"); - } - CStdRequested::None => {} - } - - if !get_cflags().is_empty() { - let cflags = get_cflags(); - emit_warning(&format!( - "AWS_LC_SYS_CFLAGS found. Setting CFLAGS: '{cflags}'" - )); - env::set_var("CFLAGS", cflags); - } // Allow environment to specify CMake toolchain. if let Some(toolchain) = option_env("CMAKE_TOOLCHAIN_FILE").or(option_env(format!( @@ -165,15 +142,6 @@ impl CmakeBuilder { return cmake_cfg; } - if let Some(cc) = option_env("CC") { - emit_warning(&format!("CC environment variable set: {}", cc.clone())); - cmake_cfg.define("CMAKE_C_COMPILER", cc); - } - if let Some(cxx) = option_env("CXX") { - emit_warning(&format!("CXX environment variable set: {}", cxx.clone())); - cmake_cfg.define("CMAKE_CXX_COMPILER", cxx); - } - // See issue: https://github.com/aws/aws-lc-rs/issues/453 if target_os() == "windows" { self.configure_windows(&mut cmake_cfg); diff --git a/aws-lc-sys/builder/main.rs b/aws-lc-sys/builder/main.rs index 3fae1e4448b..4933e7aca07 100644 --- a/aws-lc-sys/builder/main.rs +++ b/aws-lc-sys/builder/main.rs @@ -236,6 +236,7 @@ fn emit_warning(message: &str) { println!("cargo:warning={message}"); } +#[allow(dead_code)] fn target_family() -> String { cargo_env("CARGO_CFG_TARGET_FAMILY") }