@@ -5,9 +5,9 @@ use crate::cc_builder::CcBuilder;
5
5
use crate :: OutputLib :: { Crypto , RustWrapper , Ssl } ;
6
6
use crate :: {
7
7
allow_prebuilt_nasm, cargo_env, effective_target, emit_warning, execute_command,
8
- get_crate_cflags, is_crt_static, is_no_asm, is_no_pregenerated_src, option_env , target_arch ,
9
- target_env , target_os , target_underscored , target_vendor , test_nasm_command , use_prebuilt_nasm ,
10
- OutputLibType ,
8
+ get_crate_cflags, is_crt_static, is_no_asm, is_no_pregenerated_src, optional_env ,
9
+ optional_env_optional_crate_target , set_env , set_env_for_target , target_arch , target_env ,
10
+ target_os , test_nasm_command , use_prebuilt_nasm , OutputLibType ,
11
11
} ;
12
12
use std:: env;
13
13
use std:: ffi:: OsString ;
@@ -25,7 +25,7 @@ fn test_clang_cl_command() -> bool {
25
25
}
26
26
27
27
fn find_cmake_command ( ) -> Option < OsString > {
28
- if let Some ( cmake) = option_env ( "CMAKE" ) {
28
+ if let Some ( cmake) = optional_env_optional_crate_target ( "CMAKE" ) {
29
29
emit_warning ( & format ! (
30
30
"CMAKE environment variable set: {}" ,
31
31
cmake. clone( )
@@ -89,6 +89,9 @@ impl CmakeBuilder {
89
89
#[ allow( clippy:: too_many_lines) ]
90
90
fn prepare_cmake_build ( & self ) -> cmake:: Config {
91
91
let mut cmake_cfg = self . get_cmake_config ( ) ;
92
+ if let Some ( generator) = optional_env_optional_crate_target ( "CMAKE_GENERATOR" ) {
93
+ set_env ( "CMAKE_GENERATOR" , generator) ;
94
+ }
92
95
93
96
if OutputLibType :: default ( ) == OutputLibType :: Dynamic {
94
97
cmake_cfg. define ( "BUILD_SHARED_LIBS" , "1" ) ;
@@ -132,24 +135,20 @@ impl CmakeBuilder {
132
135
}
133
136
134
137
if cfg ! ( feature = "asan" ) {
135
- env:: set_var ( "CC" , "clang" ) ;
136
- env:: set_var ( "CXX" , "clang++" ) ;
137
- env:: set_var ( "ASM" , "clang" ) ;
138
+ set_env_for_target ( "CC" , "clang" ) ;
139
+ set_env_for_target ( "CXX" , "clang++" ) ;
138
140
139
141
cmake_cfg. define ( "ASAN" , "1" ) ;
140
142
}
141
143
142
- if target_env ( ) == "ohos" {
143
- Self :: configure_open_harmony ( & mut cmake_cfg, get_crate_cflags ( ) ) ;
144
- return cmake_cfg;
145
- }
146
-
147
144
let cflags = get_crate_cflags ( ) ;
148
145
if !cflags. is_empty ( ) {
149
- emit_warning ( & format ! (
150
- "AWS_LC_SYS_CFLAGS found. Setting CFLAGS: '{cflags}'"
151
- ) ) ;
152
- env:: set_var ( "CFLAGS" , cflags) ;
146
+ set_env_for_target ( "CFLAGS" , cflags) ;
147
+ }
148
+
149
+ if target_env ( ) == "ohos" {
150
+ Self :: configure_open_harmony ( & mut cmake_cfg) ;
151
+ return cmake_cfg;
153
152
}
154
153
155
154
// cmake-rs has logic that strips Optimization/Debug options that are passed via CFLAGS:
@@ -159,13 +158,8 @@ impl CmakeBuilder {
159
158
Self :: preserve_cflag_optimization_flags ( & mut cmake_cfg) ;
160
159
161
160
// Allow environment to specify CMake toolchain.
162
- let toolchain_var_name = format ! ( "CMAKE_TOOLCHAIN_FILE_{}" , target_underscored( ) ) ;
163
- if let Some ( toolchain) =
164
- option_env ( & toolchain_var_name) . or ( option_env ( "CMAKE_TOOLCHAIN_FILE" ) )
165
- {
166
- emit_warning ( & format ! (
167
- "CMAKE_TOOLCHAIN_FILE environment variable set: {toolchain}"
168
- ) ) ;
161
+ if let Some ( toolchain) = optional_env_optional_crate_target ( "CMAKE_TOOLCHAIN_FILE" ) {
162
+ set_env_for_target ( "CMAKE_TOOLCHAIN_FILE" , toolchain) ;
169
163
return cmake_cfg;
170
164
}
171
165
// We only consider compiler CFLAGS when no cmake toolchain is set
@@ -187,22 +181,25 @@ impl CmakeBuilder {
187
181
cmake_cfg. define ( "CMAKE_OSX_ARCHITECTURES" , "x86_64" ) ;
188
182
cmake_cfg. define ( "CMAKE_SYSTEM_PROCESSOR" , "x86_64" ) ;
189
183
}
184
+ if target_os ( ) . trim ( ) == "ios" {
185
+ cmake_cfg. define ( "CMAKE_SYSTEM_NAME" , "iOS" ) ;
186
+ if effective_target ( ) . ends_with ( "-ios-sim" ) || target_arch ( ) == "x86_64" {
187
+ cmake_cfg. define ( "CMAKE_OSX_SYSROOT" , "iphonesimulator" ) ;
188
+ } else {
189
+ cmake_cfg. define ( "CMAKE_OSX_SYSROOT" , "iphoneos" ) ;
190
+ }
191
+ cmake_cfg. define ( "CMAKE_THREAD_LIBS_INIT" , "-lpthread" ) ;
192
+ }
193
+ if target_os ( ) . trim ( ) == "macos" {
194
+ cmake_cfg. define ( "CMAKE_SYSTEM_NAME" , "Darwin" ) ;
195
+ cmake_cfg. define ( "CMAKE_OSX_SYSROOT" , "macosx" ) ;
196
+ }
190
197
}
191
198
192
199
if target_os ( ) == "android" {
193
200
self . configure_android ( & mut cmake_cfg) ;
194
201
}
195
202
196
- if target_vendor ( ) == "apple" && target_os ( ) . to_lowercase ( ) == "ios" {
197
- cmake_cfg. define ( "CMAKE_SYSTEM_NAME" , "iOS" ) ;
198
- if effective_target ( ) . ends_with ( "-ios-sim" ) || target_arch ( ) == "x86_64" {
199
- cmake_cfg. define ( "CMAKE_OSX_SYSROOT" , "iphonesimulator" ) ;
200
- } else {
201
- cmake_cfg. define ( "CMAKE_OSX_SYSROOT" , "iphoneos" ) ;
202
- }
203
- cmake_cfg. define ( "CMAKE_THREAD_LIBS_INIT" , "-lpthread" ) ;
204
- }
205
-
206
203
cmake_cfg
207
204
}
208
205
@@ -225,18 +222,18 @@ impl CmakeBuilder {
225
222
// https://github.com/rust-lang/cmake-rs/blob/b689783b5448966e810d515c798465f2e0ab56fd/src/lib.rs#L450-L499
226
223
227
224
// Log relevant environment variables.
228
- if let Some ( value) = option_env ( "ANDROID_NDK_ROOT" ) {
229
- emit_warning ( & format ! ( "Found ANDROID_NDK_ROOT={value}" ) ) ;
225
+ if let Some ( value) = optional_env_optional_crate_target ( "ANDROID_NDK_ROOT" ) {
226
+ set_env ( " ANDROID_NDK_ROOT" , value ) ;
230
227
} else {
231
228
emit_warning ( "ANDROID_NDK_ROOT not set." ) ;
232
229
}
233
- if let Some ( value) = option_env ( "ANDROID_NDK" ) {
234
- emit_warning ( & format ! ( "Found ANDROID_NDK={value}" ) ) ;
230
+ if let Some ( value) = optional_env_optional_crate_target ( "ANDROID_NDK" ) {
231
+ set_env ( " ANDROID_NDK" , value ) ;
235
232
} else {
236
233
emit_warning ( "ANDROID_NDK not set." ) ;
237
234
}
238
- if let Some ( value) = option_env ( "ANDROID_STANDALONE_TOOLCHAIN" ) {
239
- emit_warning ( & format ! ( "Found ANDROID_STANDALONE_TOOLCHAIN={value}" ) ) ;
235
+ if let Some ( value) = optional_env_optional_crate_target ( "ANDROID_STANDALONE_TOOLCHAIN" ) {
236
+ set_env ( " ANDROID_STANDALONE_TOOLCHAIN" , value ) ;
240
237
} else {
241
238
emit_warning ( "ANDROID_STANDALONE_TOOLCHAIN not set." ) ;
242
239
}
@@ -245,16 +242,21 @@ impl CmakeBuilder {
245
242
fn configure_windows ( & self , cmake_cfg : & mut cmake:: Config ) {
246
243
match ( target_env ( ) . as_str ( ) , target_arch ( ) . as_str ( ) ) {
247
244
( "msvc" , "aarch64" ) => {
248
- cmake_cfg. generator_toolset ( format ! (
249
- "ClangCL{}" ,
250
- if cfg!( target_arch = "x86_64" ) {
251
- ",host=x64"
252
- } else {
253
- ""
254
- }
255
- ) ) ;
245
+ // If CMAKE_GENERATOR is either not set or not set to "Ninja"
246
+ let cmake_generator = optional_env ( "CMAKE_GENERATOR" ) ;
247
+ if cmake_generator. is_none ( ) || cmake_generator. unwrap ( ) . to_lowercase ( ) != "ninja" {
248
+ // The following is not supported by the Ninja generator
249
+ cmake_cfg. generator_toolset ( format ! (
250
+ "ClangCL{}" ,
251
+ if cfg!( target_arch = "x86_64" ) {
252
+ ",host=x64"
253
+ } else {
254
+ ""
255
+ }
256
+ ) ) ;
257
+ cmake_cfg. define ( "CMAKE_GENERATOR_PLATFORM" , "ARM64" ) ;
258
+ }
256
259
cmake_cfg. static_crt ( is_crt_static ( ) ) ;
257
- cmake_cfg. define ( "CMAKE_GENERATOR_PLATFORM" , "ARM64" ) ;
258
260
cmake_cfg. define ( "CMAKE_SYSTEM_NAME" , "Windows" ) ;
259
261
cmake_cfg. define ( "CMAKE_SYSTEM_PROCESSOR" , "ARM64" ) ;
260
262
}
@@ -319,25 +321,20 @@ impl CmakeBuilder {
319
321
}
320
322
}
321
323
322
- fn configure_open_harmony ( cmake_cfg : & mut cmake:: Config , crate_cflags : & str ) {
323
- env:: set_var ( "CFLAGS" , crate_cflags) ;
324
+ fn configure_open_harmony ( cmake_cfg : & mut cmake:: Config ) {
324
325
let mut cflags = vec ! [ "-Wno-unused-command-line-argument" ] ;
325
326
let mut asmflags = vec ! [ ] ;
326
327
327
- let toolchain_var_name = format ! ( "CMAKE_TOOLCHAIN_FILE_{}" , target_underscored( ) ) ;
328
328
// If a toolchain is not specified by the environment
329
- if option_env ( & toolchain_var_name)
330
- . or ( option_env ( "CMAKE_TOOLCHAIN_FILE" ) )
331
- . is_none ( )
332
- {
329
+ if optional_env_optional_crate_target ( "CMAKE_TOOLCHAIN_FILE" ) . is_none ( ) {
333
330
if let Ok ( ndk) = env:: var ( "OHOS_NDK_HOME" ) {
334
- env :: set_var (
335
- toolchain_var_name ,
331
+ set_env_for_target (
332
+ "CMAKE_TOOLCHAIN_FILE" ,
336
333
format ! ( "{ndk}/native/build/cmake/ohos.toolchain.cmake" ) ,
337
334
) ;
338
335
} else if let Ok ( sdk) = env:: var ( "OHOS_SDK_NATIVE" ) {
339
- env :: set_var (
340
- toolchain_var_name ,
336
+ set_env_for_target (
337
+ "CMAKE_TOOLCHAIN_FILE" ,
341
338
format ! ( "{sdk}/build/cmake/ohos.toolchain.cmake" ) ,
342
339
) ;
343
340
} else {
0 commit comments