| # 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 [<version>] [...]) |
| |
| 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 ``<major>.<minor>`` |
| (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 ``<major>.<minor>``. |
| |
| 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) |