Windows: Don't split CC into command + arguments separated by spaces (#4590)

This commit is contained in:
Martin Kinkelin 2024-03-02 08:33:40 +01:00 committed by GitHub
parent 42153ca24b
commit 75c4ef8adb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -78,24 +78,30 @@ std::string getProgram(const char *fallbackName,
std::string getGcc(std::vector<std::string> &additional_args,
const char *fallback) {
// In case $CC contains spaces split it into a command and arguments
std::string cc = env::get("CC");
if (cc.empty())
return getProgram(fallback, &gcc);
#ifdef _WIN32
// spaces in $CC are to be expected on Windows
// (e.g., `C:\Program Files\LLVM\bin\clang-cl.exe`)
return getProgram(fallback, &gcc, "CC");
#else
// Posix: in case $CC contains spaces split it into a command and arguments
std::string cc = env::get("CC");
if (cc.empty())
return getProgram(fallback, &gcc);
// $CC is set so fallback doesn't matter anymore.
if (cc.find(' ') == cc.npos)
return getProgram(cc.c_str(), &gcc);
// $CC is set so fallback doesn't matter anymore.
if (cc.find(' ') == cc.npos)
return getProgram(cc.c_str(), &gcc);
llvm::StringRef sr(cc);
llvm::SmallVector<llvm::StringRef, 8> args;
sr.split(args, ' ', /*MaxSplit=*/-1, /*keepEmpty=*/false);
llvm::StringRef sr(cc);
llvm::SmallVector<llvm::StringRef, 8> args;
sr.split(args, ' ', /*MaxSplit=*/-1, /*keepEmpty=*/false);
// args[0] == CC command, args[1..] = CLI options
additional_args.reserve(additional_args.size() + args.size() - 1);
for (size_t i = 1; i < args.size(); i ++)
additional_args.emplace_back(args[i].str());
return getProgram(args[0].str().c_str(), &gcc);
// args[0] == CC command, args[1..] = CLI options
additional_args.reserve(additional_args.size() + args.size() - 1);
for (size_t i = 1; i < args.size(); i ++)
additional_args.emplace_back(args[i].str());
return getProgram(args[0].str().c_str(), &gcc);
#endif
}
////////////////////////////////////////////////////////////////////////////////