Skip to content

Commit

Permalink
Merge branch 'fix-CMP0054-elseif-warning' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
bradking committed Oct 21, 2015
2 parents 779b6ac + d6a03b4 commit 2ad1fed
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 12 deletions.
40 changes: 35 additions & 5 deletions Source/cmConditionEvaluator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,14 @@
============================================================================*/

#include "cmConditionEvaluator.h"
#include "cmOutputConverter.h"

cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile):
cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile,
const cmListFileContext &context,
const cmListFileBacktrace& bt):
Makefile(makefile),
ExecutionContext(context),
Backtrace(bt),
Policy12Status(makefile.GetPolicyStatus(cmPolicies::CMP0012)),
Policy54Status(makefile.GetPolicyStatus(cmPolicies::CMP0054)),
Policy57Status(makefile.GetPolicyStatus(cmPolicies::CMP0057)),
Expand Down Expand Up @@ -98,6 +103,25 @@ bool cmConditionEvaluator::IsTrue(
errorString, status, true);
}

cmListFileContext cmConditionEvaluator::GetConditionContext(
cmMakefile* mf,
const cmCommandContext& command,
const std::string& filePath)
{
cmListFileContext context =
cmListFileContext::FromCommandContext(
command,
filePath);

if(!mf->GetCMakeInstance()->GetIsInTryCompile())
{
cmOutputConverter converter(mf->GetStateSnapshot());
context.FilePath = converter.Convert(context.FilePath,
cmOutputConverter::HOME);
}
return context;
}

