Files
CMake/Modules/FindOpenCL.cmake
Peter Kokot 870fd818a3 FindOpenCL: Add OpenCL_VERSION
- 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
2025-08-25 22:16:51 +02:00

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)