@@ -653,7 +653,12 @@ impl Build {
653
653
/// ```
654
654
///
655
655
pub fn try_flags_from_environment ( & mut self , environ_key : & str ) -> Result < & mut Build , Error > {
656
- let flags = self . envflags ( environ_key) ?;
656
+ let flags = self . envflags ( environ_key) ?. ok_or_else ( || {
657
+ Error :: new (
658
+ ErrorKind :: EnvVarNotFound ,
659
+ format ! ( "could not find environment variable {environ_key}" ) ,
660
+ )
661
+ } ) ?;
657
662
self . flags . extend (
658
663
flags
659
664
. into_iter ( )
@@ -1907,7 +1912,8 @@ impl Build {
1907
1912
cmd. args . push ( directory. as_os_str ( ) . into ( ) ) ;
1908
1913
}
1909
1914
1910
- if let Ok ( flags) = self . envflags ( if self . cpp { "CXXFLAGS" } else { "CFLAGS" } ) {
1915
+ let flags = self . envflags ( if self . cpp { "CXXFLAGS" } else { "CFLAGS" } ) ?;
1916
+ if let Some ( flags) = & flags {
1911
1917
for arg in flags {
1912
1918
cmd. push_cc_arg ( arg. into ( ) ) ;
1913
1919
}
@@ -1918,12 +1924,12 @@ impl Build {
1918
1924
// CFLAGS/CXXFLAGS, since those variables presumably already contain
1919
1925
// the desired set of warnings flags.
1920
1926
1921
- if self . warnings . unwrap_or ( ! self . has_flags ( ) ) {
1927
+ if self . warnings . unwrap_or ( flags . is_none ( ) ) {
1922
1928
let wflags = cmd. family . warnings_flags ( ) . into ( ) ;
1923
1929
cmd. push_cc_arg ( wflags) ;
1924
1930
}
1925
1931
1926
- if self . extra_warnings . unwrap_or ( ! self . has_flags ( ) ) {
1932
+ if self . extra_warnings . unwrap_or ( flags . is_none ( ) ) {
1927
1933
if let Some ( wflags) = cmd. family . extra_warnings_flags ( ) {
1928
1934
cmd. push_cc_arg ( wflags. into ( ) ) ;
1929
1935
}
@@ -2443,12 +2449,6 @@ impl Build {
2443
2449
Ok ( ( ) )
2444
2450
}
2445
2451
2446
- fn has_flags ( & self ) -> bool {
2447
- let flags_env_var_name = if self . cpp { "CXXFLAGS" } else { "CFLAGS" } ;
2448
- let flags_env_var_value = self . getenv_with_target_prefixes ( flags_env_var_name) ;
2449
- flags_env_var_value. is_ok ( )
2450
- }
2451
-
2452
2452
fn msvc_macro_assembler ( & self ) -> Result < Command , Error > {
2453
2453
let target = self . get_target ( ) ?;
2454
2454
let tool = if target. arch == "x86_64" {
@@ -3115,8 +3115,8 @@ impl Build {
3115
3115
fn try_get_archiver_and_flags ( & self ) -> Result < ( Command , PathBuf , bool ) , Error > {
3116
3116
let ( mut cmd, name) = self . get_base_archiver ( ) ?;
3117
3117
let mut any_flags = false ;
3118
- if let Ok ( flags) = self . envflags ( "ARFLAGS" ) {
3119
- any_flags |= !flags . is_empty ( ) ;
3118
+ if let Some ( flags) = self . envflags ( "ARFLAGS" ) ? {
3119
+ any_flags = true ;
3120
3120
cmd. args ( flags) ;
3121
3121
}
3122
3122
for flag in & self . ar_flags {
@@ -3162,7 +3162,7 @@ impl Build {
3162
3162
/// see [`Self::get_ranlib`] for the complete description.
3163
3163
pub fn try_get_ranlib ( & self ) -> Result < Command , Error > {
3164
3164
let mut cmd = self . get_base_ranlib ( ) ?;
3165
- if let Ok ( flags) = self . envflags ( "RANLIBFLAGS" ) {
3165
+ if let Some ( flags) = self . envflags ( "RANLIBFLAGS" ) ? {
3166
3166
cmd. args ( flags) ;
3167
3167
}
3168
3168
Ok ( cmd)
@@ -3643,41 +3643,64 @@ impl Build {
3643
3643
} )
3644
3644
}
3645
3645
3646
- fn getenv_with_target_prefixes ( & self , var_base : & str ) -> Result < Arc < OsStr > , Error > {
3646
+ /// The list of environment variables to check for a given env, in order of priority.
3647
+ fn target_envs ( & self , env : & str ) -> Result < [ String ; 4 ] , Error > {
3647
3648
let target = self . get_raw_target ( ) ?;
3648
3649
let kind = if self . get_is_cross_compile ( ) ? {
3649
3650
"TARGET"
3650
3651
} else {
3651
3652
"HOST"
3652
3653
} ;
3653
3654
let target_u = target. replace ( '-' , "_" ) ;
3655
+
3656
+ Ok ( [
3657
+ format ! ( "{env}_{target}" ) ,
3658
+ format ! ( "{env}_{target_u}" ) ,
3659
+ format ! ( "{kind}_{env}" ) ,
3660
+ env. to_string ( ) ,
3661
+ ] )
3662
+ }
3663
+
3664
+ /// Get a single-valued environment variable with target variants.
3665
+ fn getenv_with_target_prefixes ( & self , env : & str ) -> Result < Arc < OsStr > , Error > {
3666
+ // Take from first environment variable in the environment.
3654
3667
let res = self
3655
- . getenv ( & format ! ( "{}_{}" , var_base , target ) )
3656
- . or_else ( || self . getenv ( & format ! ( "{}_{}" , var_base , target_u ) ) )
3657
- . or_else ( | | self . getenv ( & format ! ( "{}_{}" , kind , var_base ) ) )
3658
- . or_else ( || self . getenv ( var_base ) ) ;
3668
+ . target_envs ( env ) ?
3669
+ . iter ( )
3670
+ . filter_map ( |env | self . getenv ( env ) )
3671
+ . next ( ) ;
3659
3672
3660
3673
match res {
3661
3674
Some ( res) => Ok ( res) ,
3662
3675
None => Err ( Error :: new (
3663
3676
ErrorKind :: EnvVarNotFound ,
3664
- format ! ( "Could not find environment variable {}." , var_base ) ,
3677
+ format ! ( "could not find environment variable {env}" ) ,
3665
3678
) ) ,
3666
3679
}
3667
3680
}
3668
3681
3669
- fn envflags ( & self , name : & str ) -> Result < Vec < String > , Error > {
3670
- let env_os = self . getenv_with_target_prefixes ( name) ?;
3671
- let env = env_os. to_string_lossy ( ) ;
3672
-
3673
- if self . get_shell_escaped_flags ( ) {
3674
- Ok ( Shlex :: new ( & env) . collect ( ) )
3675
- } else {
3676
- Ok ( env
3677
- . split_ascii_whitespace ( )
3678
- . map ( ToString :: to_string)
3679
- . collect ( ) )
3682
+ /// Get values from CFLAGS-style environment variable.
3683
+ fn envflags ( & self , env : & str ) -> Result < Option < Vec < String > > , Error > {
3684
+ // Collect from all environment variables, in reverse order as in
3685
+ // `getenv_with_target_prefixes` precedence (so that `CFLAGS_$TARGET`
3686
+ // can override flags in `TARGET_CFLAGS`, which overrides those in
3687
+ // `CFLAGS`).
3688
+ let mut any_set = false ;
3689
+ let mut res = vec ! [ ] ;
3690
+ for env in self . target_envs ( env) ?. iter ( ) . rev ( ) {
3691
+ if let Some ( var) = self . getenv ( env) {
3692
+ any_set = true ;
3693
+
3694
+ let var = var. to_string_lossy ( ) ;
3695
+ if self . get_shell_escaped_flags ( ) {
3696
+ res. extend ( Shlex :: new ( & var) ) ;
3697
+ } else {
3698
+ res. extend ( var. split_ascii_whitespace ( ) . map ( ToString :: to_string) ) ;
3699
+ }
3700
+ }
3680
3701
}
3702
+
3703
+ Ok ( if any_set { Some ( res) } else { None } )
3681
3704
}
3682
3705
3683
3706
fn fix_env_for_apple_os ( & self , cmd : & mut Command ) -> Result < ( ) , Error > {
0 commit comments