mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-02 03:39:43 -06:00
- This deprecates the OPENCL_VERSION_STRING result variable. - Documentation adjusted. - Support for OpenCL 3.0 was added in CMake 3.24. - Added CL_TARGET_OPENCL_VERSION compile definition to test so that program compiles without warnings. - Additionally, on Apple systems compiler can't find <Headers/cl.h> unless direct path would be passed as a header. Instead, <OpenCL/cl.h> is used for version check conditionally. Issue: #27088
271 lines
6.4 KiB
CMake
271 lines
6.4 KiB
CMake
# 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)
|