diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 8bac4a1365..fb92771b03 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1309,7 +1309,8 @@ bool cmGeneratorTarget::HasSOName(const std::string& config) const // and then only when the platform supports an soname flag. return ((this->GetType() == cmStateEnums::SHARED_LIBRARY) && !this->GetPropertyAsBool("NO_SONAME") && - this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config))); + (this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config)) || + this->IsArchivedAIXSharedLibrary())); } bool cmGeneratorTarget::NeedRelinkBeforeInstall( @@ -3398,7 +3399,7 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames( cmValue soversion = this->GetProperty("SOVERSION"); if (!this->HasSOName(config) || this->Makefile->IsOn("CMAKE_PLATFORM_NO_VERSIONED_SONAME") || - this->IsFrameworkOnApple() || this->IsArchivedAIXSharedLibrary()) { + this->IsFrameworkOnApple()) { // Versioning is supported only for shared libraries and modules, // and then only when the platform supports an soname flag. version = nullptr; @@ -3434,6 +3435,10 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames( } else if (this->IsArchivedAIXSharedLibrary()) { targetNames.SharedObject = cmStrCat(components.prefix, targetNames.Base, ".so"); + if (soversion) { + targetNames.SharedObject += "."; + targetNames.SharedObject += *soversion; + } targetNames.Real = targetNames.Output; } else { // The library's soname. diff --git a/Tests/SharedLibraryArchive/CMakeLists.txt b/Tests/SharedLibraryArchive/CMakeLists.txt index 3af0f76b47..f6bef2434b 100644 --- a/Tests/SharedLibraryArchive/CMakeLists.txt +++ b/Tests/SharedLibraryArchive/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT aix_sla) message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library") endif() add_custom_command(TARGET sla POST_BUILD VERBATIM - COMMAND ${CMAKE_COMMAND} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -Dsla=$ -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake + COMMAND ${CMAKE_COMMAND} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -Dsla=$ -Dname=sla -Dsoversion= -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake ) add_executable(UseSLA use_sla.c) @@ -25,8 +25,10 @@ get_property(aix_sla_versioned TARGET sla_versioned PROPERTY AIX_SHARED_LIBRARY_ if(NOT aix_sla_versioned) message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library") endif() - set_target_properties(sla_versioned PROPERTIES OUTPUT_NAME "sla_versioned" VERSION 3 SOVERSION 2) +add_custom_command(TARGET sla_versioned POST_BUILD VERBATIM + COMMAND ${CMAKE_COMMAND} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -Dsla=$ -Dname=sla_versioned -Dsoversion=2 -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake + ) add_executable(UseSLA_versioned use_sla.c) get_property(aix_sla_versioned TARGET UseSLA_versioned PROPERTY AIX_SHARED_LIBRARY_ARCHIVE) diff --git a/Tests/SharedLibraryArchive/sla-check.cmake b/Tests/SharedLibraryArchive/sla-check.cmake index bc1fee5272..90a0de4363 100644 --- a/Tests/SharedLibraryArchive/sla-check.cmake +++ b/Tests/SharedLibraryArchive/sla-check.cmake @@ -1,9 +1,14 @@ if(CMAKE_SYSTEM_NAME STREQUAL "AIX") - if(NOT sla MATCHES [[/libsla\.a]]) + set(sla_regex "/lib${name}\\.a$") + if(NOT sla MATCHES "${sla_regex}") message(FATAL_ERROR "sla library does not look like an archive:\n ${sla}") endif() execute_process(COMMAND ar t ${sla} OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE sla_members) - if(NOT sla_members MATCHES [[^libsla\.so]]) - message(FATAL_ERROR "sla library archive does not have expected members:\n ${sla_members}") + if(soversion) + set(soversion_regex "\\.${soversion}") + endif() + set(sla_members_regex "^lib${name}\\.so${soversion_regex}$") + if(NOT sla_members MATCHES "${sla_members_regex}") + message(FATAL_ERROR "sla library archive has members:\n ${sla_members}\nthat do not match:\n ${sla_members_regex}") endif() endif()