Commit f799ffb5 authored by Felix Geyer's avatar Felix Geyer Committed by Brad King

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

The SONAME field is only useful for shared libraries that application
link against.
parent 899458ab
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
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
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
......
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.
......@@ -761,8 +761,7 @@ bool cmGeneratorTarget::HasSOName(const std::string& config) const
{
// soname is supported only for shared libraries and modules,
Please register or sign in to reply
// and then only when the platform supports an soname flag.
return ((this->GetType() == cmTarget::SHARED_LIBRARY ||
this->GetType() == cmTarget::MODULE_LIBRARY) &&
return ((this->GetType() == cmTarget::SHARED_LIBRARY) &&
!this->GetPropertyAsBool("NO_SONAME") &&
this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config)));
}
......
......@@ -52,13 +52,8 @@ target_link_libraries(example_mod_1 example_exe)
if(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND
"${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.
export(TARGETS example_mod_1 example_mod_2 NAMESPACE exp_
export(TARGETS example_mod_1 NAMESPACE exp_
FILE ${CMAKE_CURRENT_BINARY_DIR}/mods.cmake)
include(ExternalProject)
......@@ -68,7 +63,7 @@ if(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND
DOWNLOAD_COMMAND ""
INSTALL_COMMAND ""
)
add_dependencies(PluginTest example_mod_1 example_mod_2)
add_dependencies(PluginTest example_mod_1)
endif()
# TODO:
......
......@@ -6,17 +6,11 @@ include(${CMAKE_CURRENT_BINARY_DIR}/../mods.cmake)
get_property(configs TARGET exp_example_mod_1 PROPERTY IMPORTED_CONFIGURATIONS)
foreach(c ${configs})
string(TOUPPER "${c}" CONFIG)
get_property(soname1 TARGET exp_example_mod_1 PROPERTY IMPORTED_SONAME_${CONFIG})
get_property(soname2 TARGET exp_example_mod_2 PROPERTY IMPORTED_NO_SONAME_${CONFIG})
if(soname1)
message(STATUS "exp_example_mod_1 has IMPORTED_SONAME_${CONFIG} as expected: ${soname1}")
get_property(soname TARGET exp_example_mod_1 PROPERTY IMPORTED_NO_SONAME_${CONFIG})
if(soname)
message(STATUS "exp_example_mod_1 has IMPORTED_NO_SONAME_${CONFIG} as expected: ${soname}")
else()
message(SEND_ERROR "exp_example_mod_1 does not have IMPORTED_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")
message(SEND_ERROR "exp_example_mod_1 does not have IMPORTED_NO_SONAME_${CONFIG} but should")
endif()
endforeach()
......@@ -26,8 +20,7 @@ if("${CMAKE_EXECUTABLE_FORMAT}" MATCHES "ELF")
if(READELF_EXE)
add_custom_target(check_mod_soname ALL COMMAND
${CMAKE_COMMAND} -Dreadelf=${READELF_EXE}
-Dmod1=$<TARGET_FILE:exp_example_mod_1>
-Dmod2=$<TARGET_FILE:exp_example_mod_2>
-Dmod=$<TARGET_FILE:exp_example_mod_1>
-P ${CMAKE_CURRENT_SOURCE_DIR}/../check_mod_soname.cmake
)
endif()
......
execute_process(COMMAND ${readelf} -d ${mod1} OUTPUT_FILE ${mod1}.readelf.txt)
execute_process(COMMAND ${readelf} -d ${mod2} OUTPUT_FILE ${mod2}.readelf.txt)
file(STRINGS ${mod1}.readelf.txt soname1 REGEX "\\(SONAME\\)")
file(STRINGS ${mod2}.readelf.txt soname2 REGEX "\\(SONAME\\)")
if(soname1)
message(STATUS "${mod1} has soname as expected: ${soname1}")
execute_process(COMMAND ${readelf} -d ${mod} OUTPUT_FILE ${mod}.readelf.txt)
file(STRINGS ${mod}.readelf.txt soname REGEX "\\(SONAME\\)")
if(soname)
message(FATAL_ERROR "${mod} has soname but should not:\n ${soname}")
else()
message(FATAL_ERROR "${mod1} has no soname but should:\n ${soname1}")
endif()
if(soname2)
message(FATAL_ERROR "${mod2} has soname but should not:\n ${soname2}")
else()
message(STATUS "${mod2} has no soname as expected")
message(STATUS "${mod} has no soname as expected")
endif()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment