@@ -212,6 +212,10 @@ impl Config {
212212 }
213213
214214 /// Sets the build-tool generator (`-G`) for this compilation.
215+ ///
216+ /// If unset, this crate will use the `CMAKE_GENERATOR` environment variable
217+ /// if set. Otherwise, it will guess the best generator to use based on the
218+ /// build target.
215219 pub fn generator < T : AsRef < OsStr > > ( & mut self , generator : T ) -> & mut Config {
216220 self . generator = Some ( generator. as_ref ( ) . to_owned ( ) ) ;
217221 self
@@ -418,6 +422,12 @@ impl Config {
418422 t
419423 }
420424 } ;
425+
426+ let mut generator = self
427+ . generator
428+ . clone ( )
429+ . or_else ( || std:: env:: var_os ( "CMAKE_GENERATOR" ) ) ;
430+
421431 let host = self . host . clone ( ) . unwrap_or_else ( || getenv_unwrap ( "HOST" ) ) ;
422432 let msvc = target. contains ( "msvc" ) ;
423433 let ndk = self . uses_android_ndk ( ) ;
@@ -488,15 +498,15 @@ impl Config {
488498
489499 cmd. arg ( & self . path ) . current_dir ( & build) ;
490500 let mut is_ninja = false ;
491- if let Some ( ref generator) = self . generator {
501+ if let Some ( ref generator) = generator {
492502 is_ninja = generator. to_string_lossy ( ) . contains ( "Ninja" ) ;
493503 }
494504 if target. contains ( "windows-gnu" ) {
495505 if host. contains ( "windows" ) {
496506 // On MinGW we need to coerce cmake to not generate a visual
497507 // studio build system but instead use makefiles that MinGW can
498508 // use to build.
499- if self . generator . is_none ( ) {
509+ if generator. is_none ( ) {
500510 // If make.exe isn't found, that means we may be using a MinGW
501511 // toolchain instead of a MSYS2 toolchain. If neither is found,
502512 // the build cannot continue.
@@ -547,11 +557,11 @@ impl Config {
547557 // otherwise we won't get 32/64 bit correct automatically.
548558 // This also guarantees that NMake generator isn't chosen implicitly.
549559 let using_nmake_generator;
550- if self . generator . is_none ( ) {
560+ if generator. is_none ( ) {
551561 cmd. arg ( "-G" ) . arg ( self . visual_studio_generator ( & target) ) ;
552562 using_nmake_generator = false ;
553563 } else {
554- using_nmake_generator = self . generator . as_ref ( ) . unwrap ( ) == "NMake Makefiles" ;
564+ using_nmake_generator = generator. as_ref ( ) . unwrap ( ) == "NMake Makefiles" ;
555565 }
556566 if !is_ninja && !using_nmake_generator {
557567 if target. contains ( "x86_64" ) {
@@ -594,7 +604,7 @@ impl Config {
594604 cmd. arg ( "-DCMAKE_OSX_DEPLOYMENT_TARGET=" ) ;
595605 }
596606 }
597- if let Some ( ref generator) = self . generator {
607+ if let Some ( ref generator) = generator {
598608 cmd. arg ( "-G" ) . arg ( generator) ;
599609 }
600610 let profile = self . get_profile ( ) ;
@@ -654,7 +664,7 @@ impl Config {
654664 //
655665 // Note that for other generators, though, this *overrides*
656666 // things like the optimization flags, which is bad.
657- if self . generator . is_none ( ) && msvc {
667+ if generator. is_none ( ) && msvc {
658668 let flag_var_alt = format ! ( "CMAKE_{}_FLAGS_{}" , kind, build_type_upcase) ;
659669 if !self . defined ( & flag_var_alt) {
660670 let mut flagsflag = OsString :: from ( "-D" ) ;
@@ -745,7 +755,7 @@ impl Config {
745755 let mut parallel_flags = None ;
746756
747757 if let Ok ( s) = env:: var ( "NUM_JOBS" ) {
748- match self . generator . as_ref ( ) . map ( |g| g. to_string_lossy ( ) ) {
758+ match generator. as_ref ( ) . map ( |g| g. to_string_lossy ( ) ) {
749759 Some ( ref g) if g. contains ( "Ninja" ) => {
750760 parallel_flags = Some ( format ! ( "-j{}" , s) ) ;
751761 }
0 commit comments