ENH: Add policy CMP0005 to decide whether add_definitions should escape defs.
This commit is contained in:
parent
a0ef989715
commit
9a83ce6efc
@ -1023,14 +1023,11 @@ void cmMakefile::RemoveDefineFlag(const char* flag)
|
|||||||
bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
|
bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
|
||||||
{
|
{
|
||||||
// Create a regular expression to match valid definitions.
|
// Create a regular expression to match valid definitions.
|
||||||
// Definitions with non-trivial values must not be matched because
|
|
||||||
// escaping them could break compatibility with escapes added by
|
|
||||||
// users.
|
|
||||||
static cmsys::RegularExpression
|
static cmsys::RegularExpression
|
||||||
regex("^[-/]D[A-Za-z_][A-Za-z0-9_]*(=[A-Za-z0-9_.]+)?$");
|
valid("^[-/]D[A-Za-z_][A-Za-z0-9_]*(=.*)$");
|
||||||
|
|
||||||
// Make sure the definition matches.
|
// Make sure the definition matches.
|
||||||
if(!regex.find(def.c_str()))
|
if(!valid.find(def.c_str()))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1043,6 +1040,37 @@ bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Definitions with non-trivial values require a policy check.
|
||||||
|
static cmsys::RegularExpression
|
||||||
|
trivial("^[-/]D[A-Za-z_][A-Za-z0-9_]*(=[A-Za-z0-9_.]+)?$");
|
||||||
|
if(!trivial.find(def.c_str()))
|
||||||
|
{
|
||||||
|
// This definition has a non-trivial value.
|
||||||
|
switch(this->GetPolicyStatus(cmPolicies::CMP0005))
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
this->IssueMessage(
|
||||||
|
cmake::AUTHOR_WARNING,
|
||||||
|
this->GetPolicies()->GetPolicyWarning(cmPolicies::CMP0005)
|
||||||
|
);
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
// OLD behavior is to not escape the value. We should not
|
||||||
|
// convert the definition to use the property.
|
||||||
|
return false;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
this->IssueMessage(
|
||||||
|
cmake::FATAL_ERROR,
|
||||||
|
this->GetPolicies()->GetRequiredPolicyError(cmPolicies::CMP0005)
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
// NEW behavior is to escape the value. Proceed to convert it
|
||||||
|
// to an entry in the property.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get the definition part after the flag.
|
// Get the definition part after the flag.
|
||||||
const char* define = def.c_str() + 2;
|
const char* define = def.c_str() + 2;
|
||||||
|
|
||||||
|
@ -216,6 +216,27 @@ cmPolicies::cmPolicies()
|
|||||||
"that in effect when the target is created by an add_executable or "
|
"that in effect when the target is created by an add_executable or "
|
||||||
"add_library command.",
|
"add_library command.",
|
||||||
2,6,0, cmPolicies::WARN);
|
2,6,0, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0005, "CMP0005",
|
||||||
|
"Preprocessor definition values are now escaped automatically.",
|
||||||
|
"This policy determines whether or not CMake should generate escaped "
|
||||||
|
"preprocessor definition values added via add_definitions. "
|
||||||
|
"CMake versions 2.4 and below assumed that only trivial values would "
|
||||||
|
"be given for macros in add_definitions calls. "
|
||||||
|
"It did not attempt to escape non-trivial values such as string "
|
||||||
|
"literals in generated build rules. "
|
||||||
|
"CMake versions 2.6 and above support escaping of most values, but "
|
||||||
|
"cannot assume the user has not added escapes already in an attempt to "
|
||||||
|
"work around limitations in earlier versions.\n"
|
||||||
|
"The OLD behavior for this policy is to place definition values given "
|
||||||
|
"to add_definitions directly in the generated build rules without "
|
||||||
|
"attempting to escape anything. "
|
||||||
|
"The NEW behavior for this policy is to generate correct escapes "
|
||||||
|
"for all native build tools automatically. "
|
||||||
|
"See documentation of the COMPILE_DEFINITIONS target property for "
|
||||||
|
"limitations of the escaping implementation.",
|
||||||
|
2,6,0, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
|
@ -45,6 +45,7 @@ public:
|
|||||||
CMP0002, // Target names must be unique
|
CMP0002, // Target names must be unique
|
||||||
CMP0003, // Linking does not include extra -L paths
|
CMP0003, // Linking does not include extra -L paths
|
||||||
CMP0004, // Libraries linked may not have leading or trailing whitespace
|
CMP0004, // Libraries linked may not have leading or trailing whitespace
|
||||||
|
CMP0005, // Definition value escaping
|
||||||
|
|
||||||
// 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…
x
Reference in New Issue
Block a user