Refactor OpenCL search
authorAndrey Kamaev <andrey.kamaev@itseez.com>
Fri, 15 Mar 2013 19:29:22 +0000 (23:29 +0400)
committerAndrey Kamaev <andrey.kamaev@itseez.com>
Thu, 21 Mar 2013 13:56:59 +0000 (17:56 +0400)
CMakeLists.txt
cmake/OpenCVDetectOpenCL.cmake
modules/ocl/CMakeLists.txt

index f8f5694..6657de2 100644 (file)
@@ -412,15 +412,6 @@ endif()
 # --- OpenCL ---
 if(WITH_OPENCL)
   include(cmake/OpenCVDetectOpenCL.cmake)
-  if(OPENCL_FOUND)
-    set(HAVE_OPENCL 1)
-  endif()
-  if(WITH_OPENCLAMDFFT AND CLAMDFFT_INCLUDE_DIR)
-    set(HAVE_CLAMDFFT 1)
-  endif()
-  if(WITH_OPENCLAMDBLAS AND CLAMDBLAS_INCLUDE_DIR)
-    set(HAVE_CLAMDBLAS 1)
-  endif()
 endif()
 
 # ----------------------------------------------------------------------------
@@ -795,7 +786,7 @@ if(HAVE_OPENCL AND BUILD_opencv_ocl)
   status("")
   status("  OpenCL")
   if(OPENCL_INCLUDE_DIR)
-    status("    Include path:"       ${OPENCL_INCLUDE_DIR})
+    status("    Include path:"       ${OPENCL_INCLUDE_DIRS})
   endif()
   if(OPENCL_LIBRARIES)
     status("    libraries:"          ${OPENCL_LIBRARIES})
index 12ab9d3..76f76eb 100644 (file)
 if(APPLE)
   set(OPENCL_FOUND YES)
-  set(OPENCL_LIBRARIES "-framework OpenCL")
-else()
+  set(OPENCL_LIBRARY "-framework OpenCL" CACHE STRING "OpenCL library")
+  set(OPENCL_INCLUDE_DIR "" CACHE STRING "OpenCL include directory")
+  mark_as_advanced(OPENCL_INCLUDE_DIR OPENCL_LIBRARY)
+else(APPLE)
   find_package(OpenCL QUIET)
-  if(WITH_OPENCLAMDFFT)
-    set(CLAMDFFT_SEARCH_PATH $ENV{CLAMDFFT_PATH})
-    if(NOT CLAMDFFT_SEARCH_PATH)
-      if(WIN32)
-        set( CLAMDFFT_SEARCH_PATH "C:\\Program Files (x86)\\AMD\\clAmdFft" )
-      endif()
-    endif()
-    set( CLAMDFFT_INCLUDE_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}/include )
-    if(UNIX)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(CLAMDFFT_LIB_SEARCH_PATH /usr/lib)
-      else()
-        set(CLAMDFFT_LIB_SEARCH_PATH /usr/lib64)
-      endif()
-    else()
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(CLAMDFFT_LIB_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}\\lib32\\import)
-      else()
-        set(CLAMDFFT_LIB_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}\\lib64\\import)
-      endif()
+
+  if (NOT OPENCL_FOUND)
+    find_path(OPENCL_ROOT_DIR
+              NAMES OpenCL/cl.h CL/cl.h include/CL/cl.h include/nvidia-current/CL/cl.h
+              PATHS ENV OCLROOT ENV AMDAPPSDKROOT ENV CUDA_PATH ENV INTELOCLSDKROOT
+              DOC "OpenCL root directory"
+              NO_DEFAULT_PATH)
+
+    find_path(OPENCL_INCLUDE_DIR
+              NAMES OpenCL/cl.h CL/cl.h
+              HINTS ${OPENCL_ROOT_DIR}
+              PATH_SUFFIXES include include/nvidia-current
+              DOC "OpenCL include directory")
+
+    if (X86_64)
+      set(OPENCL_POSSIBLE_LIB_SUFFIXES lib/Win64 lib/x86_64 lib/x64)
+    elseif (X86)
+      set(OPENCL_POSSIBLE_LIB_SUFFIXES lib/Win32 lib/x86)
     endif()
+
+    find_library(OPENCL_LIBRARY
+              NAMES OpenCL
+              HINTS ${OPENCL_ROOT_DIR}
+              PATH_SUFFIXES ${OPENCL_POSSIBLE_LIB_SUFFIXES}
+              DOC "OpenCL library")
+
+    mark_as_advanced(OPENCL_INCLUDE_DIR OPENCL_LIBRARY)
+    include(FindPackageHandleStandardArgs)
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPENCL DEFAULT_MSG OPENCL_LIBRARY OPENCL_INCLUDE_DIR )
+  endif()
+endif(APPLE)
+
+if(OPENCL_FOUND)
+  set(HAVE_OPENCL 1)
+  set(OPENCL_INCLUDE_DIRS ${OPENCL_INCLUDE_DIR})
+  set(OPENCL_LIBRARIES    ${OPENCL_LIBRARY})
+
+  if (X86_64)
+    set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import)
+  elseif (X86)
+    set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import)
+  endif()
+
+  if(WITH_OPENCLAMDFFT)
+    find_path(CLAMDFFT_ROOT_DIR
+              NAMES include/clAmdFft.h
+              PATHS ENV CLAMDFFT_PATH ENV ProgramFiles
+              PATH_SUFFIXES clAmdFft AMD/clAmdFft
+              DOC "AMD FFT root directory"
+              NO_DEFAULT_PATH)
+
     find_path(CLAMDFFT_INCLUDE_DIR
-      NAMES clAmdFft.h
-      PATHS ${CLAMDFFT_INCLUDE_SEARCH_PATH}
-      PATH_SUFFIXES clAmdFft
-      NO_DEFAULT_PATH)
+              NAMES clAmdFft.h
+              HINTS ${CLAMDFFT_ROOT_DIR}
+              PATH_SUFFIXES include
+              DOC "clAmdFft include directory")
+
     find_library(CLAMDFFT_LIBRARY
-      NAMES clAmdFft.Runtime
-      PATHS ${CLAMDFFT_LIB_SEARCH_PATH}
-      NO_DEFAULT_PATH)
-    if(CLAMDFFT_LIBRARY)
-      set(CLAMDFFT_LIBRARIES ${CLAMDFFT_LIBRARY})
-    else()
-      set(CLAMDFFT_LIBRARIES "")
-    endif()
-  endif()
-  if(WITH_OPENCLAMDBLAS)
-    set(CLAMDBLAS_SEARCH_PATH $ENV{CLAMDBLAS_PATH})
-    if(NOT CLAMDBLAS_SEARCH_PATH)
-      if(WIN32)
-        set( CLAMDBLAS_SEARCH_PATH "C:\\Program Files (x86)\\AMD\\clAmdBlas" )
-      endif()
-    endif()
-    set( CLAMDBLAS_INCLUDE_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}/include )
-    if(UNIX)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(CLAMDBLAS_LIB_SEARCH_PATH /usr/lib)
-      else()
-        set(CLAMDBLAS_LIB_SEARCH_PATH /usr/lib64)
-      endif()
-    else()
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(CLAMDBLAS_LIB_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}\\lib32\\import)
-      else()
-        set(CLAMDBLAS_LIB_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}\\lib64\\import)
-      endif()
-    endif()
-    find_path(CLAMDBLAS_INCLUDE_DIR
-      NAMES clAmdBlas.h
-      PATHS ${CLAMDBLAS_INCLUDE_SEARCH_PATH}
-      PATH_SUFFIXES clAmdBlas
-      NO_DEFAULT_PATH)
-    find_library(CLAMDBLAS_LIBRARY
-      NAMES clAmdBlas
-      PATHS ${CLAMDBLAS_LIB_SEARCH_PATH}
-      NO_DEFAULT_PATH)
-    if(CLAMDBLAS_LIBRARY)
-      set(CLAMDBLAS_LIBRARIES ${CLAMDBLAS_LIBRARY})
-    else()
-      set(CLAMDBLAS_LIBRARIES "")
+              NAMES clAmdFft.Runtime
+              HINTS ${CLAMDFFT_ROOT_DIR}
+              PATH_SUFFIXES ${CLAMD_POSSIBLE_LIB_SUFFIXES}
+              DOC "clAmdFft library")
+
+    if(CLAMDFFT_LIBRARY AND CLAMDFFT_INCLUDE_DIR)
+      set(HAVE_CLAMDFFT 1)
+      list(APPEND OPENCL_INCLUDE_DIRS "${CLAMDFFT_INCLUDE_DIR}")
+      list(APPEND OPENCL_LIBRARIES    "${CLAMDFFT_LIBRARY}")
     endif()
   endif()
-  # Try AMD/ATI Stream SDK
-  if (NOT OPENCL_FOUND)
-    set(ENV_AMDSTREAMSDKROOT $ENV{AMDAPPSDKROOT})
-    set(ENV_AMDAPPSDKROOT $ENV{AMDAPPSDKROOT})
-    set(ENV_OPENCLROOT $ENV{OPENCLROOT})
-    set(ENV_CUDA_PATH $ENV{CUDA_PATH})
-    set(ENV_INTELOCLSDKROOT $ENV{INTELOCLSDKROOT})
-    if(ENV_AMDSTREAMSDKROOT)
-      set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_AMDAPPSDKROOT}/include)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDAPPSDKROOT}/lib/x86)
-      else()
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDAPPSDKROOT}/lib/x86_64)
-      endif()
-    elseif(ENV_AMDSTREAMSDKROOT)
-      set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_AMDSTREAMSDKROOT}/include)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDSTREAMSDKROOT}/lib/x86)
-      else()
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDSTREAMSDKROOT}/lib/x86_64)
-      endif()
-    elseif(ENV_CUDA_PATH AND WIN32)
-      set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_CUDA_PATH}/include)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_CUDA_PATH}/lib/Win32)
-      else()
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_CUDA_PATH}/lib/x64)
-      endif()
-    elseif(ENV_OPENCLROOT AND UNIX)
-      set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_OPENCLROOT}/inc)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} /usr/lib)
-      else()
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} /usr/lib64)
-      endif()
-    elseif(ENV_INTELOCLSDKROOT)
-      set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_INTELOCLSDKROOT}/include)
-      if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_INTELOCLSDKROOT}/lib/x86)
-      else()
-        set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_INTELOCLSDKROOT}/lib/x64)
-      endif()
-    endif()
 
-    if(OPENCL_INCLUDE_SEARCH_PATH)
-      find_path(OPENCL_INCLUDE_DIR
-        NAMES CL/cl.h OpenCL/cl.h
-        PATHS ${OPENCL_INCLUDE_SEARCH_PATH}
-        NO_DEFAULT_PATH)
-    else()
-      find_path(OPENCL_INCLUDE_DIR
-        NAMES CL/cl.h OpenCL/cl.h)
-    endif()
+  if(WITH_OPENCLAMDBLAS)
+    find_path(CLAMDBLAS_ROOT_DIR
+              NAMES include/clAmdBlas.h
+              PATHS ENV CLAMDFFT_PATH ENV ProgramFiles
+              PATH_SUFFIXES clAmdBlas AMD/clAmdBlas
+              DOC "AMD FFT root directory"
+              NO_DEFAULT_PATH)
 
-    if(OPENCL_LIB_SEARCH_PATH)
-      find_library(OPENCL_LIBRARY NAMES OpenCL PATHS ${OPENCL_LIB_SEARCH_PATH} NO_DEFAULT_PATH)
-    else()
-      find_library(OPENCL_LIBRARY NAMES OpenCL)
-    endif()
+    find_path(CLAMDBLAS_INCLUDE_DIR
+              NAMES clAmdBlas.h
+              HINTS ${CLAMDBLAS_ROOT_DIR}
+              PATH_SUFFIXES include
+              DOC "clAmdFft include directory")
 
-    include(FindPackageHandleStandardArgs)
-    find_package_handle_standard_args(
-      OPENCL
-      DEFAULT_MSG
-      OPENCL_LIBRARY OPENCL_INCLUDE_DIR
-      )
+    find_library(CLAMDBLAS_LIBRARY
+              NAMES clAmdBlas
+              HINTS ${CLAMDBLAS_ROOT_DIR}
+              PATH_SUFFIXES ${CLAMD_POSSIBLE_LIB_SUFFIXES}
+              DOC "clAmdBlas library")
 
-    if(OPENCL_FOUND)
-      set(OPENCL_LIBRARIES ${OPENCL_LIBRARY})
-      set(HAVE_OPENCL 1)
-    else()
-      set(OPENCL_LIBRARIES)
+    if(CLAMDBLAS_LIBRARY AND CLAMDBLAS_INCLUDE_DIR)
+      set(HAVE_CLAMDBLAS 1)
+      list(APPEND OPENCL_INCLUDE_DIRS "${CLAMDBLAS_INCLUDE_DIR}")
+      list(APPEND OPENCL_LIBRARIES    "${CLAMDBLAS_LIBRARY}")
     endif()
-  else()
-    set(HAVE_OPENCL 1)
   endif()
 endif()
index a9ec2f4..7e621f4 100644 (file)
@@ -1,12 +1,10 @@
-# Will be modified later
 if(NOT HAVE_OPENCL)
   ocv_module_disable(ocl)
 endif()
 
 set(the_description "OpenCL-accelerated Computer Vision")
 ocv_add_module(ocl opencv_core opencv_imgproc opencv_features2d opencv_objdetect opencv_video opencv_nonfree)
-
-ocv_module_include_directories()
+ocv_module_include_directories(${OPENCL_INCLUDE_DIRS})
 
 file(GLOB CL_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/kernels/*.cl")
 set(kernels_cpp "${CMAKE_CURRENT_BINARY_DIR}/kernels.cpp")
@@ -24,30 +22,10 @@ file(GLOB lib_int_hdrs "src/*.h*")
 source_group("Include"   FILES ${lib_hdrs})
 source_group("Src\\Host" FILES ${lib_srcs} ${lib_int_hdrs} ${kernels_cpp})
 
-if (HAVE_OPENCL)
-  set(ocl_link_libs ${OPENCL_LIBRARIES})
-  if(OPENCL_INCLUDE_DIR)
-    ocv_include_directories(${OPENCL_INCLUDE_DIR})
-  endif()
-  if (HAVE_CLAMDFFT)
-    set(ocl_link_libs ${ocl_link_libs} ${CLAMDFFT_LIBRARIES})
-    ocv_include_directories(${CLAMDFFT_INCLUDE_DIR})
-  endif()
-  if (HAVE_CLAMDBLAS)
-    set(ocl_link_libs ${ocl_link_libs} ${CLAMDBLAS_LIBRARIES})
-    ocv_include_directories(${CLAMDBLAS_INCLUDE_DIR})
-  endif()
-endif()
-
 ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
 
 ocv_set_module_sources(HEADERS ${lib_hdrs} SOURCES ${lib_int_hdrs} ${lib_srcs} ${kernels_cpp})
-ocv_create_module(${ocl_link_libs})
-
-install(FILES ${lib_hdrs}
-  DESTINATION include/opencv2/${name}
-  COMPONENT main)
-
+ocv_create_module(${OPENCL_LIBRARIES})
 ocv_add_precompiled_headers(${the_module})
 
 ################################################################################################################