diff options
author | Brad King <brad.king@kitware.com> | 2024-08-20 15:38:15 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2024-08-20 15:38:27 (GMT) |
commit | 89d7ed5497f38f55e4b57e2091b11e5ba90d571b (patch) | |
tree | 6b293f6ba60e90377cee8f66a699419448ddc1f6 /Tests | |
parent | 2ab43d78e1fe0f027f48a032d74c51a23c76302f (diff) | |
parent | 4d4e008e690fd50400abd8ad15150bd814e3a852 (diff) | |
download | CMake-89d7ed5497f38f55e4b57e2091b11e5ba90d571b.zip CMake-89d7ed5497f38f55e4b57e2091b11e5ba90d571b.tar.gz CMake-89d7ed5497f38f55e4b57e2091b11e5ba90d571b.tar.bz2 |
Merge topic 'fix-dependencies-searching'
4d4e008e69 file(GET_RUNTIME_DEPENDENCIES): Fix resolution of repeated ELF dependencies
Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9704
Diffstat (limited to 'Tests')
4 files changed, 87 insertions, 1 deletions
diff --git a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/RunCMakeTest.cmake b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/RunCMakeTest.cmake index f7ede51..5583407 100644 --- a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/RunCMakeTest.cmake +++ b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/RunCMakeTest.cmake @@ -72,6 +72,7 @@ elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") run_install_test(linux-unresolved) run_install_test(linux-conflict) run_install_test(linux-notfile) + run_install_test(linux-indirect-dependencies) run_cmake(project) run_cmake(badargs1) run_cmake(badargs2) diff --git a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-all-check.cmake b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-all-check.cmake index d3d1cd6..012ed58 100644 --- a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-all-check.cmake +++ b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-all-check.cmake @@ -1,4 +1,5 @@ set(_check + [[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/conflict/libconflict\.so]] [[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/libtest_rpath\.so]] [[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/libtest_runpath\.so]] [[[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/rpath/librpath\.so]] @@ -19,7 +20,7 @@ check_contents(deps/udeps1.txt "^${_check}$") check_contents(deps/udeps2.txt "^${_check}$") check_contents(deps/udeps3.txt "^${_check}$") set(_check - "^libconflict\\.so:[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/conflict/libconflict\\.so;[^;]*/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-build/root-all/lib/conflict2/libconflict\\.so\n$" + "^$" ) check_contents(deps/cdeps1.txt "${_check}") check_contents(deps/cdeps2.txt "${_check}") diff --git a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies-all-stdout.txt b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies-all-stdout.txt new file mode 100644 index 0000000..9f5e07d --- /dev/null +++ b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies-all-stdout.txt @@ -0,0 +1 @@ +Resolved dependencies: / diff --git a/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies.cmake b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies.cmake new file mode 100644 index 0000000..1d0a913 --- /dev/null +++ b/Tests/RunCMake/file-GET_RUNTIME_DEPENDENCIES/linux-indirect-dependencies.cmake @@ -0,0 +1,83 @@ +enable_language(C) +cmake_policy(SET CMP0095 NEW) + +file(WRITE "${CMAKE_BINARY_DIR}/A.c" "void libA(void) {}\n") +file(WRITE "${CMAKE_BINARY_DIR}/C.c" "void libC(void) {}\n") +file(WRITE "${CMAKE_BINARY_DIR}/BUseAC.c" [[ +extern void libA(void); +extern void libC(void); +void libB(void) +{ + libA(); + libC(); +} +]]) +file(WRITE "${CMAKE_BINARY_DIR}/mainABC.c" [[ +extern void libA(void); +extern void libB(void); +extern void libC(void); + +int main(void) +{ + libA(); + libB(); + libC(); + return 0; +} + +]]) + +set(lib_dirExe "${CMAKE_BINARY_DIR}/Exe") +set(lib_dirA "${CMAKE_BINARY_DIR}/libA") +set(lib_dirB "${CMAKE_BINARY_DIR}/libB") +set(lib_dirC "${CMAKE_BINARY_DIR}/libC") +file(MAKE_DIRECTORY ${lib_dirExe}) +file(MAKE_DIRECTORY ${lib_dirA}) +file(MAKE_DIRECTORY ${lib_dirB}) +file(MAKE_DIRECTORY ${lib_dirC}) + +add_library(A SHARED "${CMAKE_BINARY_DIR}/A.c") +set_property(TARGET A PROPERTY LIBRARY_OUTPUT_DIRECTORY ${lib_dirA}) + +add_library(C SHARED "${CMAKE_BINARY_DIR}/C.c") +set_property(TARGET C PROPERTY LIBRARY_OUTPUT_DIRECTORY ${lib_dirC}) + +# We doesn't need to set A as a dependency of B, because we don't need `RUNPATH` value set for B +add_library(B SHARED "${CMAKE_BINARY_DIR}/BUseAC.c") +target_link_libraries(B PRIVATE A C) +set_property(TARGET B PROPERTY LIBRARY_OUTPUT_DIRECTORY ${lib_dirB}) + +# We MUST have empty `RUNPATH` in A & B +set_target_properties(A B C PROPERTIES + BUILD_WITH_INSTALL_RPATH 1 +) + +# The executable is really workable without `RUNPATH` in B +add_executable(exe "${CMAKE_BINARY_DIR}/mainABC.c") +target_link_libraries(exe A B C) +set_property(TARGET exe PROPERTY RUNTIME_OUTPUT_DIRECTORY ${lib_dirExe}) + +# We MUST have `RUNPATH` in exe, not `RPATH` +# Test will pass if we have `RPATH`, because of the inheritance +target_link_options(exe PRIVATE -Wl,--enable-new-dtags) + +install(CODE [[ + # Work with non-installed binary, because of the RUNPATH values + set(exeFile "$<TARGET_FILE:exe>") + + # Check executable is can be successfully finished + execute_process( + COMMAND "${exeFile}" + COMMAND_ERROR_IS_FATAL ANY + ) + + # Check dependencies resolved + file(GET_RUNTIME_DEPENDENCIES + RESOLVED_DEPENDENCIES_VAR RESOLVED + PRE_INCLUDE_REGEXES "^lib[ABC]\\.so$" + PRE_EXCLUDE_REGEXES ".*" + EXECUTABLES + "${exeFile}" + ) + message(STATUS "Resolved dependencies: ${RESOLVED}") +]]) |