ENH: Add policy CMP_0004 to require library names to have no leading or trailing whitespace. Replace previous check of CMAKE_BACKWARDS_COMPATIBILITY against version 2.4 with the policy.

This commit is contained in:
Brad King 2008-03-13 16:35:39 -04:00
parent d46ff28ac9
commit bf4cef9d5c
6 changed files with 67 additions and 10 deletions

View File

@ -21,6 +21,7 @@
#include "cmLocalGenerator.h" #include "cmLocalGenerator.h"
#include "cmMakefile.h" #include "cmMakefile.h"
#include "cmTarget.h" #include "cmTarget.h"
#include "cmake.h"
#include <cmsys/stl/algorithm> #include <cmsys/stl/algorithm>
@ -161,6 +162,7 @@ cmComputeLinkDepends
this->Makefile = this->Target->GetMakefile(); this->Makefile = this->Target->GetMakefile();
this->LocalGenerator = this->Makefile->GetLocalGenerator(); this->LocalGenerator = this->Makefile->GetLocalGenerator();
this->GlobalGenerator = this->LocalGenerator->GetGlobalGenerator(); this->GlobalGenerator = this->LocalGenerator->GetGlobalGenerator();
this->CMakeInstance = this->GlobalGenerator->GetCMakeInstance();
// The configuration being linked. // The configuration being linked.
this->Config = config; this->Config = config;
@ -568,17 +570,45 @@ std::string cmComputeLinkDepends::CleanItemName(std::string const& item)
{ {
lib = lib.substr(0, pos+1); lib = lib.substr(0, pos+1);
} }
if(lib != item && !this->Makefile->NeedBackwardsCompatibility(2,4)) if(lib != item)
{ {
cmOStringStream e; switch(this->Target->GetPolicyStatusCMP0004())
e << "Target \"" << this->Target->GetName() << "\" links to item \"" {
<< item << "\" which has leading or trailing whitespace. " case cmPolicies::WARN:
<< "CMake is stripping off the whitespace but this may not be " {
<< "supported in the future. " cmOStringStream w;
<< "Update the CMakeLists.txt files to avoid adding the whitespace. " w << (this->Makefile->GetPolicies()
<< "Set CMAKE_BACKWARDS_COMPATIBILITY to 2.4 or lower to disable this " ->GetPolicyWarning(cmPolicies::CMP0004)) << "\n"
<< "warning."; << "Target \"" << this->Target->GetName() << "\" links to item \""
cmSystemTools::Message(e.str().c_str()); << item << "\" which has leading or trailing whitespace.";
this->CMakeInstance->IssueMessage(cmake::AUTHOR_WARNING, w.str(),
this->Target->GetBacktrace());
}
case cmPolicies::OLD:
break;
case cmPolicies::NEW:
{
cmOStringStream e;
e << "Target \"" << this->Target->GetName() << "\" links to item \""
<< item << "\" which has leading or trailing whitespace. "
<< "This is now an error according to policy CMP0004.";
this->CMakeInstance->IssueMessage(cmake::FATAL_ERROR, e.str(),
this->Target->GetBacktrace());
}
break;
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
{
cmOStringStream e;
e << (this->Makefile->GetPolicies()
->GetRequiredPolicyError(cmPolicies::CMP0004)) << "\n"
<< "Target \"" << this->Target->GetName() << "\" links to item \""
<< item << "\" which has leading or trailing whitespace.";
this->CMakeInstance->IssueMessage(cmake::FATAL_ERROR, e.str(),
this->Target->GetBacktrace());
}
break;
}
} }
return lib; return lib;
} }

View File

@ -29,6 +29,7 @@ class cmGlobalGenerator;
class cmLocalGenerator; class cmLocalGenerator;
class cmMakefile; class cmMakefile;
class cmTarget; class cmTarget;
class cmake;
/** \class cmComputeLinkDepends /** \class cmComputeLinkDepends
* \brief Compute link dependencies for targets. * \brief Compute link dependencies for targets.
@ -60,6 +61,7 @@ private:
cmMakefile* Makefile; cmMakefile* Makefile;
cmLocalGenerator* LocalGenerator; cmLocalGenerator* LocalGenerator;
cmGlobalGenerator* GlobalGenerator; cmGlobalGenerator* GlobalGenerator;
cmake* CMakeInstance;
bool DebugMode; bool DebugMode;
// Configuration information. // Configuration information.

View File

@ -200,6 +200,22 @@ cmPolicies::cmPolicies()
"When all items on the link line have known paths CMake does not check " "When all items on the link line have known paths CMake does not check "
"this policy so it has no effect.", "this policy so it has no effect.",
2,6,0, cmPolicies::WARN); 2,6,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0004, "CMP0004",
"Libraries linked may not have leading or trailing whitespace.",
"CMake versions 2.4 and below silently removed leading and trailing "
"whitespace from libraries linked with code like\n"
" target_link_libraries(myexe \" A \")\n"
"This could lead to subtle errors in user projects.\n"
"The OLD behavior for this policy is to silently remove leading and "
"trailing whitespace. "
"The NEW behavior for this policy is to diagnose the existence of "
"such whitespace as an error. "
"The setting for this policy used when checking the library names is "
"that in effect when the target is created by an add_executable or "
"add_library command.",
2,6,0, cmPolicies::WARN);
} }
cmPolicies::~cmPolicies() cmPolicies::~cmPolicies()

View File

@ -44,6 +44,7 @@ public:
CMP0001, // Ignore old compatibility variable CMP0001, // Ignore old compatibility variable
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
// 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.

View File

@ -54,6 +54,7 @@ cmTarget::cmTarget()
{ {
this->Makefile = 0; this->Makefile = 0;
this->PolicyStatusCMP0003 = cmPolicies::WARN; this->PolicyStatusCMP0003 = cmPolicies::WARN;
this->PolicyStatusCMP0004 = cmPolicies::WARN;
this->LinkLibrariesAnalyzed = false; this->LinkLibrariesAnalyzed = false;
this->HaveInstallRule = false; this->HaveInstallRule = false;
this->DLLPlatform = false; this->DLLPlatform = false;
@ -731,6 +732,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
// Record current policies for later use. // Record current policies for later use.
this->PolicyStatusCMP0003 = this->PolicyStatusCMP0003 =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0003); this->Makefile->GetPolicyStatus(cmPolicies::CMP0003);
this->PolicyStatusCMP0004 =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0004);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -110,6 +110,10 @@ public:
cmPolicies::PolicyStatus GetPolicyStatusCMP0003() const cmPolicies::PolicyStatus GetPolicyStatusCMP0003() const
{ return this->PolicyStatusCMP0003; } { return this->PolicyStatusCMP0003; }
/** Get the status of policy CMP0004 when the target was created. */
cmPolicies::PolicyStatus GetPolicyStatusCMP0004() const
{ return this->PolicyStatusCMP0004; }
/** /**
* Get the list of the custom commands for this target * Get the list of the custom commands for this target
*/ */
@ -537,6 +541,7 @@ private:
// Policy status recorded when target was created. // Policy status recorded when target was created.
cmPolicies::PolicyStatus PolicyStatusCMP0003; cmPolicies::PolicyStatus PolicyStatusCMP0003;
cmPolicies::PolicyStatus PolicyStatusCMP0004;
// Internal representation details. // Internal representation details.
friend class cmTargetInternals; friend class cmTargetInternals;