diff options
author | Brad King <brad.king@kitware.com> | 2023-05-31 13:33:07 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2023-05-31 13:33:26 (GMT) |
commit | 5b063510f9a60bb775e9554866fce7edc286fb3c (patch) | |
tree | 6478002771d02d160db7a2da207d7b2cc5b3b7a0 /Source/cmGlobalGenerator.cxx | |
parent | 3332fdab9daefe0cc1de8cf50dc8cd78dfe221b0 (diff) | |
parent | 8451a3f0b545347a812288e66d757692c770097d (diff) | |
download | CMake-5b063510f9a60bb775e9554866fce7edc286fb3c.zip CMake-5b063510f9a60bb775e9554866fce7edc286fb3c.tar.gz CMake-5b063510f9a60bb775e9554866fce7edc286fb3c.tar.bz2 |
Merge topic 'cmake-verbose-print-build-tool-command'
8451a3f0b5 cmGlobalGenerator: use a stream for output in `Build`
e060666531 cmake: write the build command itself with `--verbose`
b017c9f127 cmGlobalGenerator: fix off-by-one for `&&` command joining
c715fd8d76 cmGlobalGenerator: quote commands in `::Build` output
d6c0e827bc cmGlobalGenerator: add a `QuotedPrintable` method for commands
28ee3bef34 cmGlobalGenerator: add missing spaces in output
465ab8d872 cmGlobalGenerator: use `cmStrCat` in `::Build`
81d45dabc4 cmOutputConverter: add a `static` version of `EscapeForShell`
Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Acked-by: Alex <leha-bot@yandex.ru>
Merge-request: !8183
Diffstat (limited to 'Source/cmGlobalGenerator.cxx')
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 22d5aeb..7e6b16a 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -47,6 +47,7 @@ #include "cmMSVC60LinkLineComputer.h" #include "cmMakefile.h" #include "cmMessageType.h" +#include "cmOutputConverter.h" #include "cmPolicies.h" #include "cmRange.h" #include "cmSourceFile.h" @@ -73,6 +74,23 @@ const std::string kCMAKE_PLATFORM_INFO_INITIALIZED = class cmInstalledFile; +namespace detail { +std::string GeneratedMakeCommand::QuotedPrintable() const +{ + std::string output; + const char* sep = ""; + int flags = 0; +#if !defined(_WIN32) + flags |= cmOutputConverter::Shell_Flag_IsUnix; +#endif + for (auto const& arg : this->PrimaryCommand) { + output += cmStrCat(sep, cmOutputConverter::EscapeForShell(arg, flags)); + sep = " "; + } + return output; +} +} + bool cmTarget::StrictTargetComparison::operator()(cmTarget const* t1, cmTarget const* t2) const { @@ -2058,9 +2076,12 @@ int cmGlobalGenerator::TryCompile(int jobs, const std::string& srcdir, mf->GetSafeDefinition("CMAKE_TRY_COMPILE_CONFIGURATION"); cmBuildOptions defaultBuildOptions(false, fast, PackageResolveMode::Disable); - return this->Build(jobs, srcdir, bindir, projectName, newTarget, output, "", - config, defaultBuildOptions, true, - this->TryCompileTimeout); + std::stringstream ostr; + auto ret = + this->Build(jobs, srcdir, bindir, projectName, newTarget, ostr, "", config, + defaultBuildOptions, true, this->TryCompileTimeout); + output = ostr.str(); + return ret; } std::vector<cmGlobalGenerator::GeneratedMakeCommand> @@ -2085,7 +2106,7 @@ void cmGlobalGenerator::PrintBuildCommandAdvice(std::ostream& /*os*/, int cmGlobalGenerator::Build( int jobs, const std::string& /*unused*/, const std::string& bindir, const std::string& projectName, const std::vector<std::string>& targets, - std::string& output, const std::string& makeCommandCSTR, + std::ostream& ostr, const std::string& makeCommandCSTR, const std::string& config, const cmBuildOptions& buildOptions, bool verbose, cmDuration timeout, cmSystemTools::OutputOption outputflag, std::vector<std::string> const& nativeOptions) @@ -2096,16 +2117,13 @@ int cmGlobalGenerator::Build( * Run an executable command and put the stdout in output. */ cmWorkingDirectory workdir(bindir); - output += "Change Dir: "; - output += bindir; - output += "\n"; + ostr << "Change Dir: '" << bindir << '\'' << std::endl; if (workdir.Failed()) { cmSystemTools::SetRunCommandHideConsole(hideconsole); std::string err = cmStrCat("Failed to change directory: ", std::strerror(workdir.GetLastResult())); cmSystemTools::Error(err); - output += err; - output += "\n"; + ostr << err << std::endl; return 1; } std::string realConfig = config; @@ -2134,9 +2152,8 @@ int cmGlobalGenerator::Build( this->GenerateBuildCommand(makeCommandCSTR, projectName, bindir, { "clean" }, realConfig, jobs, verbose, buildOptions); - output += "\nRun Clean Command:"; - output += cleanCommand.front().Printable(); - output += "\n"; + ostr << "\nRun Clean Command: " << cleanCommand.front().QuotedPrintable() + << std::endl; if (cleanCommand.size() != 1) { this->GetCMakeInstance()->IssueMessage(MessageType::INTERNAL_ERROR, "The generator did not produce " @@ -2149,27 +2166,33 @@ int cmGlobalGenerator::Build( nullptr, outputflag, timeout)) { cmSystemTools::SetRunCommandHideConsole(hideconsole); cmSystemTools::Error("Generator: execution of make clean failed."); - output += *outputPtr; - output += "\nGenerator: execution of make clean failed.\n"; + ostr << *outputPtr << "\nGenerator: execution of make clean failed." + << std::endl; return 1; } - output += *outputPtr; + ostr << *outputPtr; } // now build std::string makeCommandStr; - output += "\nRun Build Command(s):"; + std::string outputMakeCommandStr; + bool isWatcomWMake = this->CMakeInstance->GetState()->UseWatcomWMake(); + bool needBuildOutput = isWatcomWMake; + std::string buildOutput; + ostr << "\nRun Build Command(s): "; retVal = 0; for (auto command = makeCommand.begin(); command != makeCommand.end() && retVal == 0; ++command) { makeCommandStr = command->Printable(); - if (command != makeCommand.end()) { + outputMakeCommandStr = command->QuotedPrintable(); + if ((command + 1) != makeCommand.end()) { makeCommandStr += " && "; + outputMakeCommandStr += " && "; } - output += makeCommandStr; + ostr << outputMakeCommandStr << std::endl; if (!cmSystemTools::RunSingleCommand(command->PrimaryCommand, outputPtr, outputPtr, &retVal, nullptr, outputflag, timeout)) { @@ -2177,21 +2200,24 @@ int cmGlobalGenerator::Build( cmSystemTools::Error( "Generator: execution of make failed. Make command was: " + makeCommandStr); - output += *outputPtr; - output += "\nGenerator: execution of make failed. Make command was: " + - makeCommandStr + "\n"; + ostr << *outputPtr + << "\nGenerator: execution of make failed. Make command was: " + << outputMakeCommandStr << std::endl; return 1; } - output += *outputPtr; + ostr << *outputPtr << std::flush; + if (needBuildOutput) { + buildOutput += *outputPtr; + } } - output += "\n"; + ostr << std::endl; cmSystemTools::SetRunCommandHideConsole(hideconsole); // The OpenWatcom tools do not return an error code when a link // library is not found! - if (this->CMakeInstance->GetState()->UseWatcomWMake() && retVal == 0 && - output.find("W1008: cannot open") != std::string::npos) { + if (isWatcomWMake && retVal == 0 && + buildOutput.find("W1008: cannot open") != std::string::npos) { retVal = 1; } |