diff options
author | David Seifert <soap@gentoo.org> | 2024-05-08 00:55:05 +0200 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2024-05-07 22:32:35 -0700 |
commit | 89a5bde9d98ecc96bb462872bb2d83ac762ffc08 (patch) | |
tree | 4a3e7ee5dc8009a884a1c62cffcf309580eb1669 | |
parent | c55ca8272c536d439253d38600f3c9e445b1edf7 (diff) | |
download | meson-89a5bde9d98ecc96bb462872bb2d83ac762ffc08.zip meson-89a5bde9d98ecc96bb462872bb2d83ac762ffc08.tar.gz meson-89a5bde9d98ecc96bb462872bb2d83ac762ffc08.tar.bz2 |
cuda: pass static archives to nvcc without -Xlinker= prefix
-rw-r--r-- | mesonbuild/backend/backends.py | 9 | ||||
-rw-r--r-- | mesonbuild/compilers/cuda.py | 5 |
2 files changed, 13 insertions, 1 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index a45de70..740f349 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -1080,6 +1080,15 @@ class Backend: continue if compiler.get_language() == 'd': arg = '-Wl,' + arg + elif compiler.get_linker_id() == 'nvlink' and arg.endswith('.a'): + # We need to pass static archives without -Xlinker= to nvcc, + # since they may contain relocatable device code. When passing + # the static archive to nvcc with -Xlinker=, we bypass the + # frontend which means we lose the opportunity to perform device + # linking. We only need to do this for static archives, since + # nvcc doesn't support device linking with dynamic libraries: + # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#libraries + pass else: arg = compiler.get_linker_lib_prefix() + arg args.append(arg) diff --git a/mesonbuild/compilers/cuda.py b/mesonbuild/compilers/cuda.py index 7f7ad74..3761019 100644 --- a/mesonbuild/compilers/cuda.py +++ b/mesonbuild/compilers/cuda.py @@ -382,8 +382,11 @@ class CudaCompiler(Compiler): # This is ambiguously either an MVSC-style /switch or an absolute path # to a file. For some magical reason the following works acceptably in # both cases. + # We only want to prefix arguments that are NOT static archives, since + # the latter could contain relocatable device code (-dc/-rdc=true). + prefix = '' if flag.endswith('.a') else f'-X{phase.value}=' wrap = '"' if ',' in flag else '' - xflags.append(f'-X{phase.value}={wrap}{flag}{wrap}') + xflags.append(f'{prefix}{wrap}{flag}{wrap}') continue elif len(flag) >= 2 and flag[0] == '-' and flag[1] in 'IDULlmOxmte': # This is a single-letter short option. These options (with the |