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
|
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
|
||||||
|
|
|
@ -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,
|
// 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)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue