Skip to content

Commit b8e6652

Browse files
committed
[CMake] Set rpath for individual targets and not globally
When using the `rpath=ON` option, the global CMake variable `CMAKE_INSTALL_RPATH` is mutated, which is problematic in several corner cases. This commit suggests to append the rpaths at the target property level, and also set the rpaths for the build tree separately so they make sense. A new ROOT macro is introduced for this rpath setting, which are also used for the PyROOT libraries, which also need custom rpaths. Closes #19327 and #19134.
1 parent d6f6eb1 commit b8e6652

File tree

4 files changed

+37
-52
lines changed

4 files changed

+37
-52
lines changed

bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -112,29 +112,14 @@ target_include_directories(CPyCppyy
112112
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
113113
)
114114

115+
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS CPyCppyy)
116+
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS cppyy)
117+
115118
if(NOT MSVC)
116119
# Make sure that relative RUNPATH to main ROOT libraries is always correct.
117-
118-
file(RELATIVE_PATH pymoduledir_to_libdir_build ${localruntimedir} "${localruntimedir}")
119-
file(RELATIVE_PATH pymoduledir_to_libdir_install ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_PYTHONDIR} "${CMAKE_INSTALL_FULL_LIBDIR}")
120-
121-
if(APPLE)
122-
set_target_properties(cppyy PROPERTIES
123-
BUILD_RPATH "@loader_path/${pymoduledir_to_libdir_build}"
124-
INSTALL_RPATH "@loader_path/${pymoduledir_to_libdir_install}"
125-
)
126-
else()
127-
set_target_properties(cppyy PROPERTIES
128-
BUILD_RPATH "$ORIGIN/${pymoduledir_to_libdir_build}"
129-
INSTALL_RPATH "$ORIGIN/${pymoduledir_to_libdir_install}"
130-
)
131-
endif()
132-
120+
ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH(cppyy ${CMAKE_INSTALL_PYTHONDIR})
133121
endif()
134122

135-
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS CPyCppyy)
136-
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS cppyy)
137-
138123
# Install library
139124
install(TARGETS CPyCppyy EXPORT ${CMAKE_PROJECT_NAME}Exports
140125
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries

bindings/pyroot/pythonizations/CMakeLists.txt

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -227,22 +227,7 @@ endif()
227227

228228
if(NOT MSVC)
229229
# Make sure that relative RUNPATH to main ROOT libraries is always correct.
230-
231-
file(RELATIVE_PATH pymoduledir_to_libdir_build ${pymoduledir_build} "${localruntimedir}")
232-
file(RELATIVE_PATH pymoduledir_to_libdir_install ${CMAKE_INSTALL_PREFIX}/${pymoduledir_install} "${CMAKE_INSTALL_FULL_LIBDIR}")
233-
234-
if(APPLE)
235-
set_target_properties(${libname} PROPERTIES
236-
BUILD_RPATH "@loader_path/${pymoduledir_to_libdir_build}"
237-
INSTALL_RPATH "@loader_path/${pymoduledir_to_libdir_install}"
238-
)
239-
else()
240-
set_target_properties(${libname} PROPERTIES
241-
BUILD_RPATH "$ORIGIN/${pymoduledir_to_libdir_build}"
242-
INSTALL_RPATH "$ORIGIN/${pymoduledir_to_libdir_install}"
243-
)
244-
endif()
245-
230+
ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH(${libname} ${pymoduledir_install})
246231
endif()
247232

248233
# Install library

cmake/modules/RootBuildOptions.cmake

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -423,23 +423,6 @@ include(RootInstallDirs)
423423
# add to RPATH any directories outside the project that are in the linker search path
424424
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
425425

426-
if(rpath)
427-
file(RELATIVE_PATH BINDIR_TO_LIBDIR "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}")
428-
429-
if(APPLE)
430-
set(CMAKE_MACOSX_RPATH TRUE)
431-
set(CMAKE_INSTALL_NAME_DIR "@rpath")
432-
433-
set(_rpath_values "@loader_path" "@loader_path/${BINDIR_TO_LIBDIR}")
434-
else()
435-
set(_rpath_values "$ORIGIN" "$ORIGIN/${BINDIR_TO_LIBDIR}")
436-
endif()
437-
438-
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH-CACHED};${_rpath_values}" CACHE STRING "Install RPATH" FORCE)
439-
440-
unset(BINDIR_TO_LIBDIR)
441-
endif()
442-
443426
#---deal with the DCMAKE_IGNORE_PATH------------------------------------------------------------
444427
if(macos_native)
445428
if(APPLE)

cmake/modules/RootMacros.cmake

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,9 @@ function(ROOT_LINKER_LIBRARY library)
975975

976976
#----Installation details-------------------------------------------------------
977977
if(NOT ARG_TEST AND NOT ARG_NOINSTALL AND CMAKE_LIBRARY_OUTPUT_DIRECTORY)
978+
if(rpath)
979+
ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH(${library} ${CMAKE_INSTALL_LIBDIR})
980+
endif()
978981
if(ARG_CMAKENOEXPORT)
979982
install(TARGETS ${library} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries
980983
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
@@ -1437,6 +1440,9 @@ function(ROOT_EXECUTABLE executable)
14371440
endif()
14381441
#----Installation details------------------------------------------------------
14391442
if(NOT ARG_NOINSTALL AND CMAKE_RUNTIME_OUTPUT_DIRECTORY)
1443+
if(rpath)
1444+
ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH(${executable} ${CMAKE_INSTALL_BINDIR})
1445+
endif()
14401446
if(ARG_CMAKENOEXPORT)
14411447
install(TARGETS ${executable} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications)
14421448
else()
@@ -2073,6 +2079,32 @@ function(generateManual name input output)
20732079
install(FILES ${output} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
20742080
endfunction()
20752081

2082+
#----------------------------------------------------------------------------
2083+
# --- ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH(target install_dir)
2084+
#
2085+
# Sets the INSTALL_RPATH for a given target so that it can find the ROOT shared
2086+
# libraries at runtime. The RPATH is set relative to the target's own location
2087+
# using $ORIGIN (or @loader_path on macOS).
2088+
#
2089+
# Arguments:
2090+
# target - The CMake target (e.g., a shared library or executable)
2091+
# install_dir - The install subdirectory relative to CMAKE_INSTALL_PREFIX
2092+
#----------------------------------------------------------------------------
2093+
function(ROOT_APPEND_LIBDIR_TO_INSTALL_RPATH target install_dir)
2094+
file(RELATIVE_PATH to_libdir "${CMAKE_INSTALL_PREFIX}/${install_dir}" "${CMAKE_INSTALL_FULL_LIBDIR}")
2095+
2096+
# New path
2097+
if(APPLE)
2098+
set(new_rpath "@loader_path/${to_libdir}")
2099+
else()
2100+
set(new_rpath "$ORIGIN/${to_libdir}")
2101+
endif()
2102+
2103+
# Append to existing RPATH
2104+
set_property(TARGET ${target} APPEND PROPERTY INSTALL_RPATH "${new_rpath}")
2105+
endfunction()
2106+
2107+
20762108
#-------------------------------------------------------------------------------
20772109
#
20782110
# Former RoottestMacros.cmake starts here

0 commit comments

Comments
 (0)