Skip to content

Commit 66e9978

Browse files
authored
Honor the CMAKE_GENERATOR environment variable (#119)
1 parent 8890a01 commit 66e9978

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/lib.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)