diff options
author | Brad King <brad.king@kitware.com> | 2010-08-31 18:48:26 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2010-08-31 18:48:26 (GMT) |
commit | 28e073213f9a8122c177225822b096001fb7f250 (patch) | |
tree | 9c6fc7371fcb7ce62c0f65fbd1931c9c08529711 | |
parent | 6c155d9e9eb77a4cbbab424c1b95ece1904f7e60 (diff) | |
parent | 6acc71c09df80e9530ff643fb4e37ebe145b46ad (diff) | |
download | CMake-28e073213f9a8122c177225822b096001fb7f250.zip CMake-28e073213f9a8122c177225822b096001fb7f250.tar.gz CMake-28e073213f9a8122c177225822b096001fb7f250.tar.bz2 |
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
-rw-r--r-- | Source/cmPolicies.cxx | 55 | ||||
-rw-r--r-- | Source/cmPolicies.h | 7 | ||||
-rw-r--r-- | Source/cmTargetLinkLibrariesCommand.cxx | 63 |
3 files changed, 88 insertions, 37 deletions
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 69d3e51..3fe92de 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -15,8 +15,8 @@ const char* cmPolicies::PolicyStatusNames[] = { class cmPolicy { -public: - cmPolicy(cmPolicies::PolicyID iD, +public: + cmPolicy(cmPolicies::PolicyID iD, const char *idString, const char *shortDescription, const char *longDescription, @@ -55,7 +55,7 @@ public: return v.str(); } - bool IsPolicyNewerThan(unsigned int majorV, + bool IsPolicyNewerThan(unsigned int majorV, unsigned int minorV, unsigned int patchV, unsigned int tweakV) @@ -86,7 +86,7 @@ public: } return (tweakV < this->TweakVersionIntroduced); } - + cmPolicies::PolicyID ID; std::string IDString; std::string ShortDescription; @@ -285,12 +285,12 @@ cmPolicies::cmPolicies() "The NEW behavior for this policy is to produce an error if a bundle " "target is installed without a BUNDLE DESTINATION.", 2,6,0,0, cmPolicies::WARN); - + this->DefinePolicy( CMP0007, "CMP0007", "list command no longer ignores empty elements.", "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" " 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. " @@ -426,7 +426,7 @@ cmPolicies::cmPolicies() this->DefinePolicy( CMP0015, "CMP0015", "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. " "In CMake 2.8.1 and above the link_directories() command prefers to " "interpret relative paths with respect to CMAKE_CURRENT_SOURCE_DIR, " @@ -437,12 +437,21 @@ cmPolicies::cmPolicies() "absolute paths by appending the relative path to " "CMAKE_CURRENT_SOURCE_DIR.", 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() { // free the policies - std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i + std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i = this->Policies.begin(); for (;i != this->Policies.end(); ++i) { @@ -451,7 +460,7 @@ cmPolicies::~cmPolicies() } void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD, - const char *idString, + const char *idString, const char *shortDescription, const char *longDescription, unsigned int majorVersionIntroduced, @@ -467,7 +476,7 @@ void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD, "ID ", this->GetPolicyIDString(iD).c_str()); return; } - + this->Policies[iD] = new cmPolicy(iD, idString, shortDescription, longDescription, @@ -480,7 +489,7 @@ void cmPolicies::DefinePolicy(cmPolicies::PolicyID iD, } //---------------------------------------------------------------------------- -bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf, +bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf, const char *version) { std::string ver = "2.4.0"; @@ -505,7 +514,7 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf, mf->IssueMessage(cmake::FATAL_ERROR, e.str()); return false; } - + // it is an error if the policy version is less than 2.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 std::vector<cmPolicies::PolicyID> ancientPolicies; - std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i + std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i = this->Policies.begin(); for (;i != this->Policies.end(); ++i) { @@ -589,7 +598,7 @@ bool cmPolicies::GetPolicyID(const char *id, cmPolicies::PolicyID &pid) { return false; } - std::map<std::string,cmPolicies::PolicyID>::iterator pos = + std::map<std::string,cmPolicies::PolicyID>::iterator pos = this->PolicyStringMap.find(id); 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::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos = + std::map<cmPolicies::PolicyID,cmPolicy *>::iterator pos = this->Policies.find(pid); if (pos == this->Policies.end()) { @@ -614,7 +623,7 @@ std::string cmPolicies::GetPolicyIDString(cmPolicies::PolicyID pid) ///! return a warning string for a given policy 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); if (pos == this->Policies.end()) { @@ -633,12 +642,12 @@ std::string cmPolicies::GetPolicyWarning(cmPolicies::PolicyID id) "and suppress this warning."; return msg.str(); } - - + + ///! return an error string for when a required policy is unspecified 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); if (pos == this->Policies.end()) { @@ -664,25 +673,25 @@ std::string cmPolicies::GetRequiredPolicyError(cmPolicies::PolicyID id) } ///! Get the default status for a policy -cmPolicies::PolicyStatus +cmPolicies::PolicyStatus cmPolicies::GetPolicyStatus(cmPolicies::PolicyID id) { // 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); if (pos == this->Policies.end()) { // TODO is this right? return cmPolicies::WARN; } - + return pos->second->Status; } void cmPolicies::GetDocumentation(std::vector<cmDocumentationEntry>& v) { // 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(); for (;i != this->Policies.end(); ++i) { diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 23064dc..fce33ac 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -51,6 +51,7 @@ public: CMP0013, // Duplicate binary directories not allowed CMP0014, // Input directories must have CMakeLists.txt 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 // the last policy when adding a new one. @@ -60,10 +61,10 @@ public: ///! convert a string policy ID into a number bool GetPolicyID(const char *id, /* out */ cmPolicies::PolicyID &pid); std::string GetPolicyIDString(cmPolicies::PolicyID pid); - + ///! Get the default status for a policy cmPolicies::PolicyStatus GetPolicyStatus(cmPolicies::PolicyID id); - + ///! Define a Policy for CMake void DefinePolicy(cmPolicies::PolicyID id, const char *stringID, @@ -80,7 +81,7 @@ public: ///! return a warning string for a given policy std::string GetPolicyWarning(cmPolicies::PolicyID id); - + ///! return an error string for when a required policy is unspecified std::string GetRequiredPolicyError(cmPolicies::PolicyID id); diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx index f1f76c8..805959d 100644 --- a/Source/cmTargetLinkLibrariesCommand.cxx +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -29,23 +29,64 @@ bool cmTargetLinkLibrariesCommand 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. this->Target = this->Makefile->GetCMakeInstance() ->GetGlobalGenerator()->FindTarget(0, args[0].c_str()); if(!this->Target) { + cmake::MessageType t = cmake::FATAL_ERROR; // fail by default cmOStringStream e; e << "Cannot specify link libraries for target \"" << args[0] << "\" " << "which is not built by this project."; - this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); - cmSystemTools::SetFatalErrorOccured(); + // The bad target is the only argument. Check how policy CMP0016 is set, + // 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; } @@ -57,7 +98,7 @@ bool cmTargetLinkLibrariesCommand // specification when the keyword is encountered. 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 for(unsigned int i=1; i < args.size(); ++i) { @@ -118,7 +159,7 @@ bool cmTargetLinkLibrariesCommand llt = cmTarget::GENERAL; std::string linkType = args[0]; linkType += "_LINK_TYPE"; - const char* linkTypeString = + const char* linkTypeString = this->Makefile->GetDefinition( linkType.c_str() ); if(linkTypeString) { @@ -133,7 +174,7 @@ bool cmTargetLinkLibrariesCommand } this->HandleLibrary(args[i].c_str(), llt); } - } + } // Make sure the last argument was not a library type specifier. if(haveLLT) |