# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file LICENSE.rst or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindOpenCL ---------- .. versionadded:: 3.1 Finds Open Computing Language (OpenCL): .. code-block:: cmake find_package(OpenCL [] [...]) OpenCL is a framework for writing programs that execute across heterogeneous platforms, such as CPUs, GPUs, and other accelerators. .. versionadded:: 3.24 Detection of OpenCL 3.0. .. versionadded:: 3.10 Detection of OpenCL 2.1 and 2.2. Imported Targets ^^^^^^^^^^^^^^^^ This module provides the following :ref:`Imported Targets`: ``OpenCL::OpenCL`` .. versionadded:: 3.7 Target encapsulating the OpenCL usage requirements, available if OpenCL has been found. Result Variables ^^^^^^^^^^^^^^^^ This module defines the following variables: ``OpenCL_FOUND`` Boolean indicating whether (the requested version of) OpenCL was found. ``OpenCL_VERSION`` .. versionadded:: 4.2 Highest supported OpenCL version found in form of ``.`` (e.g., ``1.2``). ``OpenCL_VERSION_MAJOR`` The major version of the OpenCL implementation. ``OpenCL_VERSION_MINOR`` The minor version of the OpenCL implementation. ``OpenCL_INCLUDE_DIRS`` Include directories needed to use OpenCL. ``OpenCL_LIBRARIES`` Libraries needed to link to OpenCL. Cache Variables ^^^^^^^^^^^^^^^ The following cache variables may also be set: ``OpenCL_INCLUDE_DIR`` The OpenCL include directory. ``OpenCL_LIBRARY`` The path to the OpenCL library. Deprecated Variables ^^^^^^^^^^^^^^^^^^^^ The following variables are provided for backward compatibility: ``OpenCL_VERSION_STRING`` .. deprecated:: 4.2 Use ``OpenCL_VERSION``, which has the same value. Highest supported OpenCL version found in form of ``.``. Examples ^^^^^^^^ Finding OpenCL and linking it to a project target: .. code-block:: cmake find_package(OpenCL) target_link_libraries(project_target PRIVATE OpenCL::OpenCL) #]=======================================================================] cmake_policy(PUSH) cmake_policy(SET CMP0140 NEW) set(_OPENCL_x86 "(x86)") function(_FIND_OPENCL_VERSION) include(CheckIncludeFiles) include(CheckSymbolExists) include(CMakePushCheckState) cmake_push_check_state() set(CMAKE_REQUIRED_QUIET ${OpenCL_FIND_QUIETLY}) set(CMAKE_REQUIRED_INCLUDES "${OpenCL_INCLUDE_DIR}") check_include_files(OpenCL/cl.h OpenCL_HAVE_OPENCL_CL_H) foreach(VERSION "3_0" "2_2" "2_1" "2_0" "1_2" "1_1" "1_0") if(OpenCL_HAVE_OPENCL_CL_H) check_symbol_exists( CL_VERSION_${VERSION} "OpenCL/cl.h" OPENCL_VERSION_${VERSION}) else() check_symbol_exists( CL_VERSION_${VERSION} "CL/cl.h" OPENCL_VERSION_${VERSION}) endif() if(OPENCL_VERSION_${VERSION}) string(REPLACE "_" "." VERSION "${VERSION}") set(OpenCL_VERSION ${VERSION}) set(OpenCL_VERSION_STRING "${OpenCL_VERSION}") string(REGEX MATCHALL "[0-9]+" version_components "${VERSION}") list(GET version_components 0 major_version) list(GET version_components 1 minor_version) set(OpenCL_VERSION_MAJOR ${major_version}) set(OpenCL_VERSION_MINOR ${minor_version}) break() endif() endforeach() cmake_pop_check_state() return( PROPAGATE OpenCL_VERSION OpenCL_VERSION_MAJOR OpenCL_VERSION_MINOR OpenCL_VERSION_STRING ) endfunction() find_path(OpenCL_INCLUDE_DIR NAMES CL/cl.h OpenCL/cl.h PATHS ENV "PROGRAMFILES(X86)" ENV "PROGRAMFILES" $ENV{PROGRAMFILES${_OPENCL_x86}}/OpenCLHeaders $ENV{PROGRAMFILES}/OpenCLHeaders ENV AMDAPPSDKROOT ENV INTELOCLSDKROOT ENV NVSDKCOMPUTE_ROOT ENV CUDA_PATH ENV ATISTREAMSDKROOT ENV OCL_ROOT /usr/local/cuda /opt/cuda PATH_SUFFIXES include OpenCL/common/inc "AMD APP/include") _FIND_OPENCL_VERSION() if(WIN32) if(CMAKE_SIZEOF_VOID_P EQUAL 4) find_library(OpenCL_LIBRARY NAMES OpenCL PATHS ENV "PROGRAMFILES(X86)" ENV "PROGRAMFILES" $ENV{PROGRAMFILES${_OPENCL_x86}}/OpenCL-ICD-Loader $ENV{PROGRAMFILES}/OpenCL-ICD-Loader ENV AMDAPPSDKROOT ENV INTELOCLSDKROOT ENV CUDA_PATH ENV NVSDKCOMPUTE_ROOT ENV ATISTREAMSDKROOT ENV OCL_ROOT PATH_SUFFIXES "AMD APP/lib/x86" lib/x86 lib/Win32 OpenCL/common/lib/Win32) elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) find_library(OpenCL_LIBRARY NAMES OpenCL PATHS ENV "PROGRAMFILES(X86)" ENV "PROGRAMFILES" $ENV{PROGRAMFILES${_OPENCL_x86}}/OpenCL-ICD-Loader $ENV{PROGRAMFILES}/OpenCL-ICD-Loader ENV AMDAPPSDKROOT ENV INTELOCLSDKROOT ENV CUDA_PATH ENV NVSDKCOMPUTE_ROOT ENV ATISTREAMSDKROOT ENV OCL_ROOT PATH_SUFFIXES "AMD APP/lib/x86_64" lib/x86_64 lib/x64 lib OpenCL/common/lib/x64) endif() else() if(CMAKE_SIZEOF_VOID_P EQUAL 4) find_library(OpenCL_LIBRARY NAMES OpenCL PATHS ENV AMDAPPSDKROOT ENV CUDA_PATH /usr/local/cuda /opt/cuda PATH_SUFFIXES lib/x86 lib) elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) find_library(OpenCL_LIBRARY NAMES OpenCL PATHS ENV AMDAPPSDKROOT ENV CUDA_PATH /usr/local/cuda /opt/cuda PATH_SUFFIXES lib/x86_64 lib/x64 lib lib64) endif() endif() unset(_OPENCL_x86) set(OpenCL_LIBRARIES ${OpenCL_LIBRARY}) set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIR}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args( OpenCL REQUIRED_VARS OpenCL_LIBRARY OpenCL_INCLUDE_DIR VERSION_VAR OpenCL_VERSION ) mark_as_advanced( OpenCL_INCLUDE_DIR OpenCL_LIBRARY) if(OpenCL_FOUND AND NOT TARGET OpenCL::OpenCL) if(OpenCL_LIBRARY MATCHES "/([^/]+)\\.framework$") add_library(OpenCL::OpenCL INTERFACE IMPORTED) set_target_properties(OpenCL::OpenCL PROPERTIES INTERFACE_LINK_LIBRARIES "${OpenCL_LIBRARY}") else() add_library(OpenCL::OpenCL UNKNOWN IMPORTED) set_target_properties(OpenCL::OpenCL PROPERTIES IMPORTED_LOCATION "${OpenCL_LIBRARY}") endif() set_target_properties(OpenCL::OpenCL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}") endif() cmake_policy(POP)