From e2a4ea1c46b85fa07649fd359afbf90deabbb891 Mon Sep 17 00:00:00 2001 From: Janusz Lisiecki Date: Mon, 1 Jun 2026 13:22:45 +0200 Subject: [PATCH 1/2] Add conda build option and CUDA target includes Add BUILD_FOR_CONDA and pass it from the conda recipes so conda-forge packaging can opt into its own dependency layout without changing default builds. When enabled, prefer shared libtar, use conda's nvImageCodec lib directory in runtime lookup and RPATH, and emit conda install guidance for dynamically loaded CUDA toolkit libraries. Require CUDAToolkit package discovery and use CUDAToolkit_TARGET_DIR/include directly for generated CUDA-family stubs and CUDA include directories. This avoids relying on the trimmed CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES value while still honoring explicit CUDA target directories. Also skip bundled FFTS and cocoapi static targets when prebuilt DALI libs are used, and fix a typo in the NVML loader diagnostic. Signed-off-by: Janusz Lisiecki --- CMakeLists.txt | 31 ++++++++++++++----- cmake/Dependencies.common.cmake | 21 ++++++++----- conda/dali_native_libs/recipe/build.sh | 1 + conda/dali_python_bindings/recipe/build.sh | 1 + dali/core/CMakeLists.txt | 12 +++---- dali/core/dynlink_cufile.cc | 5 +++ dali/core/dynlink_nvcomp.cc | 5 +++ dali/kernels/signal/fft/CMakeLists.txt | 5 ++- dali/kernels/signal/fft/cufft_wrap.cc | 5 +++ dali/npp/CMakeLists.txt | 5 ++- dali/npp/npp_wrap.cc | 15 +++++++++ dali/nvimgcodec/CMakeLists.txt | 3 +- dali/nvimgcodec/nvimgcodec_wrap.cc | 20 ++++++++++-- dali/operators/operators.cc | 14 ++++++--- .../video/dynlink_nvcuvid/CMakeLists.txt | 3 +- dali/util/CMakeLists.txt | 5 ++- dali/util/nvml_wrap.cc | 2 +- 17 files changed, 111 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1746e116df3..d5c17d6cd1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,17 +30,23 @@ endif() project(DALI CUDA CXX C) +find_package(CUDAToolkit REQUIRED) + +option(BUILD_FOR_CONDA "Enable build adjustments used by conda-forge packaging" OFF) + set(DALI_ROOT ${PROJECT_SOURCE_DIR}) set(CUDA_VERSION "${CMAKE_CUDA_COMPILER_VERSION}") +if(BUILD_FOR_CONDA AND DEFINED CUDAToolkit_TARGET_DIR AND + NOT "${CUDAToolkit_TARGET_DIR}" STREQUAL "") + set(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES "${CUDAToolkit_TARGET_DIR}/include") + message(STATUS "BUILD_FOR_CONDA -- using CUDA target include directory: " + "${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}") +endif() + # more recent CMake puts both cuda/targets/x86_64-linux/include and cuda/targets/x86_64-linux/include/cccl into the path # while we usually need only the former string(FIND "${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}" ";" SEMICOLON_POS) -if(NOT "${SEMICOLON_POS}" EQUAL -1) - list(GET CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES 0 CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY) -else() - set(CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) -endif() parse_cuda_version(${CUDA_VERSION} CUDA_VERSION_MAJOR CUDA_VERSION_MINOR CUDA_VERSION_PATCH CUDA_VERSION_SHORT CUDA_VERSION_SHORT_DIGIT_ONLY) # CUDA_utils.cmake uses CUDA_VERSION_MAJOR value to determine the content of CUDA_known_archs and CUDA_TARGET_ARCHS @@ -230,13 +236,23 @@ foreach(rpath IN ITEMS "$ORIGIN/../cufft/lib" "$ORIGIN/../npp/lib" "$ORIGIN/../nvjpeg/lib" - "$ORIGIN/../nvimgcodec" - "${NVIMGCODEC_DEFAULT_INSTALL_PATH}/lib64") + "$ORIGIN/../nvimgcodec") message(STATUS "Add to rpath: ${rpath}") list(APPEND CMAKE_BUILD_RPATH ${rpath}) list(APPEND CMAKE_INSTALL_RPATH ${rpath}) endforeach() +if (BUILD_FOR_CONDA) + set(NVIMGCODEC_DEFAULT_LIBRARY_DIR "lib") +else() + set(NVIMGCODEC_DEFAULT_LIBRARY_DIR "lib64") +endif() +set(nvimgcodec_default_rpath + "${NVIMGCODEC_DEFAULT_INSTALL_PATH}/${NVIMGCODEC_DEFAULT_LIBRARY_DIR}") +message(STATUS "Add to rpath: ${nvimgcodec_default_rpath}") +list(APPEND CMAKE_BUILD_RPATH ${nvimgcodec_default_rpath}) +list(APPEND CMAKE_INSTALL_RPATH ${nvimgcodec_default_rpath}) + get_dali_version(${PROJECT_SOURCE_DIR}/VERSION DALI_VERSION) get_dali_extra_version(${PROJECT_SOURCE_DIR}/DALI_EXTRA_VERSION DALI_EXTRA_VERSION) @@ -332,6 +348,7 @@ propagate_option(BUILD_NVML) propagate_option(BUILD_CUFILE) propagate_option(BUILD_NVIMAGECODEC) propagate_option(BUILD_AWSSDK) +propagate_option(BUILD_FOR_CONDA) propagate_option(LINK_DRIVER) propagate_option(WITH_DYNAMIC_CUFFT) propagate_option(WITH_DYNAMIC_NPP) diff --git a/cmake/Dependencies.common.cmake b/cmake/Dependencies.common.cmake index e50cc31741f..42ca7ef4576 100644 --- a/cmake/Dependencies.common.cmake +++ b/cmake/Dependencies.common.cmake @@ -119,8 +119,13 @@ endif() # libtar ################################################################## if(BUILD_LIBTAR) + if(BUILD_FOR_CONDA) + set(libtar_NAMES tar libtar) + else() + set(libtar_NAMES libtar.a tar libtar) + endif() find_library(libtar_LIBS - NAMES libtar.a tar libtar + NAMES ${libtar_NAMES} PATHS ${LIBTAR_ROOT_DIR} "/usr/local" ${CMAKE_SYSTEM_PREFIX_PATH} PATH_SUFFIXES lib lib64) if(${libtar_LIBS} STREQUAL libtar_LIBS-NOTFOUND) @@ -216,7 +221,7 @@ include_directories(${PROJECT_SOURCE_DIR}/third_party/rapidjson/include) ################################################################## # FFTS ################################################################## -if (BUILD_FFTS) +if (BUILD_FFTS AND NOT PREBUILD_DALI_LIBS) set(GENERATE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "-fPIC") set(ENABLE_SHARED OFF CACHE BOOL "shared library target") set(ENABLE_STATIC ON CACHE BOOL "static library target") @@ -247,11 +252,13 @@ include_directories(SYSTEM third_party/cutlass/tools/util/include) ################################################################## # CocoAPI ################################################################## -set(SOURCE_FILES third_party/cocoapi/common/maskApi.c) -add_library(cocoapi STATIC ${SOURCE_FILES}) -set_target_properties(cocoapi PROPERTIES POSITION_INDEPENDENT_CODE ON) -list(APPEND DALI_LIBS cocoapi) -list(APPEND DALI_EXCLUDES libcocoapi.a) +if(NOT PREBUILD_DALI_LIBS) + set(SOURCE_FILES third_party/cocoapi/common/maskApi.c) + add_library(cocoapi STATIC ${SOURCE_FILES}) + set_target_properties(cocoapi PROPERTIES POSITION_INDEPENDENT_CODE ON) + list(APPEND DALI_LIBS cocoapi) + list(APPEND DALI_EXCLUDES libcocoapi.a) +endif() ################################################################## # cfitsio diff --git a/conda/dali_native_libs/recipe/build.sh b/conda/dali_native_libs/recipe/build.sh index 87d4192d948..daad5cb2345 100644 --- a/conda/dali_native_libs/recipe/build.sh +++ b/conda/dali_native_libs/recipe/build.sh @@ -64,6 +64,7 @@ cmake -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ -DBUILD_BENCHMARK=${BUILD_BENCHMARK:-ON} \ -DBUILD_NVTX=${BUILD_NVTX} \ -DBUILD_PYTHON=OFF \ + -DBUILD_FOR_CONDA=ON \ -DPREBUILD_DALI_LIBS=OFF \ -DPYTHON_STUBGEN_INTERPRETER=${PYTHON} \ -DBUILD_LMDB=${BUILD_LMDB:-ON} \ diff --git a/conda/dali_python_bindings/recipe/build.sh b/conda/dali_python_bindings/recipe/build.sh index 82bfd0fd702..96d5b4f2381 100644 --- a/conda/dali_python_bindings/recipe/build.sh +++ b/conda/dali_python_bindings/recipe/build.sh @@ -70,6 +70,7 @@ cmake -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ -DBUILD_BENCHMARK=${BUILD_BENCHMARK:-ON} \ -DBUILD_NVTX=${BUILD_NVTX} \ -DBUILD_PYTHON=ON \ + -DBUILD_FOR_CONDA=ON \ -DPREBUILD_DALI_LIBS=ON \ -DPYTHON_STUBGEN_INTERPRETER=${PYTHON} \ -DBUILD_LMDB=${BUILD_LMDB:-ON} \ diff --git a/dali/core/CMakeLists.txt b/dali/core/CMakeLists.txt index 737a0f159e2..1895ac38f98 100644 --- a/dali/core/CMakeLists.txt +++ b/dali/core/CMakeLists.txt @@ -53,15 +53,14 @@ if (NOT LINK_DRIVER) OUTPUT ${CUDA_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Cuda -- "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/cuda.json" ${CUDA_GENERATED_STUB} - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cuda.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CUDAToolkit_TARGET_DIR}/include/cuda.h" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" # let clang know which architecutre we compile for "--target=${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ${DEFAULT_COMPILER_INCLUDE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cuda.h" + "${CUDAToolkit_TARGET_DIR}/include/cuda.h" "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/cuda.json" COMMENT "Running cuda.h stub generator" VERBATIM) @@ -80,15 +79,14 @@ if (BUILD_CUFILE) OUTPUT ${CUFILE_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Cufile -- "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/cufile.json" ${CUFILE_GENERATED_STUB} - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cufile.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CUDAToolkit_TARGET_DIR}/include/cufile.h" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" # let clang know which architecutre we compile for "--target=${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ${DEFAULT_COMPILER_INCLUDE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cufile.h" + "${CUDAToolkit_TARGET_DIR}/include/cufile.h" "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/cufile.json" COMMENT "Running cufile.h stub generator" VERBATIM) @@ -127,7 +125,7 @@ list(FILTER DALI_CORE_SRCS EXCLUDE REGEX ".*dynlink_nvcomp.cc") adjust_source_file_language_property("${DALI_CORE_SRCS}") add_library(dali_core ${LIBTYPE} ${DALI_CORE_SRCS}) -target_include_directories(dali_core SYSTEM PUBLIC ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) +target_include_directories(dali_core SYSTEM PUBLIC "${CUDAToolkit_TARGET_DIR}/include") target_link_libraries(dali_core PRIVATE dynlink_cuda ${CUDART_LIB}) if (BUILD_CUFILE) target_link_libraries(dali_core PRIVATE dynlink_cufile) diff --git a/dali/core/dynlink_cufile.cc b/dali/core/dynlink_cufile.cc index 64bce978ad6..b8a88fbeac1 100644 --- a/dali/core/dynlink_cufile.cc +++ b/dali/core/dynlink_cufile.cc @@ -35,8 +35,13 @@ CUFILE loadCufileLibrary() { ret = dlopen(__CufileLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + fprintf(stderr, "dlopen libcufile.so failed with error %s!. Please install libcufile: " + "`conda install -c conda-forge libcufile`.\n", dlerror()); +#else fprintf(stderr, "dlopen libcufile.so failed with error %s!. Please install libcufile.\n", dlerror()); +#endif } } return ret; diff --git a/dali/core/dynlink_nvcomp.cc b/dali/core/dynlink_nvcomp.cc index 616e187d909..ae9459d7508 100644 --- a/dali/core/dynlink_nvcomp.cc +++ b/dali/core/dynlink_nvcomp.cc @@ -35,8 +35,13 @@ NVCOMP loadNvCompFileLibrary() { ret = dlopen(__nvCompfileLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + fprintf(stderr, "dlopen libnvcomp.so failed with error %s!. Please install libnvcomp: " + "`conda install -c conda-forge libnvcomp`.\n", dlerror()); +#else fprintf(stderr, "dlopen libnvcomp.so failed with error %s!. Please install libnvcomp.\n", dlerror()); +#endif } } return ret; diff --git a/dali/kernels/signal/fft/CMakeLists.txt b/dali/kernels/signal/fft/CMakeLists.txt index 680743b1f39..aa2f3fb9295 100644 --- a/dali/kernels/signal/fft/CMakeLists.txt +++ b/dali/kernels/signal/fft/CMakeLists.txt @@ -42,15 +42,14 @@ if (WITH_DYNAMIC_CUFFT) OUTPUT ${CUFFT_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Cufft -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/cufft.json" ${CUFFT_GENERATED_STUB} - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cufft.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CUDAToolkit_TARGET_DIR}/include/cufft.h" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" # let clang know which architecutre we compile for "--target=${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ${DEFAULT_COMPILER_INCLUDE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/stub_codegen.py - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/cufft.h" + "${CUDAToolkit_TARGET_DIR}/include/cufft.h" "${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/cufft.json" COMMENT "Running cufft.h stub generator" VERBATIM) diff --git a/dali/kernels/signal/fft/cufft_wrap.cc b/dali/kernels/signal/fft/cufft_wrap.cc index 99478ea0462..20b6d8436d1 100644 --- a/dali/kernels/signal/fft/cufft_wrap.cc +++ b/dali/kernels/signal/fft/cufft_wrap.cc @@ -42,8 +42,13 @@ CUFFTDIVER loadCufftLibrary() { if (!ret) { ret = dlopen(__CufftLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + throw std::runtime_error("dlopen libcufft.so failed!. Please install " + "libcufft: `conda install -c conda-forge libcufft`."); +#else throw std::runtime_error("dlopen libcufft.so failed!. Please install " "CUDA toolkit or cuFFT python wheel."); +#endif } } return ret; diff --git a/dali/npp/CMakeLists.txt b/dali/npp/CMakeLists.txt index facd31bfbec..a3141ce8741 100644 --- a/dali/npp/CMakeLists.txt +++ b/dali/npp/CMakeLists.txt @@ -44,15 +44,14 @@ if (WITH_DYNAMIC_NPP) OUTPUT ${NPP_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Npp -- "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/npp.json" ${NPP_GENERATED_STUB} - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/npp.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CUDAToolkit_TARGET_DIR}/include/npp.h" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" # let clang know which architecutre we compile for "--target=${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ${DEFAULT_COMPILER_INCLUDE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/npp.h" + "${CUDAToolkit_TARGET_DIR}/include/npp.h" "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/npp.json" COMMENT "Running npp.h stub generator" VERBATIM) diff --git a/dali/npp/npp_wrap.cc b/dali/npp/npp_wrap.cc index 247d312012b..be98e4844d9 100644 --- a/dali/npp/npp_wrap.cc +++ b/dali/npp/npp_wrap.cc @@ -55,8 +55,13 @@ NPPCDRIVER loadNppcLibrary() { if (!ret) { ret = dlopen(__NppcLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + throw std::runtime_error("dlopen libnppc.so failed!. Please install " + "libnpp: `conda install -c conda-forge libnpp`."); +#else throw std::runtime_error("dlopen libnppc.so failed!. Please install " "CUDA toolkit or NPP python wheel."); +#endif } } return ret; @@ -69,8 +74,13 @@ NPPICCDRIVER loadNppiccLibrary() { if (!ret) { ret = dlopen(__NppiccLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + throw std::runtime_error("dlopen libnppicc.so failed!. Please install " + "libnpp: `conda install -c conda-forge libnpp`."); +#else throw std::runtime_error("dlopen libnppicc.so failed!. Please install " "CUDA toolkit or NPP python wheel."); +#endif } } return ret; @@ -83,8 +93,13 @@ NPPIGDRIVER loadNppigLibrary() { if (!ret) { ret = dlopen(__NppigLibName, RTLD_NOW); if (!ret) { +#if FOR_CONDA_ENABLED + throw std::runtime_error("dlopen libnppig.so failed!. Please install " + "libnpp: `conda install -c conda-forge libnpp`."); +#else throw std::runtime_error("dlopen libnppig.so failed!. Please install " "CUDA toolkit or NPP python wheel."); +#endif } } return ret; diff --git a/dali/nvimgcodec/CMakeLists.txt b/dali/nvimgcodec/CMakeLists.txt index 6d95dd64304..93c4dd9e7ef 100644 --- a/dali/nvimgcodec/CMakeLists.txt +++ b/dali/nvimgcodec/CMakeLists.txt @@ -44,8 +44,7 @@ if(WITH_DYNAMIC_NVIMGCODEC) OUTPUT ${NVIMGCODEC_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Nvimgcodec -- "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/nvimgcodec.json" ${NVIMGCODEC_GENERATED_STUB} - "${nvimgcodec_INCLUDE_DIR}/nvimgcodec.h" "-I${nvimgcodec_INCLUDE_DIR}" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${nvimgcodec_INCLUDE_DIR}/nvimgcodec.h" "-I${nvimgcodec_INCLUDE_DIR}" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' if this is not set "-ferror-limit=0" # let clang know which architecutre we compile for diff --git a/dali/nvimgcodec/nvimgcodec_wrap.cc b/dali/nvimgcodec/nvimgcodec_wrap.cc index 4238f6e33ad..f4765d8e1c8 100644 --- a/dali/nvimgcodec/nvimgcodec_wrap.cc +++ b/dali/nvimgcodec/nvimgcodec_wrap.cc @@ -31,6 +31,12 @@ "." STR(NVIMGCODEC_VER_MINOR) "." STR(NVIMGCODEC_VER_PATCH) #define MAJOR_VER_STR STR(NVIMGCODEC_VER_MAJOR) +#if FOR_CONDA_ENABLED +#define NVIMGCODEC_DEFAULT_LIBRARY_DIR "lib" +#else +#define NVIMGCODEC_DEFAULT_LIBRARY_DIR "lib64" +#endif + namespace { typedef void *NVIMGCODECDRIVER; @@ -39,11 +45,13 @@ const char nvimgcodecLibNameFullVer[] = "libnvimgcodec.so." FULL_VER_STR; const char nvimgcodecLibNameMajorVer[] = "libnvimgcodec.so." MAJOR_VER_STR; const char nvimgcodecLibName[] = "libnvimgcodec.so"; const char nvimgcodecLibDefaultPathFullVer[] = - NVIMGCODEC_DEFAULT_INSTALL_PATH "/lib64/libnvimgcodec.so." FULL_VER_STR; + NVIMGCODEC_DEFAULT_INSTALL_PATH "/" NVIMGCODEC_DEFAULT_LIBRARY_DIR + "/libnvimgcodec.so." FULL_VER_STR; const char nvimgcodecLibDefaultPathMajorVer[] = - NVIMGCODEC_DEFAULT_INSTALL_PATH "/lib64/libnvimgcodec.so." MAJOR_VER_STR; + NVIMGCODEC_DEFAULT_INSTALL_PATH "/" NVIMGCODEC_DEFAULT_LIBRARY_DIR + "/libnvimgcodec.so." MAJOR_VER_STR; const char nvimgcodecLibDefaultPath[] = - NVIMGCODEC_DEFAULT_INSTALL_PATH "/lib64/libnvimgcodec.so"; + NVIMGCODEC_DEFAULT_INSTALL_PATH "/" NVIMGCODEC_DEFAULT_LIBRARY_DIR "/libnvimgcodec.so"; NVIMGCODECDRIVER loadNvimgcodecLibrary() { static const char *paths[] = {nvimgcodecLibNameFullVer, @@ -69,12 +77,18 @@ NVIMGCODECDRIVER loadNvimgcodecLibrary() { } if (!ret) { +#if FOR_CONDA_ENABLED + throw std::runtime_error( + "dlopen libnvimgcodec.so failed!. Please install " + "libnvimgcodec: `conda install -c conda-forge libnvimgcodec`."); +#else int cuda_version_major = CUDA_VERSION / 1000; // 11020 -> 11, 12000 -> 12 throw std::runtime_error(dali::make_string( "dlopen libnvimgcodec.so failed!. Please install nvimagecodec: See " "https://developer.nvidia.com/nvimgcodec-downloads or simply do `pip install " "nvidia-nvimgcodec-cu", cuda_version_major, "`." "\nAttempted paths:", attempts)); +#endif } return ret; } diff --git a/dali/operators/operators.cc b/dali/operators/operators.cc index 2343629d6e9..8da3b93a98a 100644 --- a/dali/operators/operators.cc +++ b/dali/operators/operators.cc @@ -66,16 +66,22 @@ DLL_PUBLIC void EnforceMinimumNvimgcodecVersion() { int minor = NVIMGCODEC_MINOR_FROM_SEMVER(version); int patch = NVIMGCODEC_PATCH_FROM_SEMVER(version); - int cuda_version_major = CUDA_VERSION / 1000; // 11020 -> 11, 12000 -> 12 if (version < NVIMGCODEC_VER) { std::stringstream ss; ss << "DALI requires nvImageCodec at minimum version " << NVIMGCODEC_VER_MAJOR << "." << NVIMGCODEC_VER_MINOR << "." << NVIMGCODEC_VER_PATCH << ", but got " << major << "." - << minor << "." << patch - << ". Please upgrade: See https://developer.nvidia.com/nvimgcodec-downloads or simply do " - "`pip install nvidia-nvimgcodec-cu" + std::to_string(cuda_version_major) + "~=" + << minor << "." << patch; +#if FOR_CONDA_ENABLED + ss << ". Please upgrade: `conda install -c conda-forge 'libnvimgcodec" + << ">=" << NVIMGCODEC_VER_MAJOR << "." << NVIMGCODEC_VER_MINOR << "." + << NVIMGCODEC_VER_PATCH << ",==" << NVIMGCODEC_VER_MAJOR << "." << NVIMGCODEC_VER_MINOR + << ".*'`."; +#else + ss << ". Please upgrade: See https://developer.nvidia.com/nvimgcodec-downloads or simply do " + "`pip install nvidia-nvimgcodec-cu" + std::to_string(CUDA_VERSION / 1000) + "~=" << NVIMGCODEC_VER_MAJOR << "." << NVIMGCODEC_VER_MINOR << "." << NVIMGCODEC_VER_PATCH << "`."; +#endif throw std::runtime_error(ss.str()); } #endif diff --git a/dali/operators/video/dynlink_nvcuvid/CMakeLists.txt b/dali/operators/video/dynlink_nvcuvid/CMakeLists.txt index f76f6e68701..75b11b88b99 100644 --- a/dali/operators/video/dynlink_nvcuvid/CMakeLists.txt +++ b/dali/operators/video/dynlink_nvcuvid/CMakeLists.txt @@ -41,8 +41,7 @@ add_custom_command( OUTPUT ${NVCUVID_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Nvcuvid -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../../internal_tools/stub_generator/nvcuvid.json" ${NVCUVID_GENERATED_STUB} - "${CMAKE_CURRENT_SOURCE_DIR}/nvcuvid.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CMAKE_CURRENT_SOURCE_DIR}/nvcuvid.h" "-I${CUDAToolkit_TARGET_DIR}/include" "-I${CMAKE_SOURCE_DIR}/include" "-I${CMAKE_SOURCE_DIR}" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" diff --git a/dali/util/CMakeLists.txt b/dali/util/CMakeLists.txt index 05ace1ecf8a..1a4c80ec7db 100644 --- a/dali/util/CMakeLists.txt +++ b/dali/util/CMakeLists.txt @@ -103,15 +103,14 @@ if(BUILD_NVML) OUTPUT ${NVML_GENERATED_STUB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py --unique_prefix=Nvml -- "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/nvml.json" ${NVML_GENERATED_STUB} - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/nvml.h" - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES_DIRECTIVE} + "${CUDAToolkit_TARGET_DIR}/include/nvml.h" "-I${CUDAToolkit_TARGET_DIR}/include" # for some reason QNX fails with 'too many errors emitted' is this is not set "-ferror-limit=0" # let clang know which architecutre we compile for "--target=${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ${DEFAULT_COMPILER_INCLUDE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/stub_codegen.py - "${CUDA_TOOLKIT_INCLUDE_MAJOR_DIRECTORY}/nvml.h" + "${CUDAToolkit_TARGET_DIR}/include/nvml.h" "${CMAKE_CURRENT_SOURCE_DIR}/../../internal_tools/stub_generator/nvml.json" COMMENT "Running nvml.h stub generator" VERBATIM) diff --git a/dali/util/nvml_wrap.cc b/dali/util/nvml_wrap.cc index b2cfe612a73..a8d95a4b136 100644 --- a/dali/util/nvml_wrap.cc +++ b/dali/util/nvml_wrap.cc @@ -38,7 +38,7 @@ NVMLRIVER loadNvmlLibrary() { ret = dlopen(__NvmlLibName, RTLD_NOW); if (!ret) { - fprintf(stderr, "dlopen libnvidia-ml.so failed!. Please install GPU dirver"); + fprintf(stderr, "dlopen libnvidia-ml.so failed!. Please install GPU driver"); } } return ret; From a92aa4a7de493f2b207d520857fa39e4afdd6e2c Mon Sep 17 00:00:00 2001 From: Janusz Lisiecki Date: Mon, 8 Jun 2026 16:10:52 +0200 Subject: [PATCH 2/2] Review fix Signed-off-by: Janusz Lisiecki --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5c17d6cd1d..08711c1ded0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,10 +44,6 @@ if(BUILD_FOR_CONDA AND DEFINED CUDAToolkit_TARGET_DIR AND "${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}") endif() -# more recent CMake puts both cuda/targets/x86_64-linux/include and cuda/targets/x86_64-linux/include/cccl into the path -# while we usually need only the former -string(FIND "${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}" ";" SEMICOLON_POS) - parse_cuda_version(${CUDA_VERSION} CUDA_VERSION_MAJOR CUDA_VERSION_MINOR CUDA_VERSION_PATCH CUDA_VERSION_SHORT CUDA_VERSION_SHORT_DIGIT_ONLY) # CUDA_utils.cmake uses CUDA_VERSION_MAJOR value to determine the content of CUDA_known_archs and CUDA_TARGET_ARCHS include(cmake/CUDA_utils.cmake)