| # |
| #//===----------------------------------------------------------------------===// |
| #// |
| #// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| #// See https://llvm.org/LICENSE.txt for license information. |
| #// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| #// |
| #//===----------------------------------------------------------------------===// |
| # |
| |
| # Try to detect in the system several dependencies required by the different |
| # components of libomptarget. These are the dependencies we have: |
| # |
| # libelf : required by some targets to handle the ELF files at runtime. |
| # libffi : required to launch target kernels given function and argument |
| # pointers. |
| # CUDA : required to control offloading to NVIDIA GPUs. |
| |
| include (FindPackageHandleStandardArgs) |
| |
| ################################################################################ |
| # Looking for libelf... |
| ################################################################################ |
| |
| find_path ( |
| LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR |
| NAMES |
| libelf.h |
| PATHS |
| /usr/include |
| /usr/local/include |
| /opt/local/include |
| /sw/include |
| ENV CPATH |
| PATH_SUFFIXES |
| libelf) |
| |
| find_library ( |
| LIBOMPTARGET_DEP_LIBELF_LIBRARIES |
| NAMES |
| elf |
| PATHS |
| /usr/lib |
| /usr/local/lib |
| /opt/local/lib |
| /sw/lib |
| ENV LIBRARY_PATH |
| ENV LD_LIBRARY_PATH) |
| |
| set(LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS ${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR}) |
| find_package_handle_standard_args( |
| LIBOMPTARGET_DEP_LIBELF |
| DEFAULT_MSG |
| LIBOMPTARGET_DEP_LIBELF_LIBRARIES |
| LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS) |
| |
| mark_as_advanced( |
| LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS |
| LIBOMPTARGET_DEP_LIBELF_LIBRARIES) |
| |
| ################################################################################ |
| # Looking for libffi... |
| ################################################################################ |
| find_package(PkgConfig) |
| |
| pkg_check_modules(LIBOMPTARGET_SEARCH_LIBFFI QUIET libffi) |
| |
| find_path ( |
| LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR |
| NAMES |
| ffi.h |
| HINTS |
| ${LIBOMPTARGET_SEARCH_LIBFFI_INCLUDEDIR} |
| ${LIBOMPTARGET_SEARCH_LIBFFI_INCLUDE_DIRS} |
| PATHS |
| /usr/include |
| /usr/local/include |
| /opt/local/include |
| /sw/include |
| ENV CPATH) |
| |
| # Don't bother look for the library if the header files were not found. |
| if (LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR) |
| find_library ( |
| LIBOMPTARGET_DEP_LIBFFI_LIBRARIES |
| NAMES |
| ffi |
| HINTS |
| ${LIBOMPTARGET_SEARCH_LIBFFI_LIBDIR} |
| ${LIBOMPTARGET_SEARCH_LIBFFI_LIBRARY_DIRS} |
| PATHS |
| /usr/lib |
| /usr/local/lib |
| /opt/local/lib |
| /sw/lib |
| ENV LIBRARY_PATH |
| ENV LD_LIBRARY_PATH) |
| endif() |
| |
| set(LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS ${LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR}) |
| find_package_handle_standard_args( |
| LIBOMPTARGET_DEP_LIBFFI |
| DEFAULT_MSG |
| LIBOMPTARGET_DEP_LIBFFI_LIBRARIES |
| LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS) |
| |
| mark_as_advanced( |
| LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS |
| LIBOMPTARGET_DEP_LIBFFI_LIBRARIES) |
| |
| ################################################################################ |
| # Looking for CUDA... |
| ################################################################################ |
| if (CUDA_TOOLKIT_ROOT_DIR) |
| set(LIBOMPTARGET_CUDA_TOOLKIT_ROOT_DIR_PRESET TRUE) |
| endif() |
| find_package(CUDA QUIET) |
| |
| set(LIBOMPTARGET_DEP_CUDA_FOUND ${CUDA_FOUND}) |
| set(LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) |
| |
| mark_as_advanced( |
| LIBOMPTARGET_DEP_CUDA_FOUND |
| LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS) |
| |
| ################################################################################ |
| # Looking for CUDA Driver API... (needed for CUDA plugin) |
| ################################################################################ |
| |
| find_library ( |
| LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES |
| NAMES |
| cuda |
| PATHS |
| /lib64) |
| |
| # There is a libcuda.so in lib64/stubs that can be used for linking. |
| if (NOT LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES AND CUDA_FOUND) |
| # Since CMake 3.3 FindCUDA.cmake defaults to using static libraries. In this |
| # case CUDA_LIBRARIES contains additional linker arguments which breaks |
| # get_filename_component below. Fortunately, since that change the module |
| # exports CUDA_cudart_static_LIBRARY which points to a single file in the |
| # right directory. |
| set(cuda_library ${CUDA_LIBRARIES}) |
| if (DEFINED CUDA_cudart_static_LIBRARY) |
| set(cuda_library ${CUDA_cudart_static_LIBRARY}) |
| endif() |
| get_filename_component(CUDA_LIBDIR ${cuda_library} DIRECTORY) |
| find_library ( |
| LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES |
| NAMES |
| cuda |
| HINTS |
| "${CUDA_LIBDIR}/stubs") |
| endif() |
| |
| find_package_handle_standard_args( |
| LIBOMPTARGET_DEP_CUDA_DRIVER |
| DEFAULT_MSG |
| LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES) |
| |
| mark_as_advanced(LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES) |
| |
| ################################################################################ |
| # Looking for CUDA libdevice subdirectory |
| # |
| # Special case for Debian/Ubuntu to have nvidia-cuda-toolkit work |
| # out of the box. More info on http://bugs.debian.org/882505 |
| ################################################################################ |
| |
| set(LIBOMPTARGET_CUDA_LIBDEVICE_SUBDIR nvvm/libdevice) |
| |
| # Don't alter CUDA_TOOLKIT_ROOT_DIR if the user specified it, if a value was |
| # already cached for it, or if it already has libdevice. Otherwise, on |
| # Debian/Ubuntu, look where the nvidia-cuda-toolkit package normally installs |
| # libdevice. |
| if (NOT LIBOMPTARGET_CUDA_TOOLKIT_ROOT_DIR_PRESET AND |
| NOT EXISTS |
| "${CUDA_TOOLKIT_ROOT_DIR}/${LIBOMPTARGET_CUDA_LIBDEVICE_SUBDIR}") |
| find_program(LSB_RELEASE lsb_release) |
| if (LSB_RELEASE) |
| execute_process(COMMAND ${LSB_RELEASE} -is |
| OUTPUT_VARIABLE LSB_RELEASE_ID |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| set(candidate_dir /usr/lib/cuda) |
| if ((LSB_RELEASE_ID STREQUAL "Debian" OR LSB_RELEASE_ID STREQUAL "Ubuntu") |
| AND EXISTS "${candidate_dir}/${LIBOMPTARGET_CUDA_LIBDEVICE_SUBDIR}") |
| set(CUDA_TOOLKIT_ROOT_DIR "${candidate_dir}" CACHE PATH |
| "Toolkit location." FORCE) |
| endif() |
| endif() |
| endif() |