//=========================================================================
const char* cmConditionEvaluator::GetDefinitionIfUnquoted(
cmExpandedCommandArgument const& argument) const
Expand All @@ -113,7 +137,8 @@ const char* cmConditionEvaluator::GetDefinitionIfUnquoted(

if(def && argument.WasQuoted() && this->Policy54Status == cmPolicies::WARN)
{
if(!this->Makefile.HasCMP0054AlreadyBeenReported())
if(!this->Makefile.HasCMP0054AlreadyBeenReported(
this->ExecutionContext))
{
std::ostringstream e;
e << (cmPolicies::GetPolicyWarning(cmPolicies::CMP0054)) << "\n";
Expand All @@ -122,7 +147,9 @@ const char* cmConditionEvaluator::GetDefinitionIfUnquoted(
"when the policy is set to NEW. "
"Since the policy is not set the OLD behavior will be used.";

this->Makefile.IssueMessage(cmake::AUTHOR_WARNING, e.str());
this->Makefile.GetCMakeInstance()
->IssueMessage(cmake::AUTHOR_WARNING, e.str(),
this->Backtrace);
}
}

Expand Down Expand Up @@ -159,7 +186,8 @@ bool cmConditionEvaluator::IsKeyword(std::string const& keyword,
if(isKeyword && argument.WasQuoted() &&
this->Policy54Status == cmPolicies::WARN)
{
if(!this->Makefile.HasCMP0054AlreadyBeenReported())
if(!this->Makefile.HasCMP0054AlreadyBeenReported(
this->ExecutionContext))
{
std::ostringstream e;
e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0054) << "\n";
Expand All @@ -168,7 +196,9 @@ bool cmConditionEvaluator::IsKeyword(std::string const& keyword,
"when the policy is set to NEW. "
"Since the policy is not set the OLD behavior will be used.";

this->Makefile.IssueMessage(cmake::AUTHOR_WARNING, e.str());
this->Makefile.GetCMakeInstance()
->IssueMessage(cmake::AUTHOR_WARNING, e.str(),
this->Backtrace);
}
}

Expand Down
9 changes: 8 additions & 1 deletion Source/cmConditionEvaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ class cmConditionEvaluator
public:
typedef std::list<cmExpandedCommandArgument> cmArgumentList;

cmConditionEvaluator(cmMakefile& makefile);
cmConditionEvaluator(cmMakefile& makefile,
cmListFileContext const& context,
cmListFileBacktrace const& bt);

// this is a shared function for both If and Else to determine if the
// arguments were valid, and if so, was the response true. If there is
Expand All @@ -31,6 +33,9 @@ class cmConditionEvaluator
std::string &errorString,
cmake::MessageType &status);

static cmListFileContext GetConditionContext(cmMakefile* mf,
const cmCommandContext& command, std::string const& filePath);

private:
// Filter the given variable definition based on policy CMP0054.
const char* GetDefinitionIfUnquoted(
Expand Down Expand Up @@ -91,6 +96,8 @@ class cmConditionEvaluator
cmake::MessageType &status);

cmMakefile& Makefile;
cmListFileContext ExecutionContext;
cmListFileBacktrace Backtrace;
cmPolicies::PolicyStatus Policy12Status;
cmPolicies::PolicyStatus Policy54Status;
cmPolicies::PolicyStatus Policy57Status;
Expand Down
20 changes: 18 additions & 2 deletions Source/cmIfCommand.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,14 @@ IsFunctionBlocked(const cmListFileFunction& lff,

cmake::MessageType messType;

cmConditionEvaluator conditionEvaluator(mf);
cmListFileContext conditionContext =
cmConditionEvaluator::GetConditionContext(
&mf, this->Functions[c],
this->GetStartingContext().FilePath);

cmConditionEvaluator conditionEvaluator(
mf, conditionContext,
mf.GetBacktrace(this->Functions[c]));

bool isTrue = conditionEvaluator.IsTrue(
expandedArguments, errorString, messType);
Expand Down Expand Up @@ -195,7 +202,16 @@ ::InvokeInitialPass(const std::vector<cmListFileArgument>& args,

cmake::MessageType status;

cmConditionEvaluator conditionEvaluator(*(this->Makefile));
cmListFileContext execContext = this->Makefile->GetExecutionContext();

cmCommandContext commandContext;
commandContext.Line = execContext.Line;
commandContext.Name = execContext.Name;

cmConditionEvaluator conditionEvaluator(
*(this->Makefile), cmConditionEvaluator::GetConditionContext(
this->Makefile, commandContext, execContext.FilePath),
this->Makefile->GetBacktrace());

bool isTrue = conditionEvaluator.IsTrue(
expandedArguments, errorString, status);
Expand Down
5 changes: 3 additions & 2 deletions Source/cmMakefile.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -4658,9 +4658,10 @@ bool cmMakefile::SetPolicyVersion(const char *version)
}

//----------------------------------------------------------------------------
bool cmMakefile::HasCMP0054AlreadyBeenReported() const
bool cmMakefile::HasCMP0054AlreadyBeenReported(
cmListFileContext const& context) const
{
return !this->CMP0054ReportedIds.insert(this->GetExecutionContext()).second;
return !this->CMP0054ReportedIds.insert(context).second;
}

//----------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion Source/cmMakefile.h
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ class cmMakefile
* Determine if the given context, name pair has already been reported
* in context of CMP0054.
*/
bool HasCMP0054AlreadyBeenReported() const;
bool HasCMP0054AlreadyBeenReported(const cmListFileContext &context) const;

bool IgnoreErrorsCMP0061() const;

Expand Down
15 changes: 14 additions & 1 deletion Source/cmWhileCommand.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,20 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
mf.ExpandArguments(this->Args, expandedArguments);
cmake::MessageType messageType;

cmConditionEvaluator conditionEvaluator(mf);
cmListFileContext execContext = this->GetStartingContext();

cmCommandContext commandContext;
commandContext.Line = execContext.Line;
commandContext.Name = execContext.Name;

cmListFileContext conditionContext =
cmConditionEvaluator::GetConditionContext(
&mf, commandContext,
this->GetStartingContext().FilePath);

cmConditionEvaluator conditionEvaluator(
mf, conditionContext,
mf.GetBacktrace(commandContext));

bool isTrue = conditionEvaluator.IsTrue(
expandedArguments, errorString, messageType);
Expand Down
12 changes: 12 additions & 0 deletions Tests/RunCMake/CMP0054/CMP0054-WARN-stderr.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,15 @@ CMake Warning \(dev\) at CMP0054-WARN.cmake:3 \(if\):
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\) at CMP0054-WARN.cmake:5 \(elseif\):
Policy CMP0054 is not set: Only interpret if\(\) arguments as variables or
keywords when unquoted. Run "cmake --help-policy CMP0054" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

Quoted variables like "FOO" will no longer be dereferenced when the policy
is set to NEW. Since the policy is not set the OLD behavior will be used.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
2 changes: 2 additions & 0 deletions Tests/RunCMake/CMP0054/CMP0054-WARN.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ set(FOO "BAR")

if(NOT "FOO" STREQUAL "BAR")
message(FATAL_ERROR "The given literals should match")
elseif("FOO" STREQUAL "BING")
message(FATAL_ERROR "The given literals should not match")
endif()
13 changes: 13 additions & 0 deletions Tests/RunCMake/CMP0054/CMP0054-keywords-WARN-stderr.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,16 @@ CMake Warning \(dev\) at CMP0054-keywords-WARN.cmake:1 \(if\):
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\) at CMP0054-keywords-WARN.cmake:3 \(elseif\):
Policy CMP0054 is not set: Only interpret if\(\) arguments as variables or
keywords when unquoted. Run "cmake --help-policy CMP0054" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

Quoted keywords like "DEFINED" will no longer be interpreted as keywords
when the policy is set to NEW. Since the policy is not set the OLD
behavior will be used.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
2 changes: 2 additions & 0 deletions Tests/RunCMake/CMP0054/CMP0054-keywords-WARN.cmake
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
if("NOT" 1)
message(FATAL_ERROR "[\"NOT\" 1] evaluated true")
elseif("DEFINED" NotDefined)
message(FATAL_ERROR "[\"DEFINED\" NotDefined] evaluated true")
endif()

0 comments on commit 2ad1fed

Please sign in to comment.