From db7de303c2a1e35b672016833db4bf85148c98c2 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:24 +0100 Subject: [PATCH 1/6] Parser: Store the Backtrace for use in issuing messages --- Source/cmListFileCache.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx index 1967d2a1a..1a2ddaff4 100644 --- a/Source/cmListFileCache.cxx +++ b/Source/cmListFileCache.cxx @@ -30,6 +30,7 @@ struct cmListFileParser cmListFileArgument::Delimiter delim); cmListFile* ListFile; cmMakefile* Makefile; + cmListFileBacktrace Backtrace; const char* FileName; cmListFileLexer* Lexer; cmListFileFunction Function; @@ -45,6 +46,7 @@ cmListFileParser::cmListFileParser(cmListFile* lf, cmMakefile* mf, const char* filename) : ListFile(lf) , Makefile(mf) + , Backtrace(mf->GetBacktrace()) , FileName(filename) , Lexer(cmListFileLexer_New()) { From 33bb9cfa365f494bb76ff9c2c78ad625e77152ec Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:23 +0100 Subject: [PATCH 2/6] Parser: Issue messages through cmake, not cmSystemTools Make these messages uniform with regard to other messages issued by cmake. --- Source/cmListFileCache.cxx | 70 +++++++++++-------- .../Syntax/BracketComment4-stderr.txt | 11 ++- .../Syntax/BracketNoSpace0-stderr.txt | 6 +- .../Syntax/BracketNoSpace1-stderr.txt | 6 +- .../Syntax/BracketNoSpace2-stderr.txt | 6 +- .../Syntax/BracketNoSpace3-stderr.txt | 6 +- .../Syntax/BracketNoSpace4-stderr.txt | 6 +- .../Syntax/BracketNoSpace5-stderr.txt | 6 +- .../RunCMake/Syntax/CommandError0-stderr.txt | 12 ++-- .../RunCMake/Syntax/CommandError1-stderr.txt | 11 ++- .../RunCMake/Syntax/CommandError2-stderr.txt | 12 ++-- Tests/RunCMake/Syntax/ParenInENV-stderr.txt | 8 +-- .../RunCMake/Syntax/ParenNoSpace1-stderr.txt | 18 ++--- .../RunCMake/Syntax/StringNoSpace-stderr.txt | 12 ++-- .../Syntax/UnterminatedBracket0-stderr.txt | 13 ++-- .../Syntax/UnterminatedBracket1-stderr.txt | 13 ++-- .../UnterminatedBracketComment-stderr.txt | 13 ++-- .../Syntax/UnterminatedCall1-stderr.txt | 11 ++- .../Syntax/UnterminatedCall2-stderr.txt | 11 ++- .../Syntax/UnterminatedString-stderr.txt | 13 ++-- 20 files changed, 115 insertions(+), 149 deletions(-) diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx index 1a2ddaff4..9204d1480 100644 --- a/Source/cmListFileCache.cxx +++ b/Source/cmListFileCache.cxx @@ -24,6 +24,7 @@ struct cmListFileParser cmListFileParser(cmListFile* lf, cmMakefile* mf, 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, @@ -62,6 +63,18 @@ void cmListFileParser::IssueFileOpenError(const std::string& text) const this->Makefile->IssueMessage(cmake::FATAL_ERROR, text); } +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->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, text, + lfbt); + cmSystemTools::SetFatalErrorOccured(); +} + bool cmListFileParser::ParseFile() { // Open the file. @@ -98,22 +111,18 @@ 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; } } @@ -156,18 +165,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; } @@ -219,25 +225,25 @@ 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->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, + error.str(), lfbt); return false; } @@ -252,17 +258,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->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, m.str(), lfbt); return false; } - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, m.str()); + this->Makefile->GetCMakeInstance()->IssueMessage(cmake::AUTHOR_WARNING, m.str(), lfbt); return true; } diff --git a/Tests/RunCMake/Syntax/BracketComment4-stderr.txt b/Tests/RunCMake/Syntax/BracketComment4-stderr.txt index 8ba32c22c..6bbb980e6 100644 --- a/Tests/RunCMake/Syntax/BracketComment4-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketComment4-stderr.txt @@ -1,7 +1,4 @@ -CMake Error: Error in cmake code at -.*/Tests/RunCMake/Syntax/BracketComment4.cmake:3: -Parse error. Expected a newline, got identifier with text "message". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: - - BracketComment4.cmake +CMake Error at BracketComment4.cmake:3: + Parse error. Expected a newline, got identifier with text "message". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/BracketNoSpace0-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace0-stderr.txt index a28828004..0a52022ac 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace0-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace0-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace0.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace0.cmake:1:27 +CMake Error at BracketNoSpace0.cmake:1: + Syntax Error in cmake code at column 27 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/BracketNoSpace1-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace1-stderr.txt index 391e11b7e..43bf99543 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace1-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace1-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace1.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace1.cmake:1:24 +CMake Error at BracketNoSpace1.cmake:1: + Syntax Error in cmake code at column 24 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/BracketNoSpace2-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace2-stderr.txt index acaf7fe6e..f78b4bdf1 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace2-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace2-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace2.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace2.cmake:1:44 +CMake Error at BracketNoSpace2.cmake:1: + Syntax Error in cmake code at column 44 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/BracketNoSpace3-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace3-stderr.txt index f12b2e50b..63ca600cd 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace3-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace3-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace3.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace3.cmake:1:45 +CMake Error at BracketNoSpace3.cmake:1: + Syntax Error in cmake code at column 45 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/BracketNoSpace4-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace4-stderr.txt index 71577632d..318b0e344 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace4-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace4-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace4.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace4.cmake:1:44 +CMake Error at BracketNoSpace4.cmake:1: + Syntax Error in cmake code at column 44 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/BracketNoSpace5-stderr.txt b/Tests/RunCMake/Syntax/BracketNoSpace5-stderr.txt index c13969ddc..a68478a60 100644 --- a/Tests/RunCMake/Syntax/BracketNoSpace5-stderr.txt +++ b/Tests/RunCMake/Syntax/BracketNoSpace5-stderr.txt @@ -1,7 +1,5 @@ -CMake Error in BracketNoSpace5.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/BracketNoSpace5.cmake:1:45 +CMake Error at BracketNoSpace5.cmake:1: + Syntax Error in cmake code at column 45 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/CommandError0-stderr.txt b/Tests/RunCMake/Syntax/CommandError0-stderr.txt index 24d7997ad..e584fb0df 100644 --- a/Tests/RunCMake/Syntax/CommandError0-stderr.txt +++ b/Tests/RunCMake/Syntax/CommandError0-stderr.txt @@ -1,8 +1,6 @@ -CMake Error: Error in cmake code at -.*/Tests/RunCMake/Syntax/CommandError0.cmake:2: -Parse error. Expected "\(", got newline with text " -". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: +CMake Error at CommandError0.cmake:2: + Parse error. Expected "\(", got newline with text " - CommandError0.cmake + ". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/CommandError1-stderr.txt b/Tests/RunCMake/Syntax/CommandError1-stderr.txt index 599f60021..c3bf93cce 100644 --- a/Tests/RunCMake/Syntax/CommandError1-stderr.txt +++ b/Tests/RunCMake/Syntax/CommandError1-stderr.txt @@ -1,7 +1,4 @@ -CMake Error: Error in cmake code at -.*/Tests/RunCMake/Syntax/CommandError1.cmake:1: -Parse error. Expected a newline, got identifier with text "message". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: - - CommandError1.cmake +CMake Error at CommandError1.cmake:1: + Parse error. Expected a newline, got identifier with text "message". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/CommandError2-stderr.txt b/Tests/RunCMake/Syntax/CommandError2-stderr.txt index f4dfc7749..4fe28a98c 100644 --- a/Tests/RunCMake/Syntax/CommandError2-stderr.txt +++ b/Tests/RunCMake/Syntax/CommandError2-stderr.txt @@ -1,7 +1,5 @@ -CMake Error: Error in cmake code at -.*/Tests/RunCMake/Syntax/CommandError2.cmake:1: -Parse error. Expected a command name, got bracket argument with text "oops-not-a-comment". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: - - CommandError2.cmake +CMake Error at CommandError2.cmake:1: + Parse error. Expected a command name, got bracket argument with text + "oops-not-a-comment". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/ParenInENV-stderr.txt b/Tests/RunCMake/Syntax/ParenInENV-stderr.txt index 37c5d6eb2..d7861e2eb 100644 --- a/Tests/RunCMake/Syntax/ParenInENV-stderr.txt +++ b/Tests/RunCMake/Syntax/ParenInENV-stderr.txt @@ -1,7 +1,5 @@ -CMake Warning \(dev\) in ParenInENV.cmake: - Syntax Warning in cmake code at - - .*/Tests/RunCMake/Syntax/ParenInENV.cmake:2:21 +CMake Warning \(dev\) at ParenInENV.cmake:2: + Syntax Warning in cmake code at column 21 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): @@ -11,7 +9,7 @@ This warning is for project developers. Use -Wno-dev to suppress it. CMake Error at ParenInENV.cmake:2 \(message\): Syntax error in cmake code at - .*/Tests/RunCMake/Syntax/ParenInENV.cmake:2 + .*Tests/RunCMake/Syntax/ParenInENV.cmake:2 when parsing string diff --git a/Tests/RunCMake/Syntax/ParenNoSpace1-stderr.txt b/Tests/RunCMake/Syntax/ParenNoSpace1-stderr.txt index 45b2e6a6a..79582494c 100644 --- a/Tests/RunCMake/Syntax/ParenNoSpace1-stderr.txt +++ b/Tests/RunCMake/Syntax/ParenNoSpace1-stderr.txt @@ -1,27 +1,21 @@ -CMake Warning \(dev\) in ParenNoSpace1.cmake: - Syntax Warning in cmake code at - - .*/Tests/RunCMake/Syntax/ParenNoSpace1.cmake:1:26 +CMake Warning \(dev\) at ParenNoSpace1.cmake:1: + Syntax Warning in cmake code at column 26 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) This warning is for project developers. Use -Wno-dev to suppress it. -CMake Warning \(dev\) in ParenNoSpace1.cmake: - Syntax Warning in cmake code at - - .*/Tests/RunCMake/Syntax/ParenNoSpace1.cmake:2:26 +CMake Warning \(dev\) at ParenNoSpace1.cmake:2: + Syntax Warning in cmake code at column 26 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) This warning is for project developers. Use -Wno-dev to suppress it. -CMake Error in ParenNoSpace1.cmake: - Syntax Error in cmake code at - - .*/Tests/RunCMake/Syntax/ParenNoSpace1.cmake:3:29 +CMake Error at ParenNoSpace1.cmake:3: + Syntax Error in cmake code at column 29 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/StringNoSpace-stderr.txt b/Tests/RunCMake/Syntax/StringNoSpace-stderr.txt index a4ec6e779..817fcfa3b 100644 --- a/Tests/RunCMake/Syntax/StringNoSpace-stderr.txt +++ b/Tests/RunCMake/Syntax/StringNoSpace-stderr.txt @@ -1,17 +1,13 @@ -CMake Warning \(dev\) in StringNoSpace.cmake: - Syntax Warning in cmake code at - - .*/Tests/RunCMake/Syntax/StringNoSpace.cmake:2:28 +CMake Warning \(dev\) at StringNoSpace.cmake:2: + Syntax Warning in cmake code at column 28 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) This warning is for project developers. Use -Wno-dev to suppress it. -CMake Warning \(dev\) in StringNoSpace.cmake: - Syntax Warning in cmake code at - - .*/Tests/RunCMake/Syntax/StringNoSpace.cmake:2:31 +CMake Warning \(dev\) at StringNoSpace.cmake:2: + Syntax Warning in cmake code at column 31 Argument not separated from preceding token by whitespace. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/Syntax/UnterminatedBracket0-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedBracket0-stderr.txt index 3559c1893..de33f7dff 100644 --- a/Tests/RunCMake/Syntax/UnterminatedBracket0-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedBracket0-stderr.txt @@ -1,8 +1,7 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedBracket0.cmake:2: -Parse error. Function missing ending "\)". Instead found unterminated bracket with text "\) -". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: +CMake Error at UnterminatedBracket0.cmake:2: + Parse error. Function missing ending "\)". Instead found unterminated + bracket with text "\) - UnterminatedBracket0.cmake$ + ". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/UnterminatedBracket1-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedBracket1-stderr.txt index 55d458ba2..86bfa2a86 100644 --- a/Tests/RunCMake/Syntax/UnterminatedBracket1-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedBracket1-stderr.txt @@ -1,8 +1,7 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedBracket1.cmake:2: -Parse error. Function missing ending "\)". Instead found unterminated bracket with text "\]\]\) -". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: +CMake Error at UnterminatedBracket1.cmake:2: + Parse error. Function missing ending "\)". Instead found unterminated + bracket with text "]]\) - UnterminatedBracket1.cmake$ + ". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/UnterminatedBracketComment-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedBracketComment-stderr.txt index 0a799eb5a..4ec78a17b 100644 --- a/Tests/RunCMake/Syntax/UnterminatedBracketComment-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedBracketComment-stderr.txt @@ -1,8 +1,7 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedBracketComment.cmake:1: -Parse error. Expected a command name, got unterminated bracket with text "#\]\] -". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: +CMake Error at UnterminatedBracketComment.cmake:3: + Parse error. Expected a command name, got unterminated bracket with text + "#]] - UnterminatedBracketComment.cmake + ". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/UnterminatedCall1-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedCall1-stderr.txt index 281ce0da8..3f5224487 100644 --- a/Tests/RunCMake/Syntax/UnterminatedCall1-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedCall1-stderr.txt @@ -1,7 +1,4 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedCall1.cmake:2: -Parse error. Function missing ending "\)". End of file reached. -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: - - UnterminatedCall1.cmake +CMake Error at UnterminatedCall1.cmake:2: + Parse error. Function missing ending "\)". End of file reached. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/UnterminatedCall2-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedCall2-stderr.txt index 065de30fc..18656f713 100644 --- a/Tests/RunCMake/Syntax/UnterminatedCall2-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedCall2-stderr.txt @@ -1,7 +1,4 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedCall2.cmake:4: -Parse error. Function missing ending "\)". End of file reached. -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: - - UnterminatedCall2.cmake +CMake Error at UnterminatedCall2.cmake:4: + Parse error. Function missing ending "\)". End of file reached. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/Syntax/UnterminatedString-stderr.txt b/Tests/RunCMake/Syntax/UnterminatedString-stderr.txt index d9250328d..79c3fd224 100644 --- a/Tests/RunCMake/Syntax/UnterminatedString-stderr.txt +++ b/Tests/RunCMake/Syntax/UnterminatedString-stderr.txt @@ -1,8 +1,7 @@ -CMake Error: Error in cmake code at -.*/Syntax/UnterminatedString.cmake:2: -Parse error. Function missing ending "\)". Instead found unterminated string with text "\) -". -CMake Error at CMakeLists.txt:3 \(include\): - include could not find load file: +CMake Error at UnterminatedString.cmake:2: + Parse error. Function missing ending "\)". Instead found unterminated + string with text "\) - UnterminatedString.cmake$ + ". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) From 2af853deb5225a9c8cb3d1e6311680c3fb7d86aa Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:28 +0100 Subject: [PATCH 3/6] cmMakefile: Simplify IssueMessage implementation It is only called during configure time when the execution stack is non-empty. --- Source/cmMakefile.cxx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index b9d71ec89..d299b8bf7 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -115,11 +115,9 @@ 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); - } + assert(!this->ExecutionStatusStack.empty()); + if ((t == cmake::FATAL_ERROR) || (t == cmake::INTERNAL_ERROR)) { + this->ExecutionStatusStack.back()->SetNestedError(true); } this->GetCMakeInstance()->IssueMessage(t, text, this->GetBacktrace()); } From 14a8d61fd49a9b990cbef7e1495e4763f31c55f2 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:29 +0100 Subject: [PATCH 4/6] cmMakefile: Port nested error logic away from cmExecutionStatus It is no longer needed. --- Source/cmExecutionStatus.h | 4 ---- Source/cmFunctionCommand.cxx | 6 +++--- Source/cmMacroCommand.cxx | 4 ++-- Source/cmMakefile.cxx | 18 +++++++++++------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/cmExecutionStatus.h b/Source/cmExecutionStatus.h index 508c6bdfe..800651407 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 40c54dbdc..f0e4854bf 100644 --- a/Source/cmFunctionCommand.cxx +++ b/Source/cmFunctionCommand.cxx @@ -76,7 +76,7 @@ public: }; bool cmFunctionHelperCommand::InvokeInitialPass( - const std::vector& args, cmExecutionStatus& inStatus) + const std::vector& args, cmExecutionStatus&) { // Expand the argument list to the function. std::vector 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/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index ee9dc8af7..9d312eebc 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 d299b8bf7..6c83b0622 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -115,10 +115,6 @@ cmMakefile::~cmMakefile() void cmMakefile::IssueMessage(cmake::MessageType t, std::string const& text) const { - assert(!this->ExecutionStatusStack.empty()); - if ((t == cmake::FATAL_ERROR) || (t == cmake::INTERNAL_ERROR)) { - this->ExecutionStatusStack.back()->SetNestedError(true); - } this->GetCMakeInstance()->IssueMessage(t, text, this->GetBacktrace()); } @@ -279,11 +275,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()); } From 421012a330989a64b24a3289379bb4938e6ed3ea Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:27 +0100 Subject: [PATCH 5/6] cmMessenger: Extract from cmake class This way messages can be issued independent of the cmake instance. It is now possible to make DisplayMessage a virtual interface and override it to handle messages in the cmake-gui or future IDE interaction interfaces. --- Source/CMakeLists.txt | 2 + Source/cmMessageCommand.cxx | 6 +- Source/cmMessenger.cxx | 209 ++++++++++++++++++++++++++++++++++++ Source/cmMessenger.h | 44 ++++++++ Source/cmake.cxx | 176 +++--------------------------- Source/cmake.h | 7 +- bootstrap | 1 + 7 files changed, 277 insertions(+), 168 deletions(-) create mode 100644 Source/cmMessenger.cxx create mode 100644 Source/cmMessenger.h diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index e63bf5aeb..3b94df737 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/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx index 080880bcb..c48910e03 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 const& args, cmExecutionStatus&) @@ -65,8 +67,8 @@ bool cmMessageCommand::InitialPass(std::vector 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 000000000..43fa15067 --- /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 +#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 000000000..f15bf1392 --- /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 74c3f7108..701a5e5e1 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 cmake::GetDebugConfigs() @@ -2454,6 +2307,11 @@ std::vector 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& 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 343d37120..dbe936ba4 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 TraceOnlyThisSources; diff --git a/bootstrap b/bootstrap index 742fa2b87..6c6713eab 100755 --- a/bootstrap +++ b/bootstrap @@ -266,6 +266,7 @@ CMAKE_CXX_SOURCES="\ cmPropertyDefinition \ cmPropertyDefinitionMap \ cmMakefile \ + cmMessenger \ cmExportBuildFileGenerator \ cmExportFileGenerator \ cmExportInstallFileGenerator \ From 1462576bcba68310395a7185e4b77da38e1e6b33 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 28 Jan 2016 22:10:28 +0100 Subject: [PATCH 6/6] Parser: Port away from cmMakefile It is an unneeded dependency. --- Source/cmListFileCache.cxx | 31 ++++++++++++++++--------------- Source/cmListFileCache.h | 5 +++-- Source/cmMakefile.cxx | 15 ++++++++++++--- Source/cmMakefile.h | 1 + 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx index 9204d1480..39d9e9704 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,7 +21,8 @@ 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; @@ -30,8 +31,8 @@ struct cmListFileParser bool AddArgument(cmListFileLexer_Token* token, cmListFileArgument::Delimiter delim); cmListFile* ListFile; - cmMakefile* Makefile; cmListFileBacktrace Backtrace; + cmMessenger* Messenger; const char* FileName; cmListFileLexer* Lexer; cmListFileFunction Function; @@ -43,11 +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(mf->GetBacktrace()) + , Backtrace(lfbt) + , Messenger(messenger) , FileName(filename) , Lexer(cmListFileLexer_New()) { @@ -60,7 +62,7 @@ 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 @@ -70,8 +72,7 @@ void cmListFileParser::IssueError(const std::string& text) const lfc.Line = cmListFileLexer_GetCurrentLine(this->Lexer); cmListFileBacktrace lfbt = this->Backtrace; lfbt = lfbt.Push(lfc); - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, text, - lfbt); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, text, lfbt); cmSystemTools::SetFatalErrorOccured(); } @@ -129,7 +130,8 @@ bool cmListFileParser::ParseFile() 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)) { @@ -139,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(); } @@ -242,8 +244,7 @@ bool cmListFileParser::ParseFunction(const char* name, long line) lfbt = lfbt.Push(lfc); error << "Parse error. Function missing ending \")\". " << "End of file reached."; - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, - error.str(), lfbt); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, error.str(), lfbt); return false; } @@ -269,10 +270,10 @@ bool cmListFileParser::AddArgument(cmListFileLexer_Token* token, << "Argument not separated from preceding token by whitespace."; /* clang-format on */ if (isError) { - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, m.str(), lfbt); + this->Messenger->IssueMessage(cmake::FATAL_ERROR, m.str(), lfbt); return false; } - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::AUTHOR_WARNING, m.str(), lfbt); + this->Messenger->IssueMessage(cmake::AUTHOR_WARNING, m.str(), lfbt); return true; } diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h index f3e6f7008..cd4453680 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 Functions; }; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 6c83b0622..6e4779746 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" @@ -457,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; } @@ -506,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; } @@ -1452,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()) { @@ -3274,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 d082964a1..b3587c5a7 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; /**