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:
parent
899458ab20
commit
f799ffb5cb
|
@ -1,11 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -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.
|
|
@ -761,8 +761,7 @@ bool cmGeneratorTarget::HasSOName(const std::string& config) const
|
|||
{
|
||||
// soname is supported only for shared libraries and modules,
|
||||
// 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()
|
||||
|
|
|
@ -1,14 +1,7 @@
|
|||
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()
|
||||
|
|
Loading…
Reference in New Issue