summaryrefslogtreecommitdiffstats
path: root/Source/cmComputeLinkInformation.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmComputeLinkInformation.cxx')
-rw-r--r--Source/cmComputeLinkInformation.cxx108
1 files changed, 68 insertions, 40 deletions
diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx
index 9b6837d..af4b141 100644
--- a/Source/cmComputeLinkInformation.cxx
+++ b/Source/cmComputeLinkInformation.cxx
@@ -1042,6 +1042,20 @@ void cmComputeLinkInformation::AddFullItem(std::string const& item)
return;
}
+ // Full path libraries should specify a valid library file name.
+ // See documentation of CMP0008.
+ if(this->Target->GetPolicyStatusCMP0008() != cmPolicies::NEW &&
+ (strstr(this->GlobalGenerator->GetName(), "Visual Studio") ||
+ strstr(this->GlobalGenerator->GetName(), "Xcode")))
+ {
+ std::string file = cmSystemTools::GetFilenameName(item);
+ if(!this->ExtractAnyLibraryName.find(file.c_str()))
+ {
+ this->HandleBadFullItem(item, file);
+ return;
+ }
+ }
+
// This is called to handle a link item that is a full path.
// If the target is not a static library make sure the link type is
// shared. This is because dynamic-mode linking can handle both
@@ -1078,47 +1092,8 @@ void cmComputeLinkInformation::AddFullItem(std::string const& item)
this->Items.push_back(Item(this->LibLinkFileFlag, false));
}
- // Full path libraries should have an extension. CMake 2.4 would
- // add the extension after splitting the file off of the directory.
- // Some existing projects depended on this to build correctly
- // because they left off the extension of an otherwise full-path
- // library. This worked with CMake 2.4 but only for VS IDE builds
- // because the file-level dependency added to the Makefile would not
- // be found. Nevertheless, some projects have this mistake but work
- // because they build only with the VS IDE. We need to support them
- // here by adding the missing extension.
- std::string final_item = item;
- if(strstr(this->GlobalGenerator->GetName(), "Visual Studio") &&
- this->Makefile->NeedBackwardsCompatibility(2,4) &&
- !cmSystemTools::ComparePath(
- cmSystemTools::GetFilenameLastExtension(item).c_str(),
- this->LibLinkSuffix.c_str()))
- {
- // Issue the warning at most once.
- std::string wid = "VSIDE-LINK-EXT-";
- wid += item;
- if(!this->Target->GetPropertyAsBool(wid.c_str()))
- {
- this->Target->SetProperty(wid.c_str(), "1");
- cmOStringStream w;
- w << "Target \"" << this->Target->GetName() << "\" links to "
- << "full-path item\n"
- << " " << item << "\n"
- << "which does not have the proper link extension \""
- << this->LibLinkSuffix << "\". "
- << "CMake is adding the missing extension because compatibility "
- << "with CMake 2.4 is currently enabled and this case worked "
- << "accidentally in that version. "
- << "The link extension should be added by the project developer.";
- this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
- }
-
- // Add the missing extension.
- final_item += this->LibLinkSuffix;
- }
-
// Now add the full path to the library.
- this->Items.push_back(Item(final_item, true));
+ this->Items.push_back(Item(item, true));
}
//----------------------------------------------------------------------------
@@ -1384,6 +1359,59 @@ void cmComputeLinkInformation::AddSharedLibNoSOName(std::string const& item)
}
//----------------------------------------------------------------------------
+void cmComputeLinkInformation::HandleBadFullItem(std::string const& item,
+ std::string const& file)
+{
+ // Tell the linker to search for the item and provide the proper
+ // path for it. Do not contribute to any CMP0003 warning (do not
+ // put in OldLinkDirItems or OldUserFlagItems).
+ this->AddUserItem(file, false);
+ this->OrderLinkerSearchPath->AddLinkLibrary(item);
+
+ // Produce any needed message.
+ switch(this->Target->GetPolicyStatusCMP0008())
+ {
+ case cmPolicies::WARN:
+ {
+ // Print the warning at most once for this item.
+ std::string wid = "CMP0008-WARNING-GIVEN-";
+ wid += item;
+ if(!this->CMakeInstance->GetPropertyAsBool(wid.c_str()))
+ {
+ this->CMakeInstance->SetProperty(wid.c_str(), "1");
+ cmOStringStream w;
+ w << (this->Makefile->GetPolicies()
+ ->GetPolicyWarning(cmPolicies::CMP0008)) << "\n"
+ << "Target \"" << this->Target->GetName() << "\" links to item\n"
+ << " " << item << "\n"
+ << "which is a full-path but not a valid library file name.";
+ this->CMakeInstance->IssueMessage(cmake::AUTHOR_WARNING, w.str(),
+ this->Target->GetBacktrace());
+ }
+ }
+ case cmPolicies::OLD:
+ // OLD behavior does not warn.
+ break;
+ case cmPolicies::NEW:
+ // NEW behavior will not get here.
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ {
+ cmOStringStream e;
+ e << (this->Makefile->GetPolicies()->
+ GetRequiredPolicyError(cmPolicies::CMP0008)) << "\n"
+ << "Target \"" << this->Target->GetName() << "\" links to item\n"
+ << " " << item << "\n"
+ << "which is a full-path but not a valid library file name.";
+ this->CMakeInstance->IssueMessage(cmake::FATAL_ERROR, e.str(),
+ this->Target->GetBacktrace());
+ }
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
bool cmComputeLinkInformation::FinishLinkerSearchDirectories()
{
// Support broken projects if necessary.