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:
parent
d46ff28ac9
commit
bf4cef9d5c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue