ENH: Support full-path libs w/out extension in VS IDE.

- This case worked accidentally in CMake 2.4, though not in Makefiles.
  - Some projects build only with the VS IDE on windows and have this
    mistake.
  - Support them when 2.4 compatibility is enabled by adding the extension.
This commit is contained in:
Brad King 2008-07-21 10:07:56 -04:00
parent dbb89f47aa
commit ff63bb1b44
1 changed files with 40 additions and 1 deletions

View File

@ -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));
}
//----------------------------------------------------------------------------