diff --git a/Help/release/dev/find-modules.rst b/Help/release/dev/find-modules.rst index b6a2c35421..771c9ac481 100644 --- a/Help/release/dev/find-modules.rst +++ b/Help/release/dev/find-modules.rst @@ -60,6 +60,9 @@ Find Modules ``Lua_VERSION`` instead of the now deprecated ``LUA_VERSION_STRING`` result variable. +* The :module:`FindOpenCL` module now provides an ``OpenCL_VERSION`` result + variable. The ``OpenCL_VERSION_STRING`` result variable is deprecated. + * The :module:`FindOpenSceneGraph` module now provides an ``OpenSceneGraph_VERSION`` result variable. The ``OPENSCENEGRAPH_VERSION`` result variable is deprecated. diff --git a/Modules/FindOpenCL.cmake b/Modules/FindOpenCL.cmake index ccf78e9317..ff4e1d2c9d 100644 --- a/Modules/FindOpenCL.cmake +++ b/Modules/FindOpenCL.cmake @@ -13,19 +13,25 @@ Finds Open Computing Language (OpenCL): 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 ^^^^^^^^^^^^^^^^ -.. versionadded:: 3.7 - -This module provides the following :ref:`Imported Targets`, if OpenCL has been -found: +This module provides the following :ref:`Imported Targets`: ``OpenCL::OpenCL`` - Target providing OpenCL usage requirements. + .. versionadded:: 3.7 + + Target encapsulating the OpenCL usage requirements, available if OpenCL + has been found. Result Variables ^^^^^^^^^^^^^^^^ @@ -33,18 +39,26 @@ Result Variables This module defines the following variables: ``OpenCL_FOUND`` - True if OpenCL was found. -``OpenCL_INCLUDE_DIRS`` - Include directories needed to use OpenCL. -``OpenCL_LIBRARIES`` - Libraries needed to link to OpenCL. -``OpenCL_VERSION_STRING`` - Highest supported OpenCL version (e.g., ``1.2``). + 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 ^^^^^^^^^^^^^^^ @@ -52,9 +66,21 @@ 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 ^^^^^^^^ @@ -66,21 +92,28 @@ Finding OpenCL and linking it to a project target: 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) - set(CMAKE_REQUIRED_QUIET ${OpenCL_FIND_QUIETLY}) cmake_push_check_state() - foreach(VERSION "3_0" "2_2" "2_1" "2_0" "1_2" "1_1" "1_0") - set(CMAKE_REQUIRED_INCLUDES "${OpenCL_INCLUDE_DIR}") - if(EXISTS ${OpenCL_INCLUDE_DIR}/Headers/cl.h) + 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} - "Headers/cl.h" + "OpenCL/cl.h" OPENCL_VERSION_${VERSION}) else() check_symbol_exists( @@ -91,16 +124,25 @@ function(_FIND_OPENCL_VERSION) if(OPENCL_VERSION_${VERSION}) string(REPLACE "_" "." VERSION "${VERSION}") - set(OpenCL_VERSION_STRING ${VERSION} PARENT_SCOPE) + 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} PARENT_SCOPE) - set(OpenCL_VERSION_MINOR ${minor_version} PARENT_SCOPE) + 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 @@ -204,7 +246,8 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args( OpenCL REQUIRED_VARS OpenCL_LIBRARY OpenCL_INCLUDE_DIR - VERSION_VAR OpenCL_VERSION_STRING) + VERSION_VAR OpenCL_VERSION +) mark_as_advanced( OpenCL_INCLUDE_DIR @@ -223,3 +266,5 @@ if(OpenCL_FOUND AND NOT TARGET OpenCL::OpenCL) set_target_properties(OpenCL::OpenCL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}") endif() + +cmake_policy(POP) diff --git a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt index 7e13003a68..ea43e59e1f 100644 --- a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt +++ b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt @@ -102,6 +102,7 @@ foreach( ICOTOOL JASPER LIBLZMA LIBXML2 LIBXSLT LTTNGUST + OpenCL PERL PKG_CONFIG PNG PostgreSQL SDL TIFF @@ -123,7 +124,7 @@ foreach( HDF5 Hg Jasper JPEG LibArchive LibLZMA LIBLZMA LibXml2 LibXslt LTTngUST - OpenSceneGraph OPENSCENEGRAPH OpenSSL OPENSSL + OpenCL OpenSceneGraph OPENSCENEGRAPH OpenSSL OPENSSL Perl PerlLibs PkgConfig PNG PostgreSQL Protobuf Ruby RUBY SDL SWIG diff --git a/Tests/FindOpenCL/Test/CMakeLists.txt b/Tests/FindOpenCL/Test/CMakeLists.txt index f08d4e5797..ae9919854d 100644 --- a/Tests/FindOpenCL/Test/CMakeLists.txt +++ b/Tests/FindOpenCL/Test/CMakeLists.txt @@ -4,6 +4,10 @@ include(CTest) find_package(OpenCL REQUIRED) +add_compile_definitions( + CL_TARGET_OPENCL_VERSION=${OpenCL_VERSION_MAJOR}${OpenCL_VERSION_MINOR}0 +) + add_executable(test_tgt main.c) target_link_libraries(test_tgt OpenCL::OpenCL) add_test(NAME test_tgt COMMAND test_tgt)