meson: Improve NVMM CUDA detection

1. Add some comments explaining what headers and libs are expected on
   what systems
2. Only look in default incdirs if no incdir is specified
3. Require libnvbufsurface.so on Jetson when cuda-nvmm=enabled
4. Require libatomic on Jetson when cuda-nvmm=enabled

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8021>
This commit is contained in:
Nirbheek Chauhan 2024-12-02 17:12:00 +05:30 committed by GStreamer Marge Bot
parent 8e0f0c5ae3
commit 0c17efafa3

View file

@ -40,8 +40,8 @@ if host_system not in ['windows', 'linux']
endif endif
# Linux ARM would need -latomic for std::atomic<int64_t> # Linux ARM would need -latomic for std::atomic<int64_t>
if host_system == 'linux' and host_machine.cpu_family() not in ['x86', 'x86_64'] if host_system == 'linux' and host_machine.cpu_family() in ['aarch64', 'arm']
libatomic_dep = cxx.find_library('atomic', required: false) libatomic_dep = cxx.find_library('atomic', required: get_option('cuda-nvmm'))
if not libatomic_dep.found() if not libatomic_dep.found()
subdir_done() subdir_done()
endif endif
@ -89,43 +89,52 @@ if host_system == 'windows'
]) ])
endif endif
else else
# We have NVMM with nvbufsurface.h on both Linux x86 and Jetson (aarch64)
nvmm_opt = get_option('cuda-nvmm') nvmm_opt = get_option('cuda-nvmm')
if not nvmm_opt.disabled() fsmod = import('fs')
if nvmm_opt.allowed()
incdir_candidates = []
nvmm_inc_opt = get_option('cuda-nvmm-include-path') nvmm_inc_opt = get_option('cuda-nvmm-include-path')
if nvmm_inc_opt != '' if nvmm_inc_opt != ''
gstcuda_nvmm_inc = [include_directories(nvmm_inc_opt)] incdir_candidates += [nvmm_inc_opt]
else
# try some other default locations
incdir_candidates = [
'/usr/src/jetson_multimedia_api/include',
'/opt/nvidia/deepstream/deepstream/sources/includes',
]
endif endif
if cc.has_header('nvbufsurface.h', foreach incdir: incdir_candidates
include_directories: gstcuda_nvmm_inc, if fsmod.is_dir(incdir)
required: false) incdir = include_directories(incdir)
have_nvbufsurface_h = true if cc.has_header('nvbufsurface.h',
# try some other default locations include_directories: incdir,
elif cc.has_header('/usr/src/jetson_multimedia_api/include/nvbufsurface.h', required: false)
required: false) have_nvbufsurface_h = true
have_nvbufsurface_h = true gstcuda_nvmm_inc = incdir
gstcuda_nvmm_inc = [include_directories('/usr/src/jetson_multimedia_api/include')] break
elif cc.has_header('/opt/nvidia/deepstream/deepstream/sources/includes/nvbufsurface.h', endif
required: false) endif
have_nvbufsurface_h = true endforeach
gstcuda_nvmm_inc = [include_directories('/opt/nvidia/deepstream/deepstream/sources/includes')]
endif if have_nvbufsurface_h
if nvmm_opt.enabled() and not have_nvbufsurface_h extra_args += ['-DHAVE_CUDA_NVMM']
# On Tegra, we also have libnvbufsurface.so, which is not present on x86
if host_machine.cpu_family() == 'aarch64'
# check if we have a tegra based system (jetson)
nvbuf_dep = cc.find_library('nvbufsurface', dirs: '/usr/lib/aarch64-linux-gnu/tegra/', required: nvmm_opt)
if nvbuf_dep.found()
extra_deps += [nvbuf_dep]
extra_args += ['-DHAVE_CUDA_NVMM_JETSON']
endif
endif
elif nvmm_opt.enabled()
error('Could not find required header: "nvbufsurface.h"') error('Could not find required header: "nvbufsurface.h"')
subdir_done() subdir_done()
endif endif
endif endif
if have_nvbufsurface_h
extra_args += ['-DHAVE_CUDA_NVMM']
# check if we have a tegra based system (jetson)
nvbuf_dep = cc.find_library('nvbufsurface', dirs: '/usr/lib/aarch64-linux-gnu/tegra/', required: false)
if nvbuf_dep.found()
extra_deps += [nvbuf_dep]
extra_args += ['-DHAVE_CUDA_NVMM_JETSON']
endif
endif
endif endif
pkg_name = 'gstreamer-cuda-' + api_version pkg_name = 'gstreamer-cuda-' + api_version