mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-19 02:17:27 +08:00
file(GET_RUNTIME_DEPENDENCIES): Fix weak macOS libraries not detected
Starting with Clang 12, `otool -l` reports `LC_LOAD_WEAK_DYLIB` instead of `LC_LOAD_DYLIB` for weakly linked libraries. Update the implementation of `file(GET_RUNTIME_DEPENDENCIES)` to recognize these. Fixes: #21684
This commit is contained in:

committed by
Brad King

parent
f2d92b983b
commit
7e615a540e
@@ -44,7 +44,7 @@ bool cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool::GetFileInfo(
|
|||||||
std::string line;
|
std::string line;
|
||||||
static const cmsys::RegularExpression rpathRegex("^ *cmd LC_RPATH$");
|
static const cmsys::RegularExpression rpathRegex("^ *cmd LC_RPATH$");
|
||||||
static const cmsys::RegularExpression loadDylibRegex(
|
static const cmsys::RegularExpression loadDylibRegex(
|
||||||
"^ *cmd LC_LOAD_DYLIB$");
|
"^ *cmd LC_LOAD(_WEAK)?_DYLIB$");
|
||||||
static const cmsys::RegularExpression pathRegex(
|
static const cmsys::RegularExpression pathRegex(
|
||||||
"^ *path (.*) \\(offset [0-9]+\\)$");
|
"^ *path (.*) \\(offset [0-9]+\\)$");
|
||||||
static const cmsys::RegularExpression nameRegex(
|
static const cmsys::RegularExpression nameRegex(
|
||||||
|
@@ -148,6 +148,27 @@ set(_check
|
|||||||
)
|
)
|
||||||
check_contents(deps/udeps6.txt "^${_check}$")
|
check_contents(deps/udeps6.txt "^${_check}$")
|
||||||
|
|
||||||
|
# Weak library reference should have exactly the same dependencies as a regular library reference (test 1)
|
||||||
|
set_with_libsystem(_check
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/bin/../lib/executable_path/libexecutable_path\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/bin/../lib/rpath_executable_path/librpath_executable_path\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/libtestlib\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/loader_path/libloader_path\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/normal/../rpath/librpath\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/normal/libnormal\.dylib]]
|
||||||
|
[[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/rpath_loader_path/librpath_loader_path\.dylib]]
|
||||||
|
)
|
||||||
|
check_contents(deps/deps7.txt "^${_check}$")
|
||||||
|
|
||||||
|
set(_check
|
||||||
|
[[@executable_path/../lib/executable_path_bundle/libexecutable_path_bundle\.dylib]]
|
||||||
|
[[@loader_path/loader_path_unresolved/libloader_path_unresolved\.dylib]]
|
||||||
|
[[@rpath/librpath_executable_path_bundle\.dylib]]
|
||||||
|
[[@rpath/librpath_loader_path_unresolved\.dylib]]
|
||||||
|
[[@rpath/librpath_unresolved\.dylib]]
|
||||||
|
)
|
||||||
|
check_contents(deps/udeps7.txt "^${_check}$")
|
||||||
|
|
||||||
set(_check
|
set(_check
|
||||||
"^libconflict\\.dylib:[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/conflict/libconflict\\.dylib;[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/conflict2/libconflict\\.dylib\n$"
|
"^libconflict\\.dylib:[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/conflict/libconflict\\.dylib;[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/macos-build/root-all/executable/lib/conflict2/libconflict\\.dylib\n$"
|
||||||
)
|
)
|
||||||
@@ -157,3 +178,4 @@ check_contents(deps/cdeps3.txt "${_check}")
|
|||||||
check_contents(deps/cdeps4.txt "${_check}")
|
check_contents(deps/cdeps4.txt "${_check}")
|
||||||
check_contents(deps/cdeps5.txt "${_check}")
|
check_contents(deps/cdeps5.txt "${_check}")
|
||||||
check_contents(deps/cdeps6.txt "${_check}")
|
check_contents(deps/cdeps6.txt "${_check}")
|
||||||
|
check_contents(deps/cdeps7.txt "${_check}")
|
||||||
|
@@ -128,16 +128,19 @@ endforeach()
|
|||||||
target_link_libraries(testlib PRIVATE ${testlib_names})
|
target_link_libraries(testlib PRIVATE ${testlib_names})
|
||||||
|
|
||||||
add_executable(topexe macos/topexe.c)
|
add_executable(topexe macos/topexe.c)
|
||||||
|
add_executable(topexe_weak macos/topexe.c)
|
||||||
add_library(toplib SHARED macos/toplib.c)
|
add_library(toplib SHARED macos/toplib.c)
|
||||||
add_library(topmod MODULE macos/toplib.c)
|
add_library(topmod MODULE macos/toplib.c)
|
||||||
target_link_libraries(topexe PRIVATE testlib)
|
target_link_libraries(topexe PRIVATE testlib)
|
||||||
|
target_link_libraries(topexe_weak PRIVATE "-weak_library" testlib)
|
||||||
target_link_libraries(toplib PRIVATE testlib)
|
target_link_libraries(toplib PRIVATE testlib)
|
||||||
target_link_libraries(topmod PRIVATE testlib)
|
target_link_libraries(topmod PRIVATE testlib)
|
||||||
|
|
||||||
set_property(TARGET topexe toplib topmod PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib")
|
set_property(TARGET topexe toplib topmod PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib")
|
||||||
|
set_property(TARGET topexe_weak toplib topmod PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib")
|
||||||
|
|
||||||
install(TARGETS topexe toplib topmod testlib testlib_conflict RUNTIME DESTINATION executable/bin LIBRARY DESTINATION executable/lib)
|
install(TARGETS topexe topexe_weak toplib topmod testlib testlib_conflict RUNTIME DESTINATION executable/bin LIBRARY DESTINATION executable/lib)
|
||||||
install(TARGETS topexe toplib topmod testlib testlib_conflict RUNTIME DESTINATION bundle_executable/bin LIBRARY DESTINATION bundle_executable/lib)
|
install(TARGETS topexe topexe_weak toplib topmod testlib testlib_conflict RUNTIME DESTINATION bundle_executable/bin LIBRARY DESTINATION bundle_executable/lib)
|
||||||
|
|
||||||
install(CODE [[
|
install(CODE [[
|
||||||
function(exec_get_runtime_dependencies depsfile udepsfile cdepsfile)
|
function(exec_get_runtime_dependencies depsfile udepsfile cdepsfile)
|
||||||
@@ -213,4 +216,12 @@ install(CODE [[
|
|||||||
"${CMAKE_INSTALL_PREFIX}/executable/lib/$<TARGET_FILE_NAME:testlib_conflict>"
|
"${CMAKE_INSTALL_PREFIX}/executable/lib/$<TARGET_FILE_NAME:testlib_conflict>"
|
||||||
BUNDLE_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bundle_executable/bin/$<TARGET_FILE_NAME:topexe>"
|
BUNDLE_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bundle_executable/bin/$<TARGET_FILE_NAME:topexe>"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
exec_get_runtime_dependencies(
|
||||||
|
deps7.txt udeps7.txt cdeps7.txt
|
||||||
|
EXECUTABLES
|
||||||
|
"${CMAKE_INSTALL_PREFIX}/executable/bin/$<TARGET_FILE_NAME:topexe_weak>"
|
||||||
|
LIBRARIES
|
||||||
|
"${CMAKE_INSTALL_PREFIX}/executable/lib/$<TARGET_FILE_NAME:testlib_conflict>"
|
||||||
|
)
|
||||||
]])
|
]])
|
||||||
|
Reference in New Issue
Block a user