Merge topic 'MakeTargetLinkLibrariesComplainWhenNoTargetIsUsed'
6acc71c New CMP0016 for deciding whether an unknown target in TLL() is an error. da033b1 Remove trailing whitespace 6aef6d8 Just warn in case of a bad target as only argument for t_l_l() c786635 Make target_link_libraries() complain if bad target name is used 43f96ea Remove trailing whitespace
This commit is contained in:
commit
28e073213f
@ -15,8 +15,8 @@ const char* cmPolicies::PolicyStatusNames[] = {
|
|||||||
|
|
||||||
class cmPolicy
|
class cmPolicy
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cmPolicy(cmPolicies::PolicyID iD,
|
cmPolicy(cmPolicies::PolicyID iD,
|
||||||
const char *idString,
|
const char *idString,
|
||||||
const char *shortDescription,
|
const char *shortDescription,
|
||||||
const char *longDescription,
|
const char *longDescription,
|
||||||
@ -55,7 +55,7 @@ public:
|
|||||||
return v.str();
|
return v.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsPolicyNewerThan(unsigned int majorV,
|
bool IsPolicyNewerThan(unsigned int majorV,
|
||||||
unsigned int minorV,
|
unsigned int minorV,
|
||||||
unsigned int patchV,
|
unsigned int patchV,
|
||||||
unsigned int tweakV)
|
unsigned int tweakV)
|
||||||
@ -86,7 +86,7 @@ public:
|
|||||||
}
|
}
|
||||||
return (tweakV < this->TweakVersionIntroduced);
|
return (tweakV < this->TweakVersionIntroduced);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::PolicyID ID;
|
cmPolicies::PolicyID ID;
|
||||||
std::string IDString;
|
std::string IDString;
|
||||||
std::string ShortDescription;
|
std::string ShortDescription;
|
||||||
@ -285,12 +285,12 @@ cmPolicies::cmPolicies()
|
|||||||
"The NEW behavior for this policy is to produce an error if a bundle "
|
"The NEW behavior for this policy is to produce an error if a bundle "
|
||||||
"target is installed without a BUNDLE DESTINATION.",
|
"target is installed without a BUNDLE DESTINATION.",
|
||||||
2,6,0,0, cmPolicies::WARN);
|
2,6,0,0, cmPolicies::WARN);
|
||||||
|
|
||||||
this->DefinePolicy(
|
this->DefinePolicy(
|
||||||
CMP0007, "CMP0007",
|
CMP0007, "CMP0007",
|
||||||
"list command no longer ignores empty elements.",
|
"list command no longer ignores empty elements.",
|
||||||
"This policy determines whether the list command will "
|
"This policy determines whether the list command will "
|
||||||
"ignore empty elements in the list. "
|
"ignore empty elements in the list. "
|
||||||
"CMake 2.4 and below list commands ignored all empty elements"
|
"CMake 2.4 and below list commands ignored all empty elements"
|
||||||
" in the list. For example, a;b;;c would have length 3 and not 4. "
|
" in the list. For example, a;b;;c would have length 3 and not 4. "
|
||||||
"The OLD behavior for this policy is to ignore empty list elements. "
|
"The OLD behavior for this policy is to ignore empty list elements. "
|
||||||
@ -426,7 +426,7 @@ cmPolicies::cmPolicies()
|
|||||||
this->DefinePolicy(
|
this->DefinePolicy(
|
||||||
CMP0015, "CMP0015",
|
CMP0015, "CMP0015",
|
||||||
"link_directories() treats paths relative to the source dir.",
|
"link_directories() treats paths relative to the source dir.",
|
||||||
"In CMake 2.6.4 and lower the link_directories() command passed relative "
|
"In CMake 2.8.0 and lower the link_directories() command passed relative "
|
||||||
"paths unchanged to the linker. "
|
"paths unchanged to the linker. "
|
||||||
"In CMake 2.8.1 and above the link_directories() command prefers to "
|
"In CMake 2.8.1 and above the link_directories() command prefers to "
|
||||||
"interpret relative paths with respect to CMAKE_CURRENT_SOURCE_DIR, "
|
"interpret relative paths with respect to CMAKE_CURRENT_SOURCE_DIR, "
|
||||||
@ -437,12 +437,21 @@ cmPolicies::cmPolicies()
|
|||||||
"absolute paths by appending the relative path to "
|
"absolute paths by appending the relative path to "
|
||||||
"CMAKE_CURRENT_SOURCE_DIR.",
|
"CMAKE_CURRENT_SOURCE_DIR.",
|
||||||
2,8,1,0, cmPolicies::WARN);
|
2,8,1,0, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0016, "CMP0016",
|
||||||
|
"target_link_libraries() reports error if only argument is not a target.",
|
||||||
|
"In CMake 2.8.2 and lower the target_link_libraries() command silently "
|
||||||
|
"ignored if it was called with only one argument, and this argument "
|
||||||
|
"wasn't a valid target. "
|
||||||
|
"In CMake 2.8.3 and above it reports an error in this case.",
|
||||||
|
2,8,3,0, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
{
|
{
|
||||||
// free the policies
|
// free the policies
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
||||||
= this->Policies.begin();
|
= this->Policies.begin();
|
||||||
for (;i != this->Policies.end(); ++i)
|
for (;i != this->Policies.end(); ++i)
|
||||||
{
|
{
|
||||||
@ -451,7 +460,7 @@ cmPolicies::~cmPolicies()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD,
|
void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD,
|
||||||
const char *idString,
|
const char *idString,
|
||||||
const char *shortDescription,
|
const char *shortDescription,
|
||||||
const char *longDescription,
|
const char *longDescription,
|
||||||
unsigned int majorVersionIntroduced,
|
unsigned int majorVersionIntroduced,
|
||||||
@ -467,7 +476,7 @@ void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD,
|
|||||||
"ID ", this->GetPolicyIDString(iD).c_str());
|
"ID ", this->GetPolicyIDString(iD).c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->Policies[iD] = new cmPolicy(iD, idString,
|
this->Policies[iD] = new cmPolicy(iD, idString,
|
||||||
shortDescription,
|
shortDescription,
|
||||||
longDescription,
|
longDescription,
|
||||||
@ -480,7 +489,7 @@ void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
|
bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
|
||||||
const char *version)
|
const char *version)
|
||||||
{
|
{
|
||||||
std::string ver = "2.4.0";
|
std::string ver = "2.4.0";
|
||||||
@ -505,7 +514,7 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
|
|||||||
mf->IssueMessage(cmake::FATAL_ERROR, e.str());
|
mf->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// it is an error if the policy version is less than 2.4
|
// it is an error if the policy version is less than 2.4
|
||||||
if (majorVer < 2 || (majorVer == 2 && minorVer < 4))
|
if (majorVer < 2 || (majorVer == 2 && minorVer < 4))
|
||||||
{
|
{
|
||||||
@ -547,7 +556,7 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
|
|||||||
|
|
||||||
// now loop over all the policies and set them as appropriate
|
// now loop over all the policies and set them as appropriate
|
||||||
std::vector<cmPolicies::PolicyID> ancientPolicies;
|
std::vector<cmPolicies::PolicyID> ancientPolicies;
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
||||||
= this->Policies.begin();
|
= this->Policies.begin();
|
||||||
for (;i != this->Policies.end(); ++i)
|
for (;i != this->Policies.end(); ++i)
|
||||||
{
|
{
|
||||||
@ -589,7 +598,7 @@ bool cmPolicies::GetPolicyID(const char *id, cmPolicies::PolicyID &pid)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::map<std::string,cmPolicies::PolicyID>::iterator pos =
|
std::map<std::string,cmPolicies::PolicyID>::iterator pos =
|
||||||
this->PolicyStringMap.find(id);
|
this->PolicyStringMap.find(id);
|
||||||
if (pos == this->PolicyStringMap.end())
|
if (pos == this->PolicyStringMap.end())
|
||||||
{
|
{
|
||||||
@ -601,7 +610,7 @@ bool cmPolicies::GetPolicyID(const char *id, cmPolicies::PolicyID &pid)
|
|||||||
|
|
||||||
std::string cmPolicies::GetPolicyIDString(cmPolicies::PolicyID pid)
|
std::string cmPolicies::GetPolicyIDString(cmPolicies::PolicyID pid)
|
||||||
{
|
{
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
||||||
this->Policies.find(pid);
|
this->Policies.find(pid);
|
||||||
if (pos == this->Policies.end())
|
if (pos == this->Policies.end())
|
||||||
{
|
{
|
||||||
@ -614,7 +623,7 @@ std::string cmPolicies::GetPolicyIDString(cmPolicies::PolicyID pid)
|
|||||||
///! return a warning string for a given policy
|
///! return a warning string for a given policy
|
||||||
std::string cmPolicies::GetPolicyWarning(cmPolicies::PolicyID id)
|
std::string cmPolicies::GetPolicyWarning(cmPolicies::PolicyID id)
|
||||||
{
|
{
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
||||||
this->Policies.find(id);
|
this->Policies.find(id);
|
||||||
if (pos == this->Policies.end())
|
if (pos == this->Policies.end())
|
||||||
{
|
{
|
||||||
@ -633,12 +642,12 @@ std::string cmPolicies::GetPolicyWarning(cmPolicies::PolicyID id)
|
|||||||
"and suppress this warning.";
|
"and suppress this warning.";
|
||||||
return msg.str();
|
return msg.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///! return an error string for when a required policy is unspecified
|
///! return an error string for when a required policy is unspecified
|
||||||
std::string cmPolicies::GetRequiredPolicyError(cmPolicies::PolicyID id)
|
std::string cmPolicies::GetRequiredPolicyError(cmPolicies::PolicyID id)
|
||||||
{
|
{
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
||||||
this->Policies.find(id);
|
this->Policies.find(id);
|
||||||
if (pos == this->Policies.end())
|
if (pos == this->Policies.end())
|
||||||
{
|
{
|
||||||
@ -664,25 +673,25 @@ std::string cmPolicies::GetRequiredPolicyError(cmPolicies::PolicyID id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
///! Get the default status for a policy
|
///! Get the default status for a policy
|
||||||
cmPolicies::PolicyStatus
|
cmPolicies::PolicyStatus
|
||||||
cmPolicies::GetPolicyStatus(cmPolicies::PolicyID id)
|
cmPolicies::GetPolicyStatus(cmPolicies::PolicyID id)
|
||||||
{
|
{
|
||||||
// if the policy is not know then what?
|
// if the policy is not know then what?
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos =
|
||||||
this->Policies.find(id);
|
this->Policies.find(id);
|
||||||
if (pos == this->Policies.end())
|
if (pos == this->Policies.end())
|
||||||
{
|
{
|
||||||
// TODO is this right?
|
// TODO is this right?
|
||||||
return cmPolicies::WARN;
|
return cmPolicies::WARN;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pos->second->Status;
|
return pos->second->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmPolicies::GetDocumentation(std::vector<cmDocumentationEntry>& v)
|
void cmPolicies::GetDocumentation(std::vector<cmDocumentationEntry>& v)
|
||||||
{
|
{
|
||||||
// now loop over all the policies and set them as appropriate
|
// now loop over all the policies and set them as appropriate
|
||||||
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
|
||||||
= this->Policies.begin();
|
= this->Policies.begin();
|
||||||
for (;i != this->Policies.end(); ++i)
|
for (;i != this->Policies.end(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
CMP0013, // Duplicate binary directories not allowed
|
CMP0013, // Duplicate binary directories not allowed
|
||||||
CMP0014, // Input directories must have CMakeLists.txt
|
CMP0014, // Input directories must have CMakeLists.txt
|
||||||
CMP0015, // link_directories() treats paths relative to source dir
|
CMP0015, // link_directories() treats paths relative to source dir
|
||||||
|
CMP0016, // target_link_libraries() fails if only argument is not a target
|
||||||
|
|
||||||
// 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.
|
||||||
@ -60,10 +61,10 @@ public:
|
|||||||
///! convert a string policy ID into a number
|
///! convert a string policy ID into a number
|
||||||
bool GetPolicyID(const char *id, /* out */ cmPolicies::PolicyID &pid);
|
bool GetPolicyID(const char *id, /* out */ cmPolicies::PolicyID &pid);
|
||||||
std::string GetPolicyIDString(cmPolicies::PolicyID pid);
|
std::string GetPolicyIDString(cmPolicies::PolicyID pid);
|
||||||
|
|
||||||
///! Get the default status for a policy
|
///! Get the default status for a policy
|
||||||
cmPolicies::PolicyStatus GetPolicyStatus(cmPolicies::PolicyID id);
|
cmPolicies::PolicyStatus GetPolicyStatus(cmPolicies::PolicyID id);
|
||||||
|
|
||||||
///! Define a Policy for CMake
|
///! Define a Policy for CMake
|
||||||
void DefinePolicy(cmPolicies::PolicyID id,
|
void DefinePolicy(cmPolicies::PolicyID id,
|
||||||
const char *stringID,
|
const char *stringID,
|
||||||
@ -80,7 +81,7 @@ public:
|
|||||||
|
|
||||||
///! return a warning string for a given policy
|
///! return a warning string for a given policy
|
||||||
std::string GetPolicyWarning(cmPolicies::PolicyID id);
|
std::string GetPolicyWarning(cmPolicies::PolicyID id);
|
||||||
|
|
||||||
///! return an error string for when a required policy is unspecified
|
///! return an error string for when a required policy is unspecified
|
||||||
std::string GetRequiredPolicyError(cmPolicies::PolicyID id);
|
std::string GetRequiredPolicyError(cmPolicies::PolicyID id);
|
||||||
|
|
||||||
|
@ -29,23 +29,64 @@ bool cmTargetLinkLibrariesCommand
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// but we might not have any libs after variable expansion
|
|
||||||
if(args.size() < 2)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lookup the target for which libraries are specified.
|
// Lookup the target for which libraries are specified.
|
||||||
this->Target =
|
this->Target =
|
||||||
this->Makefile->GetCMakeInstance()
|
this->Makefile->GetCMakeInstance()
|
||||||
->GetGlobalGenerator()->FindTarget(0, args[0].c_str());
|
->GetGlobalGenerator()->FindTarget(0, args[0].c_str());
|
||||||
if(!this->Target)
|
if(!this->Target)
|
||||||
{
|
{
|
||||||
|
cmake::MessageType t = cmake::FATAL_ERROR; // fail by default
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
e << "Cannot specify link libraries for target \"" << args[0] << "\" "
|
e << "Cannot specify link libraries for target \"" << args[0] << "\" "
|
||||||
<< "which is not built by this project.";
|
<< "which is not built by this project.";
|
||||||
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
|
// The bad target is the only argument. Check how policy CMP0016 is set,
|
||||||
cmSystemTools::SetFatalErrorOccured();
|
// and accept, warn or fail respectively:
|
||||||
|
if (args.size() < 2)
|
||||||
|
{
|
||||||
|
switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0016))
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
t = cmake::AUTHOR_WARNING;
|
||||||
|
// Print the warning.
|
||||||
|
e << "\n"
|
||||||
|
<< "CMake does not support this but it used to work accidentally "
|
||||||
|
<< "and is being allowed for compatibility."
|
||||||
|
<< "\n" << this->Makefile->GetPolicies()->
|
||||||
|
GetPolicyWarning(cmPolicies::CMP0016);
|
||||||
|
break;
|
||||||
|
case cmPolicies::OLD: // OLD behavior does not warn.
|
||||||
|
t = cmake::MESSAGE;
|
||||||
|
break;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
e << "\n" << this->Makefile->GetPolicies()->
|
||||||
|
GetRequiredPolicyError(cmPolicies::CMP0016);
|
||||||
|
break;
|
||||||
|
case cmPolicies::NEW: // NEW behavior prints the error.
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now actually print the message
|
||||||
|
switch(t)
|
||||||
|
{
|
||||||
|
case cmake::AUTHOR_WARNING:
|
||||||
|
this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, e.str());
|
||||||
|
break;
|
||||||
|
case cmake::FATAL_ERROR:
|
||||||
|
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||||
|
cmSystemTools::SetFatalErrorOccured();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// but we might not have any libs after variable expansion
|
||||||
|
if(args.size() < 2)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +98,7 @@ bool cmTargetLinkLibrariesCommand
|
|||||||
// specification when the keyword is encountered.
|
// specification when the keyword is encountered.
|
||||||
this->DoingInterface = false;
|
this->DoingInterface = false;
|
||||||
|
|
||||||
// add libraries, nothe that there is an optional prefix
|
// add libraries, nothe that there is an optional prefix
|
||||||
// of debug and optimized than can be used
|
// of debug and optimized than can be used
|
||||||
for(unsigned int i=1; i < args.size(); ++i)
|
for(unsigned int i=1; i < args.size(); ++i)
|
||||||
{
|
{
|
||||||
@ -118,7 +159,7 @@ bool cmTargetLinkLibrariesCommand
|
|||||||
llt = cmTarget::GENERAL;
|
llt = cmTarget::GENERAL;
|
||||||
std::string linkType = args[0];
|
std::string linkType = args[0];
|
||||||
linkType += "_LINK_TYPE";
|
linkType += "_LINK_TYPE";
|
||||||
const char* linkTypeString =
|
const char* linkTypeString =
|
||||||
this->Makefile->GetDefinition( linkType.c_str() );
|
this->Makefile->GetDefinition( linkType.c_str() );
|
||||||
if(linkTypeString)
|
if(linkTypeString)
|
||||||
{
|
{
|
||||||
@ -133,7 +174,7 @@ bool cmTargetLinkLibrariesCommand
|
|||||||
}
|
}
|
||||||
this->HandleLibrary(args[i].c_str(), llt);
|
this->HandleLibrary(args[i].c_str(), llt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure the last argument was not a library type specifier.
|
// Make sure the last argument was not a library type specifier.
|
||||||
if(haveLLT)
|
if(haveLLT)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user