1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindOpenCL
6----------
7
8.. versionadded:: 3.1
9
10Finds Open Computing Language (OpenCL)
11
12.. versionadded:: 3.10
13  Detection of OpenCL 2.1 and 2.2.
14
15IMPORTED Targets
16^^^^^^^^^^^^^^^^
17
18.. versionadded:: 3.7
19
20This module defines :prop_tgt:`IMPORTED` target ``OpenCL::OpenCL``, if
21OpenCL has been found.
22
23Result Variables
24^^^^^^^^^^^^^^^^
25
26This module defines the following variables::
27
28  OpenCL_FOUND          - True if OpenCL was found
29  OpenCL_INCLUDE_DIRS   - include directories for OpenCL
30  OpenCL_LIBRARIES      - link against this library to use OpenCL
31  OpenCL_VERSION_STRING - Highest supported OpenCL version (eg. 1.2)
32  OpenCL_VERSION_MAJOR  - The major version of the OpenCL implementation
33  OpenCL_VERSION_MINOR  - The minor version of the OpenCL implementation
34
35The module will also define two cache variables::
36
37  OpenCL_INCLUDE_DIR    - the OpenCL include directory
38  OpenCL_LIBRARY        - the path to the OpenCL library
39
40#]=======================================================================]
41
42function(_FIND_OPENCL_VERSION)
43  include(CheckSymbolExists)
44  include(CMakePushCheckState)
45  set(CMAKE_REQUIRED_QUIET ${OpenCL_FIND_QUIETLY})
46
47  CMAKE_PUSH_CHECK_STATE()
48  foreach(VERSION "2_2" "2_1" "2_0" "1_2" "1_1" "1_0")
49    set(CMAKE_REQUIRED_INCLUDES "${OpenCL_INCLUDE_DIR}")
50
51    if(APPLE)
52      CHECK_SYMBOL_EXISTS(
53        CL_VERSION_${VERSION}
54        "${OpenCL_INCLUDE_DIR}/Headers/cl.h"
55        OPENCL_VERSION_${VERSION})
56    else()
57      CHECK_SYMBOL_EXISTS(
58        CL_VERSION_${VERSION}
59        "${OpenCL_INCLUDE_DIR}/CL/cl.h"
60        OPENCL_VERSION_${VERSION})
61    endif()
62
63    if(OPENCL_VERSION_${VERSION})
64      string(REPLACE "_" "." VERSION "${VERSION}")
65      set(OpenCL_VERSION_STRING ${VERSION} PARENT_SCOPE)
66      string(REGEX MATCHALL "[0-9]+" version_components "${VERSION}")
67      list(GET version_components 0 major_version)
68      list(GET version_components 1 minor_version)
69      set(OpenCL_VERSION_MAJOR ${major_version} PARENT_SCOPE)
70      set(OpenCL_VERSION_MINOR ${minor_version} PARENT_SCOPE)
71      break()
72    endif()
73  endforeach()
74  CMAKE_POP_CHECK_STATE()
75endfunction()
76
77find_path(OpenCL_INCLUDE_DIR
78  NAMES
79    CL/cl.h OpenCL/cl.h
80  PATHS
81    ENV "PROGRAMFILES(X86)"
82    ENV AMDAPPSDKROOT
83    ENV INTELOCLSDKROOT
84    ENV NVSDKCOMPUTE_ROOT
85    ENV CUDA_PATH
86    ENV ATISTREAMSDKROOT
87    ENV OCL_ROOT
88    /usr/local/cuda
89    /opt/cuda
90  PATH_SUFFIXES
91    include
92    OpenCL/common/inc
93    "AMD APP/include")
94
95_FIND_OPENCL_VERSION()
96
97if(WIN32)
98  if(CMAKE_SIZEOF_VOID_P EQUAL 4)
99    find_library(OpenCL_LIBRARY
100      NAMES OpenCL
101      PATHS
102        ENV "PROGRAMFILES(X86)"
103        ENV AMDAPPSDKROOT
104        ENV INTELOCLSDKROOT
105        ENV CUDA_PATH
106        ENV NVSDKCOMPUTE_ROOT
107        ENV ATISTREAMSDKROOT
108        ENV OCL_ROOT
109      PATH_SUFFIXES
110        "AMD APP/lib/x86"
111        lib/x86
112        lib/Win32
113        OpenCL/common/lib/Win32)
114  elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
115    find_library(OpenCL_LIBRARY
116      NAMES OpenCL
117      PATHS
118        ENV "PROGRAMFILES(X86)"
119        ENV AMDAPPSDKROOT
120        ENV INTELOCLSDKROOT
121        ENV CUDA_PATH
122        ENV NVSDKCOMPUTE_ROOT
123        ENV ATISTREAMSDKROOT
124        ENV OCL_ROOT
125      PATH_SUFFIXES
126        "AMD APP/lib/x86_64"
127        lib/x86_64
128        lib/x64
129        OpenCL/common/lib/x64)
130  endif()
131else()
132  if(CMAKE_SIZEOF_VOID_P EQUAL 4)
133    find_library(OpenCL_LIBRARY
134      NAMES OpenCL
135      PATHS
136        ENV AMDAPPSDKROOT
137        ENV CUDA_PATH
138        /usr/local/cuda
139        /opt/cuda
140      PATH_SUFFIXES
141        lib/x86
142        lib)
143  elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
144    find_library(OpenCL_LIBRARY
145      NAMES OpenCL
146      PATHS
147        ENV AMDAPPSDKROOT
148        ENV CUDA_PATH
149        /usr/local/cuda
150        /opt/cuda
151      PATH_SUFFIXES
152        lib/x86_64
153        lib/x64
154        lib
155        lib64)
156  endif()
157endif()
158
159set(OpenCL_LIBRARIES ${OpenCL_LIBRARY})
160set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIR})
161
162include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
163find_package_handle_standard_args(
164  OpenCL
165  FOUND_VAR OpenCL_FOUND
166  REQUIRED_VARS OpenCL_LIBRARY OpenCL_INCLUDE_DIR
167  VERSION_VAR OpenCL_VERSION_STRING)
168
169mark_as_advanced(
170  OpenCL_INCLUDE_DIR
171  OpenCL_LIBRARY)
172
173if(OpenCL_FOUND AND NOT TARGET OpenCL::OpenCL)
174  if(OpenCL_LIBRARY MATCHES "/([^/]+)\\.framework$")
175    add_library(OpenCL::OpenCL INTERFACE IMPORTED)
176    set_target_properties(OpenCL::OpenCL PROPERTIES
177      INTERFACE_LINK_LIBRARIES "${OpenCL_LIBRARY}")
178  else()
179    add_library(OpenCL::OpenCL UNKNOWN IMPORTED)
180    set_target_properties(OpenCL::OpenCL PROPERTIES
181      IMPORTED_LOCATION "${OpenCL_LIBRARY}")
182  endif()
183  set_target_properties(OpenCL::OpenCL PROPERTIES
184    INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}")
185endif()
186