BUG: Need to match shared library names before static because some platforms have static name patterns that match their shared patterns but not vice versa. This is needed for implementing bug#1644 on cygwin.

This commit is contained in:
Brad King 2006-10-05 16:59:46 -04:00
parent e0a662a3dd
commit bdf8e186e5
2 changed files with 28 additions and 15 deletions

View File

@ -1716,14 +1716,18 @@ void cmLocalGenerator
this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_PREFIX")); this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_PREFIX"));
orderLibs.AddLinkPrefix( orderLibs.AddLinkPrefix(
this->Makefile->GetDefinition("CMAKE_SHARED_LIBRARY_PREFIX")); this->Makefile->GetDefinition("CMAKE_SHARED_LIBRARY_PREFIX"));
// Import library names should be matched and treated as shared
// libraries for the purposes of linking.
orderLibs.AddLinkExtension(
this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX"),
cmOrderLinkDirectories::LinkShared);
orderLibs.AddLinkExtension( orderLibs.AddLinkExtension(
this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"), this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"),
cmOrderLinkDirectories::LinkStatic); cmOrderLinkDirectories::LinkStatic);
orderLibs.AddLinkExtension( orderLibs.AddLinkExtension(
this->Makefile->GetDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"), this->Makefile->GetDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"),
cmOrderLinkDirectories::LinkShared); cmOrderLinkDirectories::LinkShared);
orderLibs.AddLinkExtension(
this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX"));
orderLibs.AddLinkExtension( orderLibs.AddLinkExtension(
this->Makefile->GetDefinition("CMAKE_LINK_LIBRARY_SUFFIX")); this->Makefile->GetDefinition("CMAKE_LINK_LIBRARY_SUFFIX"));
if(const char* linkSuffixes = if(const char* linkSuffixes =

View File

@ -267,19 +267,17 @@ void cmOrderLinkDirectories::PrepareLinkTargets()
for(std::vector<cmStdString>::iterator i = originalLinkItems.begin(); for(std::vector<cmStdString>::iterator i = originalLinkItems.begin();
i != originalLinkItems.end(); ++i) i != originalLinkItems.end(); ++i)
{ {
// separate the library name from libfoo.a or foo.a // Parse out the prefix, base, and suffix components of the
if(this->ExtractStaticLibraryName.find(*i)) // library name. If the name matches that of a shared or static
{ // library then set the link type accordingly.
#ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG //
fprintf(stderr, "static regex matched [%s] [%s] [%s]\n", // Search for shared library names first because some platforms
this->ExtractStaticLibraryName.match(1).c_str(), // have shared libraries with names that match the static library
this->ExtractStaticLibraryName.match(2).c_str(), // pattern. For example cygwin and msys use the convention
this->ExtractStaticLibraryName.match(3).c_str()); // libfoo.dll.a for import libraries and libfoo.a for static
#endif // libraries. On AIX a library with the name libfoo.a can be
this->SetCurrentLinkType(LinkStatic); // shared!
this->LinkItems.push_back(this->ExtractStaticLibraryName.match(2)); if(this->ExtractSharedLibraryName.find(*i))
}
else if(this->ExtractSharedLibraryName.find(*i))
{ {
#ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG #ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG
fprintf(stderr, "shared regex matched [%s] [%s] [%s]\n", fprintf(stderr, "shared regex matched [%s] [%s] [%s]\n",
@ -290,6 +288,17 @@ void cmOrderLinkDirectories::PrepareLinkTargets()
this->SetCurrentLinkType(LinkShared); this->SetCurrentLinkType(LinkShared);
this->LinkItems.push_back(this->ExtractSharedLibraryName.match(2)); this->LinkItems.push_back(this->ExtractSharedLibraryName.match(2));
} }
else if(this->ExtractStaticLibraryName.find(*i))
{
#ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG
fprintf(stderr, "static regex matched [%s] [%s] [%s]\n",
this->ExtractStaticLibraryName.match(1).c_str(),
this->ExtractStaticLibraryName.match(2).c_str(),
this->ExtractStaticLibraryName.match(3).c_str());
#endif
this->SetCurrentLinkType(LinkStatic);
this->LinkItems.push_back(this->ExtractStaticLibraryName.match(2));
}
else if(this->ExtractAnyLibraryName.find(*i)) else if(this->ExtractAnyLibraryName.find(*i))
{ {
#ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG #ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG