From 26df00f83a73821e39e20624d3ca7f66fdd4db97 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 6 Jul 2009 16:24:45 -0400 Subject: ENH: Move CMP0004 check into cmTarget This moves code implementing policy CMP0004 into cmTarget::CheckCMP0004. The implementation is slightly simpler and can be re-used outside of cmComputeLinkDepends. --- Source/cmComputeLinkDepends.cxx | 62 +---------------------------------------- Source/cmComputeLinkDepends.h | 1 - Source/cmTarget.cxx | 59 +++++++++++++++++++++++++++++++++++++++ Source/cmTarget.h | 4 +++ 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1278d8c..406761f 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -553,7 +553,7 @@ cmComputeLinkDepends::AddLinkEntries(int depender_index, { // Skip entries that will resolve to the target getting linked or // are empty. - std::string item = this->CleanItemName(*li); + std::string item = this->Target->CheckCMP0004(*li); if(item == this->Target->GetName() || item.empty()) { continue; @@ -606,66 +606,6 @@ cmComputeLinkDepends::AddLinkEntries(int depender_index, } //---------------------------------------------------------------------------- -std::string cmComputeLinkDepends::CleanItemName(std::string const& item) -{ - // Strip whitespace off the library names because we used to do this - // in case variables were expanded at generate time. We no longer - // do the expansion but users link to libraries like " ${VAR} ". - std::string lib = item; - std::string::size_type pos = lib.find_first_not_of(" \t\r\n"); - if(pos != lib.npos) - { - lib = lib.substr(pos, lib.npos); - } - pos = lib.find_last_not_of(" \t\r\n"); - if(pos != lib.npos) - { - lib = lib.substr(0, pos+1); - } - if(lib != item) - { - switch(this->Target->GetPolicyStatusCMP0004()) - { - case cmPolicies::WARN: - { - cmOStringStream w; - w << (this->Makefile->GetPolicies() - ->GetPolicyWarning(cmPolicies::CMP0004)) << "\n" - << "Target \"" << this->Target->GetName() << "\" links to item \"" - << 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; -} - -//---------------------------------------------------------------------------- cmTarget* cmComputeLinkDepends::FindTargetToLink(int depender_index, const char* name) { diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index fdca2b5..c48447a 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -87,7 +87,6 @@ private: LinkLibraryVectorType const& libs); void AddLinkEntries(int depender_index, std::vector const& libs); - std::string CleanItemName(std::string const& item); cmTarget* FindTargetToLink(int depender_index, const char* name); // One entry for each unique item. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 3d6e1b7..6cddbe3 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3815,6 +3815,65 @@ cmTarget::ComputeLinkInterface(const char* config) } //---------------------------------------------------------------------------- +std::string cmTarget::CheckCMP0004(std::string const& item) +{ + // Strip whitespace off the library names because we used to do this + // in case variables were expanded at generate time. We no longer + // do the expansion but users link to libraries like " ${VAR} ". + std::string lib = item; + std::string::size_type pos = lib.find_first_not_of(" \t\r\n"); + if(pos != lib.npos) + { + lib = lib.substr(pos, lib.npos); + } + pos = lib.find_last_not_of(" \t\r\n"); + if(pos != lib.npos) + { + lib = lib.substr(0, pos+1); + } + if(lib != item) + { + cmake* cm = this->Makefile->GetCMakeInstance(); + switch(this->PolicyStatusCMP0004) + { + case cmPolicies::WARN: + { + cmOStringStream w; + w << (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0004)) << "\n" + << "Target \"" << this->GetName() << "\" links to item \"" + << item << "\" which has leading or trailing whitespace."; + cm->IssueMessage(cmake::AUTHOR_WARNING, w.str(), + this->GetBacktrace()); + } + case cmPolicies::OLD: + break; + case cmPolicies::NEW: + { + cmOStringStream e; + e << "Target \"" << this->GetName() << "\" links to item \"" + << item << "\" which has leading or trailing whitespace. " + << "This is now an error according to policy CMP0004."; + cm->IssueMessage(cmake::FATAL_ERROR, e.str(), this->GetBacktrace()); + } + break; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + { + cmOStringStream e; + e << (this->Makefile->GetPolicies() + ->GetRequiredPolicyError(cmPolicies::CMP0004)) << "\n" + << "Target \"" << this->GetName() << "\" links to item \"" + << item << "\" which has leading or trailing whitespace."; + cm->IssueMessage(cmake::FATAL_ERROR, e.str(), this->GetBacktrace()); + } + break; + } + } + return lib; +} + +//---------------------------------------------------------------------------- cmComputeLinkInformation* cmTarget::GetLinkInformation(const char* config) { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 9e17d60..83fd0b1 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -260,6 +260,10 @@ public: such dependencies or for static libraries. */ cmTargetLinkInterface const* GetLinkInterface(const char* config); + /** Strip off leading and trailing whitespace from an item named in + the link dependencies of this target. */ + std::string CheckCMP0004(std::string const& item); + /** Get the directory in which this target will be built. If the configuration name is given then the generator will add its subdirectory for that configuration. Otherwise just the canonical -- cgit v0.12