93 lines · plain
1# Try to detect in the system several dependencies required by the different2# components of libomptarget. These are the dependencies we have:3#4# libffi : required to launch target kernels given function and argument5# pointers.6 7include (FindPackageHandleStandardArgs)8 9################################################################################10# Looking for LLVM...11################################################################################12 13if (OPENMP_STANDALONE_BUILD)14 # Complete LLVM package is required for building libomptarget15 # in an out-of-tree mode.16 find_package(LLVM REQUIRED)17 message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")18 message(STATUS "Using LLVM in: ${LLVM_DIR}")19 list(APPEND LIBOMPTARGET_LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})20 list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR})21 include(AddLLVM)22 if(TARGET omptarget)23 message(FATAL_ERROR "CMake target 'omptarget' already exists. "24 "Use an LLVM installation that doesn't expose its 'omptarget' target.")25 endif()26else()27 # Note that OPENMP_STANDALONE_BUILD is FALSE, when28 # openmp is built with -DLLVM_ENABLE_RUNTIMES="openmp" vs29 # -DLLVM_ENABLE_PROJECTS="openmp", but openmp build30 # is actually done as a standalone project build with many31 # LLVM CMake variables propagated to it.32 list(APPEND LIBOMPTARGET_LLVM_INCLUDE_DIRS33 ${LLVM_MAIN_INCLUDE_DIR} ${LLVM_BINARY_DIR}/include34 )35 message(STATUS36 "Using LLVM include directories: ${LIBOMPTARGET_LLVM_INCLUDE_DIRS}")37endif()38 39################################################################################40# Looking for libffi...41################################################################################42find_package(FFI QUIET)43set(LIBOMPTARGET_DEP_LIBFFI_FOUND ${FFI_FOUND})44 45################################################################################46# Looking for NVIDIA GPUs...47################################################################################48set(LIBOMPTARGET_DEP_CUDA_ARCH "sm_35")49 50if(TARGET nvptx-arch)51 get_property(LIBOMPTARGET_NVPTX_ARCH TARGET nvptx-arch PROPERTY LOCATION)52else()53 find_program(LIBOMPTARGET_NVPTX_ARCH NAMES nvptx-arch54 PATHS ${LLVM_TOOLS_BINARY_DIR})55endif()56 57if(LIBOMPTARGET_NVPTX_ARCH)58 execute_process(COMMAND ${LIBOMPTARGET_NVPTX_ARCH}59 OUTPUT_VARIABLE LIBOMPTARGET_NVPTX_ARCH_OUTPUT60 OUTPUT_STRIP_TRAILING_WHITESPACE)61 string(REPLACE "\n" ";" nvptx_arch_list "${LIBOMPTARGET_NVPTX_ARCH_OUTPUT}")62 if(nvptx_arch_list)63 set(LIBOMPTARGET_FOUND_NVIDIA_GPU TRUE)64 set(LIBOMPTARGET_NVPTX_DETECTED_ARCH_LIST "${nvptx_arch_list}")65 list(GET nvptx_arch_list 0 LIBOMPTARGET_DEP_CUDA_ARCH)66 endif()67endif()68 69 70################################################################################71# Looking for AMD GPUs...72################################################################################73 74if(TARGET amdgpu-arch)75 get_property(LIBOMPTARGET_AMDGPU_ARCH TARGET amdgpu-arch PROPERTY LOCATION)76else()77 find_program(LIBOMPTARGET_AMDGPU_ARCH NAMES amdgpu-arch78 PATHS ${LLVM_TOOLS_BINARY_DIR})79endif()80 81if(LIBOMPTARGET_AMDGPU_ARCH)82 execute_process(COMMAND ${LIBOMPTARGET_AMDGPU_ARCH}83 OUTPUT_VARIABLE LIBOMPTARGET_AMDGPU_ARCH_OUTPUT84 OUTPUT_STRIP_TRAILING_WHITESPACE)85 string(REPLACE "\n" ";" amdgpu_arch_list "${LIBOMPTARGET_AMDGPU_ARCH_OUTPUT}")86 if(amdgpu_arch_list)87 set(LIBOMPTARGET_FOUND_AMDGPU_GPU TRUE)88 set(LIBOMPTARGET_AMDGPU_DETECTED_ARCH_LIST "${amdgpu_arch_list}")89 endif()90endif()91 92set(OPENMP_PTHREAD_LIB ${LLVM_PTHREAD_LIB})93