AIX: Enable versioned shared objects with CMAKE_AIX_SHARED_LIBRARY_ARCHIVE

Closes: #26358
This commit is contained in:
Aditya Vidyadhar Kamath
2024-10-10 05:16:28 -05:00
committed by Brad King
parent 7fb05af311
commit dc8e4f8f0c
3 changed files with 19 additions and 7 deletions

View File

@@ -1309,7 +1309,8 @@ bool cmGeneratorTarget::HasSOName(const std::string& config) const
// and then only when the platform supports an soname flag. // and then only when the platform supports an soname flag.
return ((this->GetType() == cmStateEnums::SHARED_LIBRARY) && return ((this->GetType() == cmStateEnums::SHARED_LIBRARY) &&
!this->GetPropertyAsBool("NO_SONAME") && !this->GetPropertyAsBool("NO_SONAME") &&
this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config))); (this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config)) ||
this->IsArchivedAIXSharedLibrary()));
} }
bool cmGeneratorTarget::NeedRelinkBeforeInstall( bool cmGeneratorTarget::NeedRelinkBeforeInstall(
@@ -3398,7 +3399,7 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames(
cmValue soversion = this->GetProperty("SOVERSION"); cmValue soversion = this->GetProperty("SOVERSION");
if (!this->HasSOName(config) || if (!this->HasSOName(config) ||
this->Makefile->IsOn("CMAKE_PLATFORM_NO_VERSIONED_SONAME") || this->Makefile->IsOn("CMAKE_PLATFORM_NO_VERSIONED_SONAME") ||
this->IsFrameworkOnApple() || this->IsArchivedAIXSharedLibrary()) { this->IsFrameworkOnApple()) {
// Versioning is supported only for shared libraries and modules, // Versioning is supported only for shared libraries and modules,
// and then only when the platform supports an soname flag. // and then only when the platform supports an soname flag.
version = nullptr; version = nullptr;
@@ -3434,6 +3435,10 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames(
} else if (this->IsArchivedAIXSharedLibrary()) { } else if (this->IsArchivedAIXSharedLibrary()) {
targetNames.SharedObject = targetNames.SharedObject =
cmStrCat(components.prefix, targetNames.Base, ".so"); cmStrCat(components.prefix, targetNames.Base, ".so");
if (soversion) {
targetNames.SharedObject += ".";
targetNames.SharedObject += *soversion;
}
targetNames.Real = targetNames.Output; targetNames.Real = targetNames.Output;
} else { } else {
// The library's soname. // The library's soname.

View File

@@ -9,7 +9,7 @@ if(NOT aix_sla)
message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library") message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library")
endif() endif()
add_custom_command(TARGET sla POST_BUILD VERBATIM add_custom_command(TARGET sla POST_BUILD VERBATIM
COMMAND ${CMAKE_COMMAND} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -Dsla=$<TARGET_FILE:sla> -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake COMMAND ${CMAKE_COMMAND} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -Dsla=$<TARGET_FILE:sla> -Dname=sla -Dsoversion= -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake
) )
add_executable(UseSLA use_sla.c) 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) if(NOT aix_sla_versioned)
message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library") message(FATAL_ERROR "AIX_SHARED_LIBRARY_ARCHIVE not initialized on SHARED library")
endif() endif()
set_target_properties(sla_versioned PROPERTIES OUTPUT_NAME "sla_versioned" VERSION 3 SOVERSION 2) 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=$<TARGET_FILE:sla_versioned> -Dname=sla_versioned -Dsoversion=2 -P${CMAKE_CURRENT_SOURCE_DIR}/sla-check.cmake
)
add_executable(UseSLA_versioned use_sla.c) add_executable(UseSLA_versioned use_sla.c)
get_property(aix_sla_versioned TARGET UseSLA_versioned PROPERTY AIX_SHARED_LIBRARY_ARCHIVE) get_property(aix_sla_versioned TARGET UseSLA_versioned PROPERTY AIX_SHARED_LIBRARY_ARCHIVE)

View File

@@ -1,9 +1,14 @@
if(CMAKE_SYSTEM_NAME STREQUAL "AIX") 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}") message(FATAL_ERROR "sla library does not look like an archive:\n ${sla}")
endif() endif()
execute_process(COMMAND ar t ${sla} OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE sla_members) execute_process(COMMAND ar t ${sla} OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE sla_members)
if(NOT sla_members MATCHES [[^libsla\.so]]) if(soversion)
message(FATAL_ERROR "sla library archive does not have expected members:\n ${sla_members}") 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()
endif() endif()