| # |
| #//===----------------------------------------------------------------------===// |
| #// |
| #// 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: |
| # |
| # libffi : required to launch target kernels given function and argument |
| # pointers. |
| # CUDA : required to control offloading to NVIDIA GPUs. |
| # VEOS : required to control offloading to NEC Aurora. |
| |
| include (FindPackageHandleStandardArgs) |
| |
| ################################################################################ |
| # Looking for LLVM... |
| ################################################################################ |
| |
| if (OPENMP_STANDALONE_BUILD) |
| # Complete LLVM package is required for building libomptarget |
| # in an out-of-tree mode. |
| find_package(LLVM REQUIRED) |
| message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") |
| message(STATUS "Using LLVM in: ${LLVM_DIR}") |
| list(APPEND LIBOMPTARGET_LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) |
| list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR}) |
| include(AddLLVM) |
| if(TARGET omptarget) |
| message(FATAL_ERROR "CMake target 'omptarget' already exists. " |
| "Use an LLVM installation that doesn't expose its 'omptarget' target.") |
| endif() |
| else() |
| # Note that OPENMP_STANDALONE_BUILD is FALSE, when |
| # openmp is built with -DLLVM_ENABLE_RUNTIMES="openmp" vs |
| # -DLLVM_ENABLE_PROJECTS="openmp", but openmp build |
| # is actually done as a standalone project build with many |
| # LLVM CMake variables propagated to it. |
| list(APPEND LIBOMPTARGET_LLVM_INCLUDE_DIRS |
| ${LLVM_MAIN_INCLUDE_DIR} ${LLVM_BINARY_DIR}/include |
| ) |
| message(STATUS |
| "Using LLVM include directories: ${LIBOMPTARGET_LLVM_INCLUDE_DIRS}") |
| endif() |
| |
| ################################################################################ |
| # 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... |
| ################################################################################ |
| |
| find_package(CUDAToolkit QUIET) |
| set(LIBOMPTARGET_DEP_CUDA_FOUND ${CUDAToolkit_FOUND}) |
| |
| ################################################################################ |
| # Looking for NVIDIA GPUs... |
| ################################################################################ |
| set(LIBOMPTARGET_DEP_CUDA_ARCH "sm_35") |
| |
| find_program(LIBOMPTARGET_NVPTX_ARCH NAMES nvptx-arch PATHS ${LLVM_BINARY_DIR}/bin) |
| if(LIBOMPTARGET_NVPTX_ARCH) |
| execute_process(COMMAND ${LIBOMPTARGET_NVPTX_ARCH} |
| OUTPUT_VARIABLE LIBOMPTARGET_NVPTX_ARCH_OUTPUT |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| string(REPLACE "\n" ";" nvptx_arch_list "${LIBOMPTARGET_NVPTX_ARCH_OUTPUT}") |
| if(nvptx_arch_list) |
| set(LIBOMPTARGET_FOUND_NVIDIA_GPU TRUE) |
| set(LIBOMPTARGET_NVPTX_DETECTED_ARCH_LIST "${nvptx_arch_list}") |
| list(GET nvptx_arch_list 0 LIBOMPTARGET_DEP_CUDA_ARCH) |
| endif() |
| endif() |
| |
| |
| ################################################################################ |
| # Looking for AMD GPUs... |
| ################################################################################ |
| |
| find_program(LIBOMPTARGET_AMDGPU_ARCH NAMES amdgpu-arch PATHS ${LLVM_BINARY_DIR}/bin) |
| if(LIBOMPTARGET_AMDGPU_ARCH) |
| execute_process(COMMAND ${LIBOMPTARGET_AMDGPU_ARCH} |
| OUTPUT_VARIABLE LIBOMPTARGET_AMDGPU_ARCH_OUTPUT |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| string(REPLACE "\n" ";" amdgpu_arch_list "${LIBOMPTARGET_AMDGPU_ARCH_OUTPUT}") |
| if(amdgpu_arch_list) |
| set(LIBOMPTARGET_FOUND_AMDGPU_GPU TRUE) |
| set(LIBOMPTARGET_AMDGPU_DETECTED_ARCH_LIST "${amdgpu_arch_list}") |
| endif() |
| endif() |
| |
| |
| ################################################################################ |
| # Looking for VEO... |
| ################################################################################ |
| |
| find_path ( |
| LIBOMPTARGET_DEP_VEO_INCLUDE_DIR |
| NAMES |
| ve_offload.h |
| PATHS |
| /usr/include |
| /usr/local/include |
| /opt/local/include |
| /sw/include |
| /opt/nec/ve/veos/include |
| ENV CPATH |
| PATH_SUFFIXES |
| libveo) |
| |
| find_library ( |
| LIBOMPTARGET_DEP_VEO_LIBRARIES |
| NAMES |
| veo |
| PATHS |
| /usr/lib |
| /usr/local/lib |
| /opt/local/lib |
| /sw/lib |
| /opt/nec/ve/veos/lib64 |
| ENV LIBRARY_PATH |
| ENV LD_LIBRARY_PATH) |
| |
| find_library( |
| LIBOMPTARGET_DEP_VEOSINFO_LIBRARIES |
| NAMES |
| veosinfo |
| PATHS |
| /usr/lib |
| /usr/local/lib |
| /opt/local/lib |
| /sw/lib |
| /opt/nec/ve/veos/lib64 |
| ENV LIBRARY_PATH |
| ENV LD_LIBRARY_PATH) |
| |
| set(LIBOMPTARGET_DEP_VEO_INCLUDE_DIRS ${LIBOMPTARGET_DEP_VEO_INCLUDE_DIR}) |
| find_package_handle_standard_args( |
| LIBOMPTARGET_DEP_VEO |
| DEFAULT_MSG |
| LIBOMPTARGET_DEP_VEO_LIBRARIES |
| LIBOMPTARGET_DEP_VEOSINFO_LIBRARIES |
| LIBOMPTARGET_DEP_VEO_INCLUDE_DIRS) |
| |
| mark_as_advanced( |
| LIBOMPTARGET_DEP_VEO_FOUND |
| LIBOMPTARGET_DEP_VEO_INCLUDE_DIRS) |
| |
| set(OPENMP_PTHREAD_LIB ${LLVM_PTHREAD_LIB}) |