From 9a83ce6efc10d5d51324f8b425213f18b0325b6e Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 13 Mar 2008 17:11:57 -0400 Subject: ENH: Add policy CMP0005 to decide whether add_definitions should escape defs. --- Source/cmMakefile.cxx | 38 +++++++++++++++++++++++++++++++++----- Source/cmPolicies.cxx | 21 +++++++++++++++++++++ Source/cmPolicies.h | 1 + 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. -- cgit v0.12