@@ -315,6 +315,7 @@ impl Config {
315
315
t
316
316
}
317
317
} ;
318
+ let target = get_target ( & target_triple) ;
318
319
let host = self . host . clone ( ) . unwrap_or_else ( || getenv_unwrap ( "HOST" ) ) ;
319
320
let msvc = target_triple. contains ( "msvc" ) ;
320
321
let ndk = self . uses_android_ndk ( ) ;
@@ -481,6 +482,9 @@ impl Config {
481
482
cmd. arg ( "-DCMAKE_SYSTEM_NAME=SunOS" ) ;
482
483
}
483
484
}
485
+
486
+ target. add_cmake_defines ( & mut cmd, self ) ;
487
+
484
488
if let Some ( ref generator) = self . generator {
485
489
cmd. arg ( "-G" ) . arg ( generator) ;
486
490
}
@@ -581,17 +585,22 @@ impl Config {
581
585
let mut set_compiler = |kind : & str , compiler : & cc:: Tool , extra : & OsString | {
582
586
let mut add_compiler_flags = |flag_var_name : & str | {
583
587
if !self . defined ( & flag_var_name) {
584
- let mut flagsflag = OsString :: from ( "-D" ) ;
585
- flagsflag. push ( & flag_var_name) ;
586
- flagsflag. push ( "=" ) ;
587
- flagsflag. push ( extra) ;
588
+ let mut compiler_flags = OsString :: new ( ) ;
589
+ compiler_flags. push ( extra) ;
588
590
for arg in compiler. args ( ) {
589
591
if skip_arg ( arg) {
590
592
continue ;
591
593
}
592
- flagsflag . push ( " " ) ;
593
- flagsflag . push ( arg) ;
594
+ compiler_flags . push ( " " ) ;
595
+ compiler_flags . push ( arg) ;
594
596
}
597
+ target. filter_compiler_args ( & mut compiler_flags) ;
598
+
599
+ let mut flagsflag = OsString :: from ( "-D" ) ;
600
+ flagsflag. push ( flag_var_name) ;
601
+ flagsflag. push ( "=" ) ;
602
+ flagsflag. push ( compiler_flags) ;
603
+
595
604
cmd. arg ( flagsflag) ;
596
605
}
597
606
} ;
@@ -671,6 +680,9 @@ impl Config {
671
680
}
672
681
673
682
for & ( ref k, ref v) in c_compiler. env ( ) . iter ( ) . chain ( & self . env ) {
683
+ if target. should_exclude_env_var ( k, v) {
684
+ continue ;
685
+ }
674
686
cmd. env ( k, v) ;
675
687
}
676
688
@@ -720,9 +732,12 @@ impl Config {
720
732
}
721
733
722
734
// And build!
723
- let target = self . cmake_target . clone ( ) . unwrap_or ( "install" . to_string ( ) ) ;
735
+ let cmake_target = self . cmake_target . clone ( ) . unwrap_or ( "install" . to_string ( ) ) ;
724
736
let mut cmd = Command :: new ( & executable) ;
725
737
for & ( ref k, ref v) in c_compiler. env ( ) . iter ( ) . chain ( & self . env ) {
738
+ if target. should_exclude_env_var ( k, v) {
739
+ continue ;
740
+ }
726
741
cmd. env ( k, v) ;
727
742
}
728
743
@@ -733,7 +748,7 @@ impl Config {
733
748
cmd. arg ( "--build" ) . arg ( "." ) ;
734
749
735
750
if !self . no_build_target {
736
- cmd. arg ( "--target" ) . arg ( target ) ;
751
+ cmd. arg ( "--target" ) . arg ( cmake_target ) ;
737
752
}
738
753
739
754
cmd. arg ( "--config" )
@@ -827,6 +842,31 @@ impl Config {
827
842
}
828
843
}
829
844
845
+ trait Target {
846
+ fn add_cmake_defines ( & self , _cmd : & mut Command , _config : & Config ) { }
847
+
848
+ fn should_exclude_env_var ( & self , _key : & OsStr , _value : & OsStr ) -> bool {
849
+ false
850
+ }
851
+
852
+ fn filter_compiler_args ( & self , _flags : & mut OsString ) { }
853
+ }
854
+
855
+ fn get_target ( target_triple : & str ) -> Box < dyn Target > {
856
+ let target: Option < Box < dyn Target > > ;
857
+ target. unwrap_or_else ( || Box :: new ( GenericTarget :: new ( target_triple) ) )
858
+ }
859
+
860
+ struct GenericTarget { }
861
+
862
+ impl GenericTarget {
863
+ fn new ( _target_triple : & str ) -> GenericTarget {
864
+ GenericTarget { }
865
+ }
866
+ }
867
+
868
+ impl Target for GenericTarget { }
869
+
830
870
fn run ( cmd : & mut Command , program : & str ) {
831
871
println ! ( "running: {:?}" , cmd) ;
832
872
let status = match cmd. status ( ) {
0 commit comments