Hi,

I tried the FindOpenCL.cmake with the imported target OpenCL::OpenCL and found 
out that it does not work on MacOS.

The first problem is that it does not detect the version. In line 56 the path 
needs to be changed from ${OpenCL_INCLUDE_DIR}/OpenCL/cl.h" to 
“${OpenCL_INCLUDE_DIR}/Headers/cl.h“ because OpenCL_INCLUDE_DIR points to the 
root of the OpenCL framework directory and the Headers are located under 
Headers.

Also there seems to be a bug in find_package_handle_standard_args (?). Because 
without the change above - when there is no version found - the variable 
OpenCL_VERSION_STRING is empty. But an empty version string does not let cmake 
fail. This is the output

-- Looking for CL_VERSION_2_0
-- Looking for CL_VERSION_2_0 - not found
-- Looking for CL_VERSION_1_2
-- Looking for CL_VERSION_1_2 - not found
-- Looking for CL_VERSION_1_1
-- Looking for CL_VERSION_1_1 - not found
-- Looking for CL_VERSION_1_0
-- Looking for CL_VERSION_1_0 - not found
-- Found OpenCL: /System/Library/Frameworks/OpenCL.framework (Required is at 
least version "1.2") 

The other problems are with the imported locations in line 147ff. With the 
current solution the linker step fails because OpenCL_LIBRARY points to the 
root of the framework directory - i.e. 
/System/Library/Frameworks/OpenCL.framework. Long time ago there was a bug 
report [1] but the proposed solution was to have an if/else statement to handle 
the special case of Apple frameworks. So I based my solution on [2] and [3]. 
This works fine with Makefile and Ninja generators but the Xcode generator 
still fails. The problem now is that with Xcode 7 Apple switched the way how 
framework libraries work [5]. The final solution is based on [4] where the 
Apple framework case is changed to an INTERFACE IMPORTED library and the 
framework is stored in INTERFACE_LINK_LIBRARIES. This way cmake resolves the 
library path to -framework OpenCL.

So with this patch I provide my final solution. Is it correct (it works at 
least for me now on Win, Linux and Apple)? 

What’s with this empty version bug? I don’t found a solution for this.

jerry

[1] https://cmake.org/Bug/view.php?id=14105
[2] https://github.com/Kitware/CMake/blob/master/Modules/FindGLUT.cmake
[3] https://github.com/rpavlik/cmake-modules/blob/master/FindSDL2.cmake
[4] http://public.kitware.com/pipermail/cmake/2016-April/063179.html
[5] http://public.kitware.com/pipermail/cmake-developers/2015-August/026110.html
>From eb93a70536b2f26c33916bf18d65d612a068e5a5 Mon Sep 17 00:00:00 2001
From: jerry <jerry....@web.de>
Date: Mon, 1 Aug 2016 09:49:11 +0200
Subject: [PATCH] Fix FindOpenCL on Mac OS

---
 Modules/FindOpenCL.cmake | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/Modules/FindOpenCL.cmake b/Modules/FindOpenCL.cmake
index feda315..891798b 100644
--- a/Modules/FindOpenCL.cmake
+++ b/Modules/FindOpenCL.cmake
@@ -53,7 +53,7 @@ function(_FIND_OPENCL_VERSION)
     if(APPLE)
       CHECK_SYMBOL_EXISTS(
         CL_VERSION_${VERSION}
-        "${OpenCL_INCLUDE_DIR}/OpenCL/cl.h"
+        "${OpenCL_INCLUDE_DIR}/Headers/cl.h"
         OPENCL_VERSION_${VERSION})
     else()
       CHECK_SYMBOL_EXISTS(
@@ -145,8 +145,15 @@ mark_as_advanced(
   OpenCL_LIBRARY)
 
 if(OpenCL_FOUND AND NOT TARGET OpenCL::OpenCL)
-  add_library(OpenCL::OpenCL UNKNOWN IMPORTED)
+  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
-    IMPORTED_LOCATION "${OpenCL_LIBRARY}"
-    INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}")
+    INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIR}")
 endif()
-- 
2.7.4

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to