From 7c7cd5c27bd92e5b837c33edb97fa3f0a0d9ad79 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 21 Aug 2018 10:39:22 +0200 Subject: Unset CL and _CL_ environment variables when detecting MSVC --- build2/cc/guess.cxx | 11 ++++++++++- build2/types.hxx | 1 + build2/utility.cxx | 15 ++++++++++++--- build2/utility.hxx | 24 ++++++++++++------------ build2/utility.txx | 4 ++-- 5 files changed, 37 insertions(+), 18 deletions(-) diff --git a/build2/cc/guess.cxx b/build2/cc/guess.cxx index 89030b5..e9b102f 100644 --- a/build2/cc/guess.cxx +++ b/build2/cc/guess.cxx @@ -451,7 +451,16 @@ namespace build2 return guess_result (); }; - r = run (3, xp, f, false); + // One can pass extra options/arguments to cl.exe with the CL and _CL_ + // environment variables. However, if such extra options are passed + // without anything to compile, then cl.exe no longer prints usage and + // exits successfully but instead issues an error and fails. So we are + // going to unset these variables for our test (interestingly, only CL + // seem to cause the problem but let's unset both, for good measure). + // + const char* env[] = {"CL=", "_CL_=", nullptr}; + + r = run (3, process_env (xp, env), f, false); } if (!r.empty ()) diff --git a/build2/types.hxx b/build2/types.hxx index 0f2f95b..219608c 100644 --- a/build2/types.hxx +++ b/build2/types.hxx @@ -258,6 +258,7 @@ namespace build2 // // using butl::process; + using butl::process_env; using butl::process_path; using butl::process_error; diff --git a/build2/utility.cxx b/build2/utility.cxx index 2d8e59b..4da2195 100644 --- a/build2/utility.cxx +++ b/build2/utility.cxx @@ -174,7 +174,7 @@ namespace build2 process run_start (uint16_t verbosity, - const process_path& pp, + const process_env& pe, const char* args[], int in, int out, @@ -183,12 +183,21 @@ namespace build2 const location& l) try { - assert (args[0] == pp.recall_string ()); + assert (args[0] == pe.path->recall_string ()); if (verb >= verbosity) print_process (args, 0); - return process (pp, args, in, out, (err ? 2 : 1), cwd.string ().c_str ()); + return process ( + *pe.path, + args, + in, + out, + (err ? 2 : 1), + (!cwd.empty () + ? cwd.string ().c_str () + : pe.cwd != nullptr ? pe.cwd->string ().c_str () : nullptr), + pe.vars); } catch (const process_error& e) { diff --git a/build2/utility.hxx b/build2/utility.hxx index 0beec2e..cc34d59 100644 --- a/build2/utility.hxx +++ b/build2/utility.hxx @@ -187,7 +187,7 @@ namespace build2 // process run_start (uint16_t verbosity, - const process_path&, + const process_env&, // Implicit-constructible from process_path. const char* args[], int in, int out, @@ -196,7 +196,7 @@ namespace build2 const location& = location ()); inline process - run_start (const process_path& pp, + run_start (const process_env& pe, // Implicit-constructible from process_path. const char* args[], int in, int out, @@ -204,7 +204,7 @@ namespace build2 const dir_path& cwd = dir_path (), const location& l = location ()) { - return run_start (verb_never, pp, args, in, out, error, cwd, l); + return run_start (verb_never, pe, args, in, out, error, cwd, l); } inline void @@ -292,7 +292,7 @@ namespace build2 template T run (uint16_t verbosity, - const process_path&, + const process_env&, // Implicit-constructible from process_path. const char* args[], F&&, bool error = true, @@ -301,7 +301,7 @@ namespace build2 template inline T - run (const process_path& pp, + run (const process_env& pe, // Implicit-constructible from process_path. const char* args[], F&& f, bool error = true, @@ -309,7 +309,7 @@ namespace build2 sha256* checksum = nullptr) { return run ( - verb_never, pp, args, forward (f), error, ignore_exit, checksum); + verb_never, pe, args, forward (f), error, ignore_exit, checksum); } template @@ -345,15 +345,15 @@ namespace build2 template inline T run (uint16_t verbosity, - const process_path& pp, + const process_env& pe, // Implicit-constructible from process_path. F&& f, bool error = true, bool ignore_exit = false, sha256* checksum = nullptr) { - const char* args[] = {pp.recall_string (), nullptr}; + const char* args[] = {pe.path->recall_string (), nullptr}; return run ( - verbosity, pp, args, forward (f), error, ignore_exit, checksum); + verbosity, pe, args, forward (f), error, ignore_exit, checksum); } // run @@ -376,16 +376,16 @@ namespace build2 template inline T run (uint16_t verbosity, - const process_path& pp, + const process_env& pe, // Implicit-constructible from process_path. const char* arg, F&& f, bool error = true, bool ignore_exit = false, sha256* checksum = nullptr) { - const char* args[] = {pp.recall_string (), arg, nullptr}; + const char* args[] = {pe.path->recall_string (), arg, nullptr}; return run ( - verbosity, pp, args, forward (f), error, ignore_exit, checksum); + verbosity, pe, args, forward (f), error, ignore_exit, checksum); } // Empty/nullopt string, path, and project name. diff --git a/build2/utility.txx b/build2/utility.txx index 7479b0a..1f65b76 100644 --- a/build2/utility.txx +++ b/build2/utility.txx @@ -59,7 +59,7 @@ namespace build2 template T run (uint16_t verbosity, - const process_path& pp, + const process_env& pe, const char* args[], F&& f, bool err, @@ -67,7 +67,7 @@ namespace build2 sha256* checksum) { process pr (run_start (verbosity, - pp, + pe, args, 0 /* stdin */, -1 /* stdout */, -- cgit v1.1