Do not set SONAME for MODULE library targets (#15705)

The SONAME field is only useful for shared libraries that application
link against.
This commit is contained in:
Felix Geyer 2015-08-20 14:13:28 +02:00 committed by Brad King
parent 899458ab20
commit f799ffb5cb
6 changed files with 23 additions and 36 deletions

View File

@ -1,11 +1,11 @@
NO_SONAME NO_SONAME
--------- ---------
Whether to set "soname" when linking a shared library or module. Whether to set "soname" when linking a shared library.
Enable this boolean property if a generated shared library or module Enable this boolean property if a generated shared library
should not have "soname" set. Default is to set "soname" on all should not have "soname" set. Default is to set "soname" on all
shared libraries and modules as long as the platform supports it. shared libraries as long as the platform supports it.
Generally, use this property only for leaf private libraries or Generally, use this property only for leaf private libraries or
plugins. If you use it on normal shared libraries which other targets plugins. If you use it on normal shared libraries which other targets
link against, on some platforms a linker will insert a full path to link against, on some platforms a linker will insert a full path to

View File

@ -0,0 +1,7 @@
modules-no-soname
-----------------
* The ``SONAME`` field is no longer set for ``MODULE`` libraries
created with the :command:`add_library` command. ``MODULE``
libraries are meant for explicit dynamic loading at runtime.
They cannot be linked so ``SONAME`` is not useful.

View File

@ -761,8 +761,7 @@ bool cmGeneratorTarget::HasSOName(const std::string& config) const
{ {
// soname is supported only for shared libraries and modules, // soname 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.
return ((this->GetType() == cmTarget::SHARED_LIBRARY || return ((this->GetType() == cmTarget::SHARED_LIBRARY) &&
this->GetType() == cmTarget::MODULE_LIBRARY) &&
!this->GetPropertyAsBool("NO_SONAME") && !this->GetPropertyAsBool("NO_SONAME") &&
this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config))); this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config)));
} }

View File

@ -52,13 +52,8 @@ target_link_libraries(example_mod_1 example_exe)
if(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND if(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND
"${CMAKE_C_CREATE_SHARED_MODULE}" MATCHES "SONAME_FLAG") "${CMAKE_C_CREATE_SHARED_MODULE}" MATCHES "SONAME_FLAG")
# Add a second plugin that should not have any soname.
add_library(example_mod_2 MODULE src/example_mod_1.c)
target_link_libraries(example_mod_2 example_exe)
set_property(TARGET example_mod_2 PROPERTY NO_SONAME 1)
# Verify that targets export with proper IMPORTED SONAME properties. # Verify that targets export with proper IMPORTED SONAME properties.
export(TARGETS example_mod_1 example_mod_2 NAMESPACE exp_ export(TARGETS example_mod_1 NAMESPACE exp_
FILE ${CMAKE_CURRENT_BINARY_DIR}/mods.cmake) FILE ${CMAKE_CURRENT_BINARY_DIR}/mods.cmake)
include(ExternalProject) include(ExternalProject)
@ -68,7 +63,7 @@ if(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND
DOWNLOAD_COMMAND "" DOWNLOAD_COMMAND ""
INSTALL_COMMAND "" INSTALL_COMMAND ""
) )
add_dependencies(PluginTest example_mod_1 example_mod_2) add_dependencies(PluginTest example_mod_1)
endif() endif()
# TODO: # TODO:

View File

@ -6,17 +6,11 @@ include(${CMAKE_CURRENT_BINARY_DIR}/../mods.cmake)
get_property(configs TARGET exp_example_mod_1 PROPERTY IMPORTED_CONFIGURATIONS) get_property(configs TARGET exp_example_mod_1 PROPERTY IMPORTED_CONFIGURATIONS)
foreach(c ${configs}) foreach(c ${configs})
string(TOUPPER "${c}" CONFIG) string(TOUPPER "${c}" CONFIG)
get_property(soname1 TARGET exp_example_mod_1 PROPERTY IMPORTED_SONAME_${CONFIG}) get_property(soname TARGET exp_example_mod_1 PROPERTY IMPORTED_NO_SONAME_${CONFIG})
get_property(soname2 TARGET exp_example_mod_2 PROPERTY IMPORTED_NO_SONAME_${CONFIG}) if(soname)
if(soname1) message(STATUS "exp_example_mod_1 has IMPORTED_NO_SONAME_${CONFIG} as expected: ${soname}")
message(STATUS "exp_example_mod_1 has IMPORTED_SONAME_${CONFIG} as expected: ${soname1}")
else() else()
message(SEND_ERROR "exp_example_mod_1 does not have IMPORTED_SONAME_${CONFIG} but should") message(SEND_ERROR "exp_example_mod_1 does not have IMPORTED_NO_SONAME_${CONFIG} but should")
endif()
if(soname2)
message(STATUS "exp_example_mod_2 has IMPORTED_NO_SONAME_${CONFIG} as expected: ${soname2}")
else()
message(SEND_ERROR "exp_example_mod_2 does not have IMPORTED_NO_SONAME_${CONFIG} but should")
endif() endif()
endforeach() endforeach()
@ -26,8 +20,7 @@ if("${CMAKE_EXECUTABLE_FORMAT}" MATCHES "ELF")
if(READELF_EXE) if(READELF_EXE)
add_custom_target(check_mod_soname ALL COMMAND add_custom_target(check_mod_soname ALL COMMAND
${CMAKE_COMMAND} -Dreadelf=${READELF_EXE} ${CMAKE_COMMAND} -Dreadelf=${READELF_EXE}
-Dmod1=$<TARGET_FILE:exp_example_mod_1> -Dmod=$<TARGET_FILE:exp_example_mod_1>
-Dmod2=$<TARGET_FILE:exp_example_mod_2>
-P ${CMAKE_CURRENT_SOURCE_DIR}/../check_mod_soname.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/../check_mod_soname.cmake
) )
endif() endif()

View File

@ -1,14 +1,7 @@
execute_process(COMMAND ${readelf} -d ${mod1} OUTPUT_FILE ${mod1}.readelf.txt) execute_process(COMMAND ${readelf} -d ${mod} OUTPUT_FILE ${mod}.readelf.txt)
execute_process(COMMAND ${readelf} -d ${mod2} OUTPUT_FILE ${mod2}.readelf.txt) file(STRINGS ${mod}.readelf.txt soname REGEX "\\(SONAME\\)")
file(STRINGS ${mod1}.readelf.txt soname1 REGEX "\\(SONAME\\)") if(soname)
file(STRINGS ${mod2}.readelf.txt soname2 REGEX "\\(SONAME\\)") message(FATAL_ERROR "${mod} has soname but should not:\n ${soname}")
if(soname1)
message(STATUS "${mod1} has soname as expected: ${soname1}")
else() else()
message(FATAL_ERROR "${mod1} has no soname but should:\n ${soname1}") message(STATUS "${mod} has no soname as expected")
endif()
if(soname2)
message(FATAL_ERROR "${mod2} has soname but should not:\n ${soname2}")
else()
message(STATUS "${mod2} has no soname as expected")
endif() endif()