diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index b133e3570..87157a7e4 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1078,8 +1078,47 @@ 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(item, true)); + this->Items.push_back(Item(final_item, true)); } //----------------------------------------------------------------------------