diff options
author | Brad King <brad.king@kitware.com> | 2016-08-25 13:50:39 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2016-08-25 13:50:39 (GMT) |
commit | a79abb82fe1c90b65f124a8dd31e4a0227583ce4 (patch) | |
tree | 302dc9ddff62dabbe6e142f16d58ee0a574eee5c /Source | |
parent | ce8fadc717b001b39b3208f8069cb0048073f975 (diff) | |
parent | 1462576bcba68310395a7185e4b77da38e1e6b33 (diff) | |
download | CMake-a79abb82fe1c90b65f124a8dd31e4a0227583ce4.zip CMake-a79abb82fe1c90b65f124a8dd31e4a0227583ce4.tar.gz CMake-a79abb82fe1c90b65f124a8dd31e4a0227583ce4.tar.bz2 |
Merge topic 'extract-cmMessenger'
1462576b Parser: Port away from cmMakefile
421012a3 cmMessenger: Extract from cmake class
14a8d61f cmMakefile: Port nested error logic away from cmExecutionStatus
2af853de cmMakefile: Simplify IssueMessage implementation
33bb9cfa Parser: Issue messages through cmake, not cmSystemTools
db7de303 Parser: Store the Backtrace for use in issuing messages
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Source/cmExecutionStatus.h | 4 | ||||
-rw-r--r-- | Source/cmFunctionCommand.cxx | 6 | ||||
-rw-r--r-- | Source/cmListFileCache.cxx | 89 | ||||
-rw-r--r-- | Source/cmListFileCache.h | 5 | ||||
-rw-r--r-- | Source/cmMacroCommand.cxx | 4 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 35 | ||||
-rw-r--r-- | Source/cmMakefile.h | 1 | ||||
-rw-r--r-- | Source/cmMessageCommand.cxx | 6 | ||||
-rw-r--r-- | Source/cmMessenger.cxx | 209 | ||||
-rw-r--r-- | Source/cmMessenger.h | 44 | ||||
-rw-r--r-- | Source/cmake.cxx | 176 | ||||
-rw-r--r-- | Source/cmake.h | 7 |
13 files changed, 359 insertions, 229 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index e63bf5a..3b94df7 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -319,6 +319,8 @@ set(SRCS cmMakefileExecutableTargetGenerator.cxx cmMakefileLibraryTargetGenerator.cxx cmMakefileUtilityTargetGenerator.cxx + cmMessenger.cxx + cmMessenger.h cmOSXBundleGenerator.cxx cmOSXBundleGenerator.h cmOutputConverter.cxx diff --git a/Source/cmExecutionStatus.h b/Source/cmExecutionStatus.h index 508c6bd..8006514 100644 --- a/Source/cmExecutionStatus.h +++ b/Source/cmExecutionStatus.h @@ -38,16 +38,12 @@ public: this->ReturnInvoked = false; this->BreakInvoked = false; this->ContinueInvoked = false; - this->NestedError = false; } - void SetNestedError(bool val) { this->NestedError = val; } - bool GetNestedError() { return this->NestedError; } private: bool ReturnInvoked; bool BreakInvoked; bool ContinueInvoked; - bool NestedError; }; #endif diff --git a/Source/cmFunctionCommand.cxx b/Source/cmFunctionCommand.cxx index 40c54db..f0e4854 100644 --- a/Source/cmFunctionCommand.cxx +++ b/Source/cmFunctionCommand.cxx @@ -76,7 +76,7 @@ public: }; bool cmFunctionHelperCommand::InvokeInitialPass( - const std::vector<cmListFileArgument>& args, cmExecutionStatus& inStatus) + const std::vector<cmListFileArgument>& args, cmExecutionStatus&) { // Expand the argument list to the function. std::vector<std::string> expandedArgs; @@ -129,11 +129,11 @@ bool cmFunctionHelperCommand::InvokeInitialPass( for (unsigned int c = 0; c < this->Functions.size(); ++c) { cmExecutionStatus status; if (!this->Makefile->ExecuteCommand(this->Functions[c], status) || - status.GetNestedError()) { + (cmSystemTools::GetErrorOccuredFlag() && + !cmSystemTools::GetFatalErrorOccured())) { // The error message should have already included the call stack // so we do not need to report an error here. functionScope.Quiet(); - inStatus.SetNestedError(true); return false; } if (status.GetReturnInvoked()) { diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx index 1967d2a..39d9e97 100644 --- a/Source/cmListFileCache.cxx +++ b/Source/cmListFileCache.cxx @@ -12,7 +12,7 @@ #include "cmListFileCache.h" #include "cmListFileLexer.h" -#include "cmMakefile.h" +#include "cmMessenger.h" #include "cmOutputConverter.h" #include "cmSystemTools.h" #include "cmVersion.h" @@ -21,15 +21,18 @@ struct cmListFileParser { - cmListFileParser(cmListFile* lf, cmMakefile* mf, const char* filename); + cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt, + cmMessenger* messenger, const char* filename); ~cmListFileParser(); void IssueFileOpenError(std::string const& text) const; + void IssueError(std::string const& text) const; bool ParseFile(); bool ParseFunction(const char* name, long line); bool AddArgument(cmListFileLexer_Token* token, cmListFileArgument::Delimiter delim); cmListFile* ListFile; - cmMakefile* Makefile; + cmListFileBacktrace Backtrace; + cmMessenger* Messenger; const char* FileName; cmListFileLexer* Lexer; cmListFileFunction Function; @@ -41,10 +44,12 @@ struct cmListFileParser } Separation; }; -cmListFileParser::cmListFileParser(cmListFile* lf, cmMakefile* mf, +cmListFileParser::cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt, + cmMessenger* messenger, const char* filename) : ListFile(lf) - , Makefile(mf) + , Backtrace(lfbt) + , Messenger(messenger) , FileName(filename) , Lexer(cmListFileLexer_New()) { @@ -57,7 +62,18 @@ cmListFileParser::~cmListFileParser() void cmListFileParser::IssueFileOpenError(const std::string& text) const { - this->Makefile->IssueMessage(cmake::FATAL_ERROR, text); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, text, this->Backtrace); +} + +void cmListFileParser::IssueError(const std::string& text) const +{ + cmListFileContext lfc; + lfc.FilePath = this->FileName; + lfc.Line = cmListFileLexer_GetCurrentLine(this->Lexer); + cmListFileBacktrace lfbt = this->Backtrace; + lfbt = lfbt.Push(lfc); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, text, lfbt); + cmSystemTools::SetFatalErrorOccured(); } bool cmListFileParser::ParseFile() @@ -96,29 +112,26 @@ bool cmListFileParser::ParseFile() } } else { std::ostringstream error; - error << "Error in cmake code at\n" - << this->FileName << ":" << token->line << ":\n" - << "Parse error. Expected a newline, got " + error << "Parse error. Expected a newline, got " << cmListFileLexer_GetTypeAsString(this->Lexer, token->type) << " with text \"" << token->text << "\"."; - cmSystemTools::Error(error.str().c_str()); + this->IssueError(error.str()); return false; } } else { std::ostringstream error; - error << "Error in cmake code at\n" - << this->FileName << ":" << token->line << ":\n" - << "Parse error. Expected a command name, got " + error << "Parse error. Expected a command name, got " << cmListFileLexer_GetTypeAsString(this->Lexer, token->type) << " with text \"" << token->text << "\"."; - cmSystemTools::Error(error.str().c_str()); + this->IssueError(error.str()); return false; } } return true; } -bool cmListFile::ParseFile(const char* filename, cmMakefile* mf) +bool cmListFile::ParseFile(const char* filename, cmMessenger* messenger, + cmListFileBacktrace const& lfbt) { if (!cmSystemTools::FileExists(filename) || cmSystemTools::FileIsDirectory(filename)) { @@ -128,7 +141,7 @@ bool cmListFile::ParseFile(const char* filename, cmMakefile* mf) bool parseError = false; { - cmListFileParser parser(this, mf, filename); + cmListFileParser parser(this, lfbt, messenger, filename); parseError = !parser.ParseFile(); } @@ -154,18 +167,15 @@ bool cmListFileParser::ParseFunction(const char* name, long line) << cmListFileLexer_GetCurrentLine(this->Lexer) << ":\n" << "Parse error. Function missing opening \"(\"."; /* clang-format on */ - cmSystemTools::Error(error.str().c_str()); + this->IssueError(error.str()); return false; } if (token->type != cmListFileLexer_Token_ParenLeft) { std::ostringstream error; - error << "Error in cmake code at\n" - << this->FileName << ":" - << cmListFileLexer_GetCurrentLine(this->Lexer) << ":\n" - << "Parse error. Expected \"(\", got " + error << "Parse error. Expected \"(\", got " << cmListFileLexer_GetTypeAsString(this->Lexer, token->type) << " with text \"" << token->text << "\"."; - cmSystemTools::Error(error.str().c_str()); + this->IssueError(error.str()); return false; } @@ -217,25 +227,24 @@ bool cmListFileParser::ParseFunction(const char* name, long line) } else { // Error. std::ostringstream error; - error << "Error in cmake code at\n" - << this->FileName << ":" - << cmListFileLexer_GetCurrentLine(this->Lexer) << ":\n" - << "Parse error. Function missing ending \")\". " + error << "Parse error. Function missing ending \")\". " << "Instead found " << cmListFileLexer_GetTypeAsString(this->Lexer, token->type) << " with text \"" << token->text << "\"."; - cmSystemTools::Error(error.str().c_str()); + this->IssueError(error.str()); return false; } } std::ostringstream error; - error << "Error in cmake code at\n" - << this->FileName << ":" << lastLine << ":\n" - << "Parse error. Function missing ending \")\". " + cmListFileContext lfc; + lfc.FilePath = this->FileName; + lfc.Line = lastLine; + cmListFileBacktrace lfbt = this->Backtrace; + lfbt = lfbt.Push(lfc); + error << "Parse error. Function missing ending \")\". " << "End of file reached."; - cmSystemTools::Error(error.str().c_str()); - + this->Messenger->IssueMessage(cmake::FATAL_ERROR, error.str(), lfbt); return false; } @@ -250,17 +259,21 @@ bool cmListFileParser::AddArgument(cmListFileLexer_Token* token, bool isError = (this->Separation == SeparationError || delim == cmListFileArgument::Bracket); std::ostringstream m; - /* clang-format off */ - m << "Syntax " << (isError? "Error":"Warning") << " in cmake code at\n" - << " " << this->FileName << ":" << token->line << ":" - << token->column << "\n" + cmListFileContext lfc; + lfc.FilePath = this->FileName; + lfc.Line = token->line; + cmListFileBacktrace lfbt = this->Backtrace; + lfbt = lfbt.Push(lfc); + + m << "Syntax " << (isError ? "Error" : "Warning") << " in cmake code at " + << "column " << token->column << "\n" << "Argument not separated from preceding token by whitespace."; /* clang-format on */ if (isError) { - this->Makefile->IssueMessage(cmake::FATAL_ERROR, m.str()); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, m.str(), lfbt); return false; } - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, m.str()); + this->Messenger->IssueMessage(cmake::AUTHOR_WARNING, m.str(), lfbt); return true; } diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h index f3e6f70..cd44536 100644 --- a/Source/cmListFileCache.h +++ b/Source/cmListFileCache.h @@ -23,7 +23,7 @@ * cmake list files. */ -class cmMakefile; +class cmMessenger; struct cmCommandContext { @@ -158,7 +158,8 @@ private: struct cmListFile { - bool ParseFile(const char* path, cmMakefile* mf); + bool ParseFile(const char* path, cmMessenger* messenger, + cmListFileBacktrace const& lfbt); std::vector<cmListFileFunction> Functions; }; diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index ee9dc8a..9d312ee 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -159,11 +159,11 @@ bool cmMacroHelperCommand::InvokeInitialPass( } cmExecutionStatus status; if (!this->Makefile->ExecuteCommand(newLFF, status) || - status.GetNestedError()) { + (cmSystemTools::GetErrorOccuredFlag() && + !cmSystemTools::GetFatalErrorOccured())) { // The error message should have already included the call stack // so we do not need to report an error here. macroScope.Quiet(); - inStatus.SetNestedError(true); return false; } if (status.GetReturnInvoked()) { diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index b9d71ec..6e47797 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -25,6 +25,7 @@ #include "cmGlobalGenerator.h" #include "cmInstallGenerator.h" #include "cmListFileCache.h" +#include "cmMessenger.h" #include "cmSourceFile.h" #include "cmSourceFileLocation.h" #include "cmState.h" @@ -115,12 +116,6 @@ cmMakefile::~cmMakefile() void cmMakefile::IssueMessage(cmake::MessageType t, std::string const& text) const { - // Collect context information. - if (!this->ExecutionStatusStack.empty()) { - if ((t == cmake::FATAL_ERROR) || (t == cmake::INTERNAL_ERROR)) { - this->ExecutionStatusStack.back()->SetNestedError(true); - } - } this->GetCMakeInstance()->IssueMessage(t, text, this->GetBacktrace()); } @@ -281,11 +276,19 @@ bool cmMakefile::ExecuteCommand(const cmListFileFunction& lff, if (this->GetCMakeInstance()->GetTrace()) { this->PrintCommandTrace(lff); } - // Try invoking the command. + + bool hadPreviousNonFatalError = cmSystemTools::GetErrorOccuredFlag() && + !cmSystemTools::GetFatalErrorOccured(); + cmSystemTools::ResetErrorOccuredFlag(); + bool invokeSucceeded = pcmd->InvokeInitialPass(lff.Arguments, status); - bool hadNestedError = status.GetNestedError(); + bool hadNestedError = cmSystemTools::GetErrorOccuredFlag() && + !cmSystemTools::GetFatalErrorOccured(); + if (hadPreviousNonFatalError) { + cmSystemTools::SetErrorOccured(); + } if (!invokeSucceeded || hadNestedError) { - if (!hadNestedError) { + if (!hadNestedError && !cmSystemTools::GetFatalErrorOccured()) { // The command invocation requested that we report an error. this->IssueMessage(cmake::FATAL_ERROR, pcmd->GetError()); } @@ -455,7 +458,8 @@ bool cmMakefile::ReadDependentFile(const char* filename, bool noPolicyScope) IncludeScope incScope(this, filenametoread, noPolicyScope); cmListFile listFile; - if (!listFile.ParseFile(filenametoread.c_str(), this)) { + if (!listFile.ParseFile(filenametoread.c_str(), this->GetMessenger(), + this->Backtrace)) { return false; } @@ -504,7 +508,8 @@ bool cmMakefile::ReadListFile(const char* filename) ListFileScope scope(this, filenametoread); cmListFile listFile; - if (!listFile.ParseFile(filenametoread.c_str(), this)) { + if (!listFile.ParseFile(filenametoread.c_str(), this->GetMessenger(), + this->Backtrace)) { return false; } @@ -1450,7 +1455,8 @@ void cmMakefile::Configure() this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentStart.c_str()); cmListFile listFile; - if (!listFile.ParseFile(currentStart.c_str(), this)) { + if (!listFile.ParseFile(currentStart.c_str(), this->GetMessenger(), + this->Backtrace)) { return; } if (this->IsRootMakefile()) { @@ -3272,6 +3278,11 @@ cmake* cmMakefile::GetCMakeInstance() const return this->GlobalGenerator->GetCMakeInstance(); } +cmMessenger* cmMakefile::GetMessenger() const +{ + return this->GetCMakeInstance()->GetMessenger(); +} + cmGlobalGenerator* cmMakefile::GetGlobalGenerator() const { return this->GlobalGenerator; diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index d082964..b3587c5 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -607,6 +607,7 @@ public: * Get the instance */ cmake* GetCMakeInstance() const; + cmMessenger* GetMessenger() const; cmGlobalGenerator* GetGlobalGenerator() const; /** diff --git a/Source/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx index 080880b..c48910e 100644 --- a/Source/cmMessageCommand.cxx +++ b/Source/cmMessageCommand.cxx @@ -11,6 +11,8 @@ ============================================================================*/ #include "cmMessageCommand.h" +#include "cmMessenger.h" + // cmLibraryCommand bool cmMessageCommand::InitialPass(std::vector<std::string> const& args, cmExecutionStatus&) @@ -65,8 +67,8 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args, if (type != cmake::MESSAGE) { // we've overriden the message type, above, so display it directly - cmake* cm = this->Makefile->GetCMakeInstance(); - cm->DisplayMessage(type, message, this->Makefile->GetBacktrace()); + cmMessenger* m = this->Makefile->GetMessenger(); + m->DisplayMessage(type, message, this->Makefile->GetBacktrace()); } else { if (status) { this->Makefile->DisplayStatus(message.c_str(), -1); diff --git a/Source/cmMessenger.cxx b/Source/cmMessenger.cxx new file mode 100644 index 0000000..43fa150 --- /dev/null +++ b/Source/cmMessenger.cxx @@ -0,0 +1,209 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#include "cmMessenger.h" +#include "cmDocumentationFormatter.h" +#include "cmMessenger.h" +#include "cmOutputConverter.h" + +#if defined(CMAKE_BUILD_WITH_CMAKE) +#include <cmsys/SystemInformation.hxx> +#endif + +cmake::MessageType cmMessenger::ConvertMessageType(cmake::MessageType t) const +{ + bool warningsAsErrors; + + if (t == cmake::AUTHOR_WARNING || t == cmake::AUTHOR_ERROR) { + warningsAsErrors = this->GetDevWarningsAsErrors(); + if (warningsAsErrors && t == cmake::AUTHOR_WARNING) { + t = cmake::AUTHOR_ERROR; + } else if (!warningsAsErrors && t == cmake::AUTHOR_ERROR) { + t = cmake::AUTHOR_WARNING; + } + } else if (t == cmake::DEPRECATION_WARNING || + t == cmake::DEPRECATION_ERROR) { + warningsAsErrors = this->GetDeprecatedWarningsAsErrors(); + if (warningsAsErrors && t == cmake::DEPRECATION_WARNING) { + t = cmake::DEPRECATION_ERROR; + } else if (!warningsAsErrors && t == cmake::DEPRECATION_ERROR) { + t = cmake::DEPRECATION_WARNING; + } + } + + return t; +} + +bool cmMessenger::IsMessageTypeVisible(cmake::MessageType t) const +{ + bool isVisible = true; + + if (t == cmake::DEPRECATION_ERROR) { + if (!this->GetDeprecatedWarningsAsErrors()) { + isVisible = false; + } + } else if (t == cmake::DEPRECATION_WARNING) { + if (this->GetSuppressDeprecatedWarnings()) { + isVisible = false; + } + } else if (t == cmake::AUTHOR_ERROR) { + if (!this->GetDevWarningsAsErrors()) { + isVisible = false; + } + } else if (t == cmake::AUTHOR_WARNING) { + if (this->GetSuppressDevWarnings()) { + isVisible = false; + } + } + + return isVisible; +} + +static bool printMessagePreamble(cmake::MessageType t, std::ostream& msg) +{ + // Construct the message header. + if (t == cmake::FATAL_ERROR) { + msg << "CMake Error"; + } else if (t == cmake::INTERNAL_ERROR) { + msg << "CMake Internal Error (please report a bug)"; + } else if (t == cmake::LOG) { + msg << "CMake Debug Log"; + } else if (t == cmake::DEPRECATION_ERROR) { + msg << "CMake Deprecation Error"; + } else if (t == cmake::DEPRECATION_WARNING) { + msg << "CMake Deprecation Warning"; + } else if (t == cmake::AUTHOR_WARNING) { + msg << "CMake Warning (dev)"; + } else if (t == cmake::AUTHOR_ERROR) { + msg << "CMake Error (dev)"; + } else { + msg << "CMake Warning"; + } + return true; +} + +void printMessageText(std::ostream& msg, std::string const& text) +{ + msg << ":\n"; + cmDocumentationFormatter formatter; + formatter.SetIndent(" "); + formatter.PrintFormatted(msg, text.c_str()); +} + +void displayMessage(cmake::MessageType t, std::ostringstream& msg) +{ + // Add a note about warning suppression. + if (t == cmake::AUTHOR_WARNING) { + msg << "This warning is for project developers. Use -Wno-dev to suppress " + "it."; + } else if (t == cmake::AUTHOR_ERROR) { + msg << "This error is for project developers. Use -Wno-error=dev to " + "suppress " + "it."; + } + + // Add a terminating blank line. + msg << "\n"; + +#if defined(CMAKE_BUILD_WITH_CMAKE) + // Add a C++ stack trace to internal errors. + if (t == cmake::INTERNAL_ERROR) { + std::string stack = cmsys::SystemInformation::GetProgramStack(0, 0); + if (!stack.empty()) { + if (cmHasLiteralPrefix(stack, "WARNING:")) { + stack = "Note:" + stack.substr(8); + } + msg << stack << "\n"; + } + } +#endif + + // Output the message. + if (t == cmake::FATAL_ERROR || t == cmake::INTERNAL_ERROR || + t == cmake::DEPRECATION_ERROR || t == cmake::AUTHOR_ERROR) { + cmSystemTools::SetErrorOccured(); + cmSystemTools::Message(msg.str().c_str(), "Error"); + } else { + cmSystemTools::Message(msg.str().c_str(), "Warning"); + } +} + +cmMessenger::cmMessenger(cmState* state) + : State(state) +{ +} + +void cmMessenger::IssueMessage(cmake::MessageType t, const std::string& text, + const cmListFileBacktrace& backtrace) const +{ + bool force = false; + if (!force) { + // override the message type, if needed, for warnings and errors + cmake::MessageType override = this->ConvertMessageType(t); + if (override != t) { + t = override; + force = true; + } + } + + if (!force && !this->IsMessageTypeVisible(t)) { + return; + } + this->DisplayMessage(t, text, backtrace); +} + +void cmMessenger::DisplayMessage(cmake::MessageType t, const std::string& text, + const cmListFileBacktrace& backtrace) const +{ + std::ostringstream msg; + if (!printMessagePreamble(t, msg)) { + return; + } + + // Add the immediate context. + backtrace.PrintTitle(msg); + + printMessageText(msg, text); + + // Add the rest of the context. + backtrace.PrintCallStack(msg); + + displayMessage(t, msg); +} + +bool cmMessenger::GetSuppressDevWarnings() const +{ + const char* cacheEntryValue = + this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_WARNINGS"); + return cmSystemTools::IsOn(cacheEntryValue); +} + +bool cmMessenger::GetSuppressDeprecatedWarnings() const +{ + const char* cacheEntryValue = + this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED"); + return cacheEntryValue && cmSystemTools::IsOff(cacheEntryValue); +} + +bool cmMessenger::GetDevWarningsAsErrors() const +{ + const char* cacheEntryValue = + this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_ERRORS"); + return cacheEntryValue && cmSystemTools::IsOff(cacheEntryValue); +} + +bool cmMessenger::GetDeprecatedWarningsAsErrors() const +{ + const char* cacheEntryValue = + this->State->GetCacheEntryValue("CMAKE_ERROR_DEPRECATED"); + return cmSystemTools::IsOn(cacheEntryValue); +} diff --git a/Source/cmMessenger.h b/Source/cmMessenger.h new file mode 100644 index 0000000..f15bf13 --- /dev/null +++ b/Source/cmMessenger.h @@ -0,0 +1,44 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmMessenger_h +#define cmMessenger_h + +#include "cmListFileCache.h" +#include "cmState.h" +#include "cmake.h" + +class cmMessenger +{ +public: + cmMessenger(cmState* state); + + void IssueMessage( + cmake::MessageType t, std::string const& text, + cmListFileBacktrace const& backtrace = cmListFileBacktrace()) const; + + void DisplayMessage(cmake::MessageType t, std::string const& text, + cmListFileBacktrace const& backtrace) const; + + bool GetSuppressDevWarnings() const; + bool GetSuppressDeprecatedWarnings() const; + bool GetDevWarningsAsErrors() const; + bool GetDeprecatedWarningsAsErrors() const; + +private: + bool IsMessageTypeVisible(cmake::MessageType t) const; + cmake::MessageType ConvertMessageType(cmake::MessageType t) const; + + cmState* State; +}; + +#endif diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 74c3f71..701a5e5 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -19,6 +19,7 @@ #include "cmFileTimeComparison.h" #include "cmLocalGenerator.h" #include "cmMakefile.h" +#include "cmMessenger.h" #include "cmSourceFile.h" #include "cmState.h" #include "cmTest.h" @@ -152,6 +153,7 @@ cmake::cmake() this->State = new cmState; this->CurrentSnapshot = this->State->CreateBaseSnapshot(); + this->Messenger = new cmMessenger(this->State); #ifdef __APPLE__ struct rlimit rlp; @@ -207,6 +209,7 @@ cmake::cmake() cmake::~cmake() { delete this->State; + delete this->Messenger; if (this->GlobalGenerator) { delete this->GlobalGenerator; this->GlobalGenerator = CM_NULLPTR; @@ -2281,160 +2284,10 @@ static bool cmakeCheckStampList(const char* stampList) return true; } -cmake::MessageType cmake::ConvertMessageType(cmake::MessageType t) const -{ - bool warningsAsErrors; - - if (t == cmake::AUTHOR_WARNING || t == cmake::AUTHOR_ERROR) { - warningsAsErrors = this->GetDevWarningsAsErrors(); - if (warningsAsErrors && t == cmake::AUTHOR_WARNING) { - t = cmake::AUTHOR_ERROR; - } else if (!warningsAsErrors && t == cmake::AUTHOR_ERROR) { - t = cmake::AUTHOR_WARNING; - } - } else if (t == cmake::DEPRECATION_WARNING || - t == cmake::DEPRECATION_ERROR) { - warningsAsErrors = this->GetDeprecatedWarningsAsErrors(); - if (warningsAsErrors && t == cmake::DEPRECATION_WARNING) { - t = cmake::DEPRECATION_ERROR; - } else if (!warningsAsErrors && t == cmake::DEPRECATION_ERROR) { - t = cmake::DEPRECATION_WARNING; - } - } - - return t; -} - -bool cmake::IsMessageTypeVisible(cmake::MessageType t) const -{ - bool isVisible = true; - - if (t == cmake::DEPRECATION_ERROR) { - if (!this->GetDeprecatedWarningsAsErrors()) { - isVisible = false; - } - } else if (t == cmake::DEPRECATION_WARNING) { - if (this->GetSuppressDeprecatedWarnings()) { - isVisible = false; - } - } else if (t == cmake::AUTHOR_ERROR) { - if (!this->GetDevWarningsAsErrors()) { - isVisible = false; - } - } else if (t == cmake::AUTHOR_WARNING) { - if (this->GetSuppressDevWarnings()) { - isVisible = false; - } - } - - return isVisible; -} - -static bool printMessagePreamble(cmake::MessageType t, std::ostream& msg) -{ - // Construct the message header. - if (t == cmake::FATAL_ERROR) { - msg << "CMake Error"; - } else if (t == cmake::INTERNAL_ERROR) { - msg << "CMake Internal Error (please report a bug)"; - } else if (t == cmake::LOG) { - msg << "CMake Debug Log"; - } else if (t == cmake::DEPRECATION_ERROR) { - msg << "CMake Deprecation Error"; - } else if (t == cmake::DEPRECATION_WARNING) { - msg << "CMake Deprecation Warning"; - } else if (t == cmake::AUTHOR_WARNING) { - msg << "CMake Warning (dev)"; - } else if (t == cmake::AUTHOR_ERROR) { - msg << "CMake Error (dev)"; - } else { - msg << "CMake Warning"; - } - return true; -} - -void printMessageText(std::ostream& msg, std::string const& text) -{ - msg << ":\n"; - cmDocumentationFormatter formatter; - formatter.SetIndent(" "); - formatter.PrintFormatted(msg, text.c_str()); -} - -void displayMessage(cmake::MessageType t, std::ostringstream& msg) -{ - - // Add a note about warning suppression. - if (t == cmake::AUTHOR_WARNING) { - msg << "This warning is for project developers. Use -Wno-dev to suppress " - "it."; - } else if (t == cmake::AUTHOR_ERROR) { - msg << "This error is for project developers. Use -Wno-error=dev to " - "suppress " - "it."; - } - - // Add a terminating blank line. - msg << "\n"; - -#if defined(CMAKE_BUILD_WITH_CMAKE) - // Add a C++ stack trace to internal errors. - if (t == cmake::INTERNAL_ERROR) { - std::string stack = cmsys::SystemInformation::GetProgramStack(0, 0); - if (!stack.empty()) { - if (cmHasLiteralPrefix(stack, "WARNING:")) { - stack = "Note:" + stack.substr(8); - } - msg << stack << "\n"; - } - } -#endif - - // Output the message. - if (t == cmake::FATAL_ERROR || t == cmake::INTERNAL_ERROR || - t == cmake::DEPRECATION_ERROR || t == cmake::AUTHOR_ERROR) { - cmSystemTools::SetErrorOccured(); - cmSystemTools::Message(msg.str().c_str(), "Error"); - } else { - cmSystemTools::Message(msg.str().c_str(), "Warning"); - } -} - void cmake::IssueMessage(cmake::MessageType t, std::string const& text, cmListFileBacktrace const& backtrace) const { - bool force = false; - // override the message type, if needed, for warnings and errors - cmake::MessageType override = this->ConvertMessageType(t); - if (override != t) { - t = override; - force = true; - } - - if (!force && !this->IsMessageTypeVisible(t)) { - return; - } - - this->DisplayMessage(t, text, backtrace); -} - -void cmake::DisplayMessage(cmake::MessageType t, std::string const& text, - cmListFileBacktrace const& backtrace) const -{ - std::ostringstream msg; - if (!printMessagePreamble(t, msg)) { - return; - } - - // Add the immediate context. - backtrace.PrintTitle(msg); - - printMessageText(msg, text); - - // Add the rest of the context. - backtrace.PrintCallStack(msg); - - displayMessage(t, msg); + this->Messenger->IssueMessage(t, text, backtrace); } std::vector<std::string> cmake::GetDebugConfigs() @@ -2454,6 +2307,11 @@ std::vector<std::string> cmake::GetDebugConfigs() return configs; } +cmMessenger* cmake::GetMessenger() const +{ + return this->Messenger; +} + int cmake::Build(const std::string& dir, const std::string& target, const std::string& config, const std::vector<std::string>& nativeOptions, bool clean) @@ -2560,9 +2418,7 @@ void cmake::RunCheckForUnusedVariables() bool cmake::GetSuppressDevWarnings() const { - const char* cacheEntryValue = - this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_WARNINGS"); - return cmSystemTools::IsOn(cacheEntryValue); + return this->Messenger->GetSuppressDevWarnings(); } void cmake::SetSuppressDevWarnings(bool b) @@ -2586,9 +2442,7 @@ void cmake::SetSuppressDevWarnings(bool b) bool cmake::GetSuppressDeprecatedWarnings() const { - const char* cacheEntryValue = - this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED"); - return cacheEntryValue && cmSystemTools::IsOff(cacheEntryValue); + return this->Messenger->GetSuppressDeprecatedWarnings(); } void cmake::SetSuppressDeprecatedWarnings(bool b) @@ -2612,9 +2466,7 @@ void cmake::SetSuppressDeprecatedWarnings(bool b) bool cmake::GetDevWarningsAsErrors() const { - const char* cacheEntryValue = - this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_ERRORS"); - return cacheEntryValue && cmSystemTools::IsOff(cacheEntryValue); + return this->Messenger->GetDevWarningsAsErrors(); } void cmake::SetDevWarningsAsErrors(bool b) @@ -2638,9 +2490,7 @@ void cmake::SetDevWarningsAsErrors(bool b) bool cmake::GetDeprecatedWarningsAsErrors() const { - const char* cacheEntryValue = - this->State->GetCacheEntryValue("CMAKE_ERROR_DEPRECATED"); - return cmSystemTools::IsOn(cacheEntryValue); + return this->Messenger->GetDeprecatedWarningsAsErrors(); } void cmake::SetDeprecatedWarningsAsErrors(bool b) diff --git a/Source/cmake.h b/Source/cmake.h index 343d371..dbe936b 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -25,6 +25,7 @@ class cmGlobalGeneratorFactory; class cmGlobalGenerator; class cmLocalGenerator; class cmMakefile; +class cmMessenger; class cmVariableWatch; class cmFileTimeComparison; class cmExternalMakefileProjectGeneratorFactory; @@ -346,6 +347,8 @@ public: return this->CMakeEditCommand; } + cmMessenger* GetMessenger() const; + /* * Get the state of the suppression of developer (author) warnings. * Returns false, by default, if developer warnings should be shown, true @@ -395,9 +398,6 @@ public: cmake::MessageType t, std::string const& text, cmListFileBacktrace const& backtrace = cmListFileBacktrace()) const; - void DisplayMessage(cmake::MessageType t, std::string const& text, - cmListFileBacktrace const& backtrace) const; - ///! run the --build option int Build(const std::string& dir, const std::string& target, const std::string& config, @@ -491,6 +491,7 @@ private: cmState* State; cmState::Snapshot CurrentSnapshot; + cmMessenger* Messenger; std::vector<std::string> TraceOnlyThisSources; |