ENH: fix list command with empty elements
This commit is contained in:
parent
aa10b4e33c
commit
0a0672c01f
|
@ -103,8 +103,62 @@ bool cmListCommand::GetList(std::vector<std::string>& list, const char* var)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// expand the variable
|
// expand the variable into a list
|
||||||
|
cmSystemTools::ExpandListArgument(listString, list, true);
|
||||||
|
// check the list for empty values
|
||||||
|
bool hasEmpty = false;
|
||||||
|
for(std::vector<std::string>::iterator i = list.begin();
|
||||||
|
i != list.end(); ++i)
|
||||||
|
{
|
||||||
|
if(i->size() == 0)
|
||||||
|
{
|
||||||
|
hasEmpty = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if no empty elements then just return
|
||||||
|
if(!hasEmpty)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// if we have empty elements we need to check policy CMP0007
|
||||||
|
switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0007))
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
{
|
||||||
|
// Default is to warn and use old behavior
|
||||||
|
// OLD behavior is to allow compatibility, so recall
|
||||||
|
// ExpandListArgument without the true which will remove
|
||||||
|
// empty values
|
||||||
|
list.clear();
|
||||||
cmSystemTools::ExpandListArgument(listString, list);
|
cmSystemTools::ExpandListArgument(listString, list);
|
||||||
|
std::string warn = this->Makefile->GetPolicies()->
|
||||||
|
GetPolicyWarning(cmPolicies::CMP0007);
|
||||||
|
warn += " List has value = [";
|
||||||
|
warn += listString;
|
||||||
|
warn += "].";
|
||||||
|
this->Makefile->IssueMessage(cmake::AUTHOR_WARNING,
|
||||||
|
warn);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
// OLD behavior is to allow compatibility, so recall
|
||||||
|
// ExpandListArgument without the true which will remove
|
||||||
|
// empty values
|
||||||
|
list.clear();
|
||||||
|
cmSystemTools::ExpandListArgument(listString, list);
|
||||||
|
return true;
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
return true;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
this->Makefile->IssueMessage(
|
||||||
|
cmake::FATAL_ERROR,
|
||||||
|
this->Makefile->GetPolicies()
|
||||||
|
->GetRequiredPolicyError(cmPolicies::CMP0007)
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -269,6 +269,18 @@ cmPolicies::cmPolicies()
|
||||||
"The NEW behavior for this policy is to produce an error if a bundle "
|
"The NEW behavior for this policy is to produce an error if a bundle "
|
||||||
"target is installed without a BUNDLE DESTINATION.",
|
"target is installed without a BUNDLE DESTINATION.",
|
||||||
2,6,0, cmPolicies::WARN);
|
2,6,0, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0007, "CMP0007",
|
||||||
|
"list command no longer ignores empty elements.",
|
||||||
|
"This policy determines whether the list command will "
|
||||||
|
"ignore empty elements in the list. "
|
||||||
|
"CMake 2.4 and below list commands ignored all empty elements"
|
||||||
|
" in the list. For example, a;b;;c would have length 3 and not 4. "
|
||||||
|
"The OLD behavior for this policy is to ignore empty list elements. "
|
||||||
|
"The NEW behavior for this policy is to correctly count empty "
|
||||||
|
"elements in a list. ",
|
||||||
|
2,6,0, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
|
|
|
@ -47,6 +47,7 @@ public:
|
||||||
CMP0004, // Libraries linked may not have leading or trailing whitespace
|
CMP0004, // Libraries linked may not have leading or trailing whitespace
|
||||||
CMP0005, // Definition value escaping
|
CMP0005, // Definition value escaping
|
||||||
CMP0006, // BUNDLE install rules needed for MACOSX_BUNDLE targets
|
CMP0006, // BUNDLE install rules needed for MACOSX_BUNDLE targets
|
||||||
|
CMP0007, // list command handling of empty elements
|
||||||
|
|
||||||
// Always the last entry. Useful mostly to avoid adding a comma
|
// Always the last entry. Useful mostly to avoid adding a comma
|
||||||
// the last policy when adding a new one.
|
// the last policy when adding a new one.
|
||||||
|
|
Loading…
Reference in New Issue