diff options
author | Brad King <brad.king@kitware.com> | 2023-12-06 20:02:29 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-01-04 16:59:26 (GMT) |
commit | dd4a6dff9246715b419a8daf4ced2d3c46a529df (patch) | |
tree | b69ef3af6fdae649efa793e8dc00e70829a718b8 /Modules | |
parent | 5f1bbdb3b327ef5ff65ce331bf644d9b08d9c40f (diff) | |
download | CMake-dd4a6dff9246715b419a8daf4ced2d3c46a529df.zip CMake-dd4a6dff9246715b419a8daf4ced2d3c46a529df.tar.gz CMake-dd4a6dff9246715b419a8daf4ced2d3c46a529df.tar.bz2 |
Link explicitly to private transitive dependencies on stub libraries
We represent stub libraries, e.g., for CUDA, using imported `SHARED`
library targets with only `IMPORTED_IMPLIB`, and no `IMPORTED_LOCATION`,
to indicate that the stub file is meant only for linkers and not dynamic
loaders. See commit 7351d590ee (cmTarget: Add a way to represent
imported shared library stubs, 2023-07-17, v3.28.0-rc1~344^2) and commit
fc6508921c (cmComputeLinkInformation: Restore soname lookup for
non-imported targets, 2023-12-05, v3.28.0~4^2).
If a shared library is linked to a stub, it has a `NEEDED` field
populated with the `SONAME` found in the stub. When a dependent target
links to such a shared library, some linkers want to find a library file
on disk and load it to see what symbols it provides. This is necessary
for linkers that enforce `--no-allow-shlib-undefined`. On hosts with
only the stub library installed, e.g., with only the CUDA toolkit
development package, the real runtime library corresponding to the
stub's `SONAME` may not even exist, so no `-rpath-link` flag can help
linkers find it. Pass the stub library to linkers explicitly so they
can find it without searching.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/FindCUDAToolkit.cmake | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/Modules/FindCUDAToolkit.cmake b/Modules/FindCUDAToolkit.cmake index 469a7ad..ac72c17 100644 --- a/Modules/FindCUDAToolkit.cmake +++ b/Modules/FindCUDAToolkit.cmake @@ -1100,7 +1100,10 @@ if(CUDAToolkit_FOUND) if(CUDA_${lib_name}_LIBRARY MATCHES "/stubs/" AND NOT WIN32) # Use a SHARED library with IMPORTED_IMPLIB, but not IMPORTED_LOCATION, # to indicate that the stub is for linkers but not dynamic loaders. - # It will not contribute any RPATH entry. + # It will not contribute any RPATH entry. When encountered as + # a private transitive dependency of another shared library, + # it will be passed explicitly to linkers so they can find it + # even when the runtime library file does not exist on disk. set(CUDA_IMPORT_PROPERTY IMPORTED_IMPLIB) set(CUDA_IMPORT_TYPE SHARED) endif() |