diff options
-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 |