summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-03-13 21:11:57 (GMT)
committerBrad King <brad.king@kitware.com>2008-03-13 21:11:57 (GMT)
commit9a83ce6efc10d5d51324f8b425213f18b0325b6e (patch)
treee7e76eb24a2b5f2c254b22a6da5146f726203ee8
parenta0ef9897159c2b64383ab1d3aa33fd43fec632d7 (diff)
downloadCMake-9a83ce6efc10d5d51324f8b425213f18b0325b6e.zip
CMake-9a83ce6efc10d5d51324f8b425213f18b0325b6e.tar.gz
CMake-9a83ce6efc10d5d51324f8b425213f18b0325b6e.tar.bz2
ENH: Add policy CMP0005 to decide whether add_definitions should escape defs.
-rw-r--r--Source/cmMakefile.cxx38
-rw-r--r--Source/cmPolicies.cxx21
-rw-r--r--Source/cmPolicies.h1
3 files changed, 55 insertions, 5 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index d8989bd..e605d37 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1023,14 +1023,11 @@ void cmMakefile::RemoveDefineFlag(const char* flag)
bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
{
// 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
- 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.
- if(!regex.find(def.c_str()))
+ if(!valid.find(def.c_str()))
{
return false;
}
@@ -1043,6 +1040,37 @@ bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
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.
const char* define = def.c_str() + 2;
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx
index ffe4554..872de47 100644
--- a/Source/cmPolicies.cxx
+++ b/Source/cmPolicies.cxx
@@ -216,6 +216,27 @@ cmPolicies::cmPolicies()
"that in effect when the target is created by an add_executable or "
"add_library command.",
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()
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 1a2a32c..5adfbfa 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -45,6 +45,7 @@ public:
CMP0002, // Target names must be unique
CMP0003, // Linking does not include extra -L paths
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
// the last policy when adding a new one.