From bdf8e186e5084020a4cbbbe9aa2f63af0febf4ff Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 5 Oct 2006 16:59:46 -0400 Subject: 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. --- Source/cmLocalGenerator.cxx | 8 ++++++-- Source/cmOrderLinkDirectories.cxx | 35 ++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 84b4902..545b4ca 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1716,6 +1716,12 @@ void cmLocalGenerator this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_PREFIX")); orderLibs.AddLinkPrefix( 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( this->Makefile->GetDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"), cmOrderLinkDirectories::LinkStatic); @@ -1723,8 +1729,6 @@ void cmLocalGenerator this->Makefile->GetDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"), cmOrderLinkDirectories::LinkShared); orderLibs.AddLinkExtension( - this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX")); - orderLibs.AddLinkExtension( this->Makefile->GetDefinition("CMAKE_LINK_LIBRARY_SUFFIX")); if(const char* linkSuffixes = this->Makefile->GetDefinition("CMAKE_EXTRA_LINK_EXTENSIONS")) diff --git a/Source/cmOrderLinkDirectories.cxx b/Source/cmOrderLinkDirectories.cxx index fe00ec2..fb25711 100644 --- a/Source/cmOrderLinkDirectories.cxx +++ b/Source/cmOrderLinkDirectories.cxx @@ -267,19 +267,17 @@ void cmOrderLinkDirectories::PrepareLinkTargets() for(std::vector::iterator i = originalLinkItems.begin(); i != originalLinkItems.end(); ++i) { - // separate the library name from libfoo.a or foo.a - 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->ExtractSharedLibraryName.find(*i)) + // Parse out the prefix, base, and suffix components of the + // library name. If the name matches that of a shared or static + // library then set the link type accordingly. + // + // Search for shared library names first because some platforms + // have shared libraries with names that match the static library + // pattern. For example cygwin and msys use the convention + // libfoo.dll.a for import libraries and libfoo.a for static + // libraries. On AIX a library with the name libfoo.a can be + // shared! + if(this->ExtractSharedLibraryName.find(*i)) { #ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG fprintf(stderr, "shared regex matched [%s] [%s] [%s]\n", @@ -290,6 +288,17 @@ void cmOrderLinkDirectories::PrepareLinkTargets() this->SetCurrentLinkType(LinkShared); 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)) { #ifdef CM_ORDER_LINK_DIRECTORIES_DEBUG -- cgit v0.12