De-duplicate validation of genex target names.

This commit is contained in:
Stephen Kelly 2013-02-06 13:32:15 +01:00
parent 92e98dd909
commit 7c0ec75cfa
4 changed files with 22 additions and 16 deletions

View File

@ -371,10 +371,20 @@ std::string::size_type cmGeneratorExpression::Find(const std::string &input)
{
const std::string::size_type openpos = input.find("$<");
if (openpos != std::string::npos
&& input.find(">", openpos) != std::string::npos)
{
return openpos;
}
&& input.find(">", openpos) != std::string::npos)
{
return openpos;
}
return std::string::npos;
}
//----------------------------------------------------------------------------
bool cmGeneratorExpression::IsValidTargetName(const std::string &input)
{
cmsys::RegularExpression targetNameValidator;
// The ':' is supported to allow use with IMPORTED targets. At least
// Qt 4 and 5 IMPORTED targets use ':' as the namespace delimiter.
targetNameValidator.compile("^[A-Za-z0-9_.:-]+$");
return targetNameValidator.find(input.c_str());
}

View File

@ -64,6 +64,8 @@ public:
static std::string::size_type Find(const std::string &input);
static bool IsValidTargetName(const std::string &input);
private:
cmGeneratorExpression(const cmGeneratorExpression &);
void operator=(const cmGeneratorExpression &);

View File

@ -333,10 +333,6 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
"$<TARGET_PROPERTY:...> expression requires one or two parameters");
return std::string();
}
cmsys::RegularExpression targetNameValidator;
// The ':' is supported to allow use with IMPORTED targets. At least
// Qt 4 and 5 IMPORTED targets use ':' as the namespace delimiter.
targetNameValidator.compile("^[A-Za-z0-9_.:-]+$");
cmsys::RegularExpression propertyNameValidator;
propertyNameValidator.compile("^[A-Za-z0-9_]+$");
@ -372,7 +368,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
std::string targetName = parameters.front();
propertyName = parameters[1];
if (!targetNameValidator.find(targetName.c_str()))
if (!cmGeneratorExpression::IsValidTargetName(targetName))
{
if (!propertyNameValidator.find(propertyName.c_str()))
{
@ -867,10 +863,7 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
// Lookup the referenced target.
std::string name = *parameters.begin();
cmsys::RegularExpression targetValidator;
// The ':' is supported to allow use with IMPORTED targets.
targetValidator.compile("^[A-Za-z0-9_.:-]+$");
if (!targetValidator.find(name.c_str()))
if (!cmGeneratorExpression::IsValidTargetName(name))
{
::reportError(context, content->GetOriginalExpression(),
"Expression syntax not recognized.");

View File

@ -11,6 +11,8 @@
============================================================================*/
#include "cmTargetLinkLibrariesCommand.h"
#include "cmGeneratorExpression.h"
const char* cmTargetLinkLibrariesCommand::LinkLibraryTypeNames[3] =
{
"general",
@ -271,9 +273,8 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
{
const bool isGenex = cmGeneratorExpression::Find(lib) != std::string::npos;
cmsys::RegularExpression targetNameValidator;
targetNameValidator.compile("^[A-Za-z0-9_.:-]+$");
const bool potentialTargetName = targetNameValidator.find(lib);
const bool potentialTargetName
= cmGeneratorExpression::IsValidTargetName(lib);
if (potentialTargetName || isGenex)
{