559f70a9689f89cd9891ba6e3918585a9fd245ab
[profile/ivi/opencv.git] / cmake / OpenCVFindIPP.cmake
1 #
2 # The script to detect Intel(R) Integrated Performance Primitives (IPP)
3 # installation/package
4 #
5 # Windows host:
6 # Run script like this before cmake:
7 #   call "<IPP_INSTALL_DIR>\bin\ippvars.bat" intel64
8 # for example:
9 #   call "C:\Program Files (x86)\Intel\Composer XE\ipp\bin\ippvars.bat" intel64
10 #
11 # Linux host:
12 # Run script like this before cmake:
13 #   source /opt/intel/ipp/bin/ippvars.sh [ia32|intel64]
14 #
15 # On return this will define:
16 #
17 # HAVE_IPP          - True if Intel IPP found
18 # HAVE_IPP_ICV_ONLY - True if Intel IPP ICV version is available
19 # IPP_ROOT_DIR      - root of IPP installation
20 # IPP_INCLUDE_DIRS  - IPP include folder
21 # IPP_LIBRARIES     - IPP libraries that are used by OpenCV
22 # IPP_VERSION_STR   - string with the newest detected IPP version
23 # IPP_VERSION_MAJOR - numbers of IPP version (MAJOR.MINOR.BUILD)
24 # IPP_VERSION_MINOR
25 # IPP_VERSION_BUILD
26 #
27 # Created: 30 Dec 2010 by Vladimir Dudnik (vladimir.dudnik@intel.com)
28 #
29
30 unset(HAVE_IPP CACHE)
31 unset(HAVE_IPP_ICV_ONLY)
32 unset(IPP_ROOT_DIR)
33 unset(IPP_INCLUDE_DIRS)
34 unset(IPP_LIBRARIES)
35 unset(IPP_VERSION_STR)
36 unset(IPP_VERSION_MAJOR)
37 unset(IPP_VERSION_MINOR)
38 unset(IPP_VERSION_BUILD)
39
40 set(IPP_LIB_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX})
41 set(IPP_LIB_SUFFIX  ${CMAKE_STATIC_LIBRARY_SUFFIX})
42 set(IPP_PREFIX "ipp")
43 set(IPP_SUFFIX "_l")
44 set(IPPCORE    "core") # core functionality
45 set(IPPS       "s")    # signal processing
46 set(IPPI       "i")    # image processing
47 set(IPPCC      "cc")   # color conversion
48 set(IPPCV      "cv")   # computer vision
49 set(IPPVM      "vm")   # vector math
50
51 set(IPP_X64 0)
52 if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
53     set(IPP_X64 1)
54 endif()
55 if(CMAKE_CL_64)
56     set(IPP_X64 1)
57 endif()
58
59 # This function detects IPP version by analyzing ippversion.h file
60 macro(ipp_get_version _ROOT_DIR)
61   unset(_VERSION_STR)
62   unset(_MAJOR)
63   unset(_MINOR)
64   unset(_BUILD)
65
66   # read IPP version info from file
67   file(STRINGS ${_ROOT_DIR}/include/ippversion.h STR1 REGEX "IPP_VERSION_MAJOR")
68   file(STRINGS ${_ROOT_DIR}/include/ippversion.h STR2 REGEX "IPP_VERSION_MINOR")
69   file(STRINGS ${_ROOT_DIR}/include/ippversion.h STR3 REGEX "IPP_VERSION_BUILD")
70   if("${STR3}" STREQUAL "")
71     file(STRINGS ${_ROOT_DIR}/include/ippversion.h STR3 REGEX "IPP_VERSION_UPDATE")
72   endif()
73   file(STRINGS ${_ROOT_DIR}/include/ippversion.h STR4 REGEX "IPP_VERSION_STR")
74
75   # extract info and assign to variables
76   string(REGEX MATCHALL "[0-9]+" _MAJOR ${STR1})
77   string(REGEX MATCHALL "[0-9]+" _MINOR ${STR2})
78   string(REGEX MATCHALL "[0-9]+" _BUILD ${STR3})
79   string(REGEX MATCHALL "[0-9]+[.]+[0-9]+[^\"]+|[0-9]+[.]+[0-9]+" _VERSION_STR ${STR4})
80
81   # export info to parent scope
82   set(IPP_VERSION_STR   ${_VERSION_STR})
83   set(IPP_VERSION_MAJOR ${_MAJOR})
84   set(IPP_VERSION_MINOR ${_MINOR})
85   set(IPP_VERSION_BUILD ${_BUILD})
86
87   set(__msg)
88   if(EXISTS ${_ROOT_DIR}/include/ippicv.h)
89     ocv_assert(WITH_ICV AND NOT WITH_IPP)
90     set(__msg " ICV version")
91     set(HAVE_IPP_ICV_ONLY 1)
92   endif()
93
94   message(STATUS "found IPP: ${_MAJOR}.${_MINOR}.${_BUILD} [${_VERSION_STR}]${__msg}")
95   message(STATUS "at: ${_ROOT_DIR}")
96 endmacro()
97
98
99 # This function sets IPP_INCLUDE_DIRS and IPP_LIBRARIES variables
100 macro(ipp_set_variables _LATEST_VERSION)
101   if(${_LATEST_VERSION} VERSION_LESS "7.0")
102     message(SEND_ERROR "IPP ${_LATEST_VERSION} is not supported")
103     unset(HAVE_IPP)
104     return()
105   endif()
106
107   # set INCLUDE and LIB folders
108   set(IPP_INCLUDE_DIRS ${IPP_ROOT_DIR}/include)
109
110   if(NOT HAVE_IPP_ICV_ONLY)
111     if(APPLE)
112       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/lib)
113     elseif(IPP_X64)
114       if(NOT EXISTS ${IPP_ROOT_DIR}/lib/intel64)
115         message(SEND_ERROR "IPP EM64T libraries not found")
116       endif()
117       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/lib/intel64)
118     else()
119       if(NOT EXISTS ${IPP_ROOT_DIR}/lib/ia32)
120         message(SEND_ERROR "IPP IA32 libraries not found")
121       endif()
122       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/lib/ia32)
123     endif()
124   else()
125     if(APPLE)
126       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/libs/macosx)
127     elseif(WIN32 AND NOT ARM)
128       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/libs/windows)
129     elseif(UNIX)
130       set(IPP_LIBRARY_DIR ${IPP_ROOT_DIR}/libs/linux)
131     else()
132       message(MESSAGE "IPP ${_LATEST_VERSION} at ${IPP_ROOT_DIR} is not supported")
133       unset(HAVE_IPP)
134       return()
135     endif()
136     if(X86_64)
137       set(IPP_LIBRARY_DIR ${IPP_LIBRARY_DIR}/intel64)
138     else()
139       set(IPP_LIBRARY_DIR ${IPP_LIBRARY_DIR}/ia32)
140     endif()
141   endif()
142
143   set(IPP_PREFIX "ipp")
144   if(${_LATEST_VERSION} VERSION_LESS "8.0")
145     set(IPP_SUFFIX "_l")        # static not threaded libs suffix IPP 7.x
146   else()
147     if(WIN32)
148       set(IPP_SUFFIX "mt")    # static not threaded libs suffix IPP 8.x for Windows
149     else()
150       set(IPP_SUFFIX "")      # static not threaded libs suffix IPP 8.x for Linux/OS X
151     endif()
152   endif()
153   set(IPPCORE "core")     # core functionality
154   set(IPPSP   "s")        # signal processing
155   set(IPPIP   "i")        # image processing
156   set(IPPCC   "cc")       # color conversion
157   set(IPPCV   "cv")       # computer vision
158   set(IPPVM   "vm")       # vector math
159   set(IPPM    "m")        # matrix math
160
161   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
162   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
163   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
164   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPI}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
165   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPS}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
166   list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
167   if(NOT HAVE_IPP_ICV_ONLY)
168     list(APPEND IPP_LIBRARIES ${IPP_LIBRARY_DIR}/${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPM}${IPP_SUFFIX}${IPP_LIB_SUFFIX})
169   endif()
170
171 # FIXIT
172 #  if(UNIX AND NOT HAVE_IPP_ICV_ONLY)
173 #    get_filename_component(INTEL_COMPILER_LIBRARY_DIR ${IPP_ROOT_DIR}/../lib REALPATH)
174   if(UNIX)
175     if(NOT HAVE_IPP_ICV_ONLY)
176       get_filename_component(INTEL_COMPILER_LIBRARY_DIR ${IPP_ROOT_DIR}/../lib REALPATH)
177     else()
178       set(INTEL_COMPILER_LIBRARY_DIR "/opt/intel/lib")
179     endif()
180     if(IPP_X64)
181       if(NOT EXISTS ${INTEL_COMPILER_LIBRARY_DIR}/intel64)
182         message(SEND_ERROR "Intel compiler EM64T libraries not found")
183       endif()
184       if(NOT APPLE)
185         set(INTEL_COMPILER_LIBRARY_DIR ${INTEL_COMPILER_LIBRARY_DIR}/intel64)
186       endif()
187     else()
188       if(NOT EXISTS ${INTEL_COMPILER_LIBRARY_DIR}/ia32)
189         message(SEND_ERROR "Intel compiler IA32 libraries not found")
190       endif()
191       if (NOT APPLE)
192         set(INTEL_COMPILER_LIBRARY_DIR ${INTEL_COMPILER_LIBRARY_DIR}/ia32)
193       endif()
194     endif()
195     list(APPEND IPP_LIBRARIES ${INTEL_COMPILER_LIBRARY_DIR}/${IPP_LIB_PREFIX}irc${CMAKE_SHARED_LIBRARY_SUFFIX})
196     list(APPEND IPP_LIBRARIES ${INTEL_COMPILER_LIBRARY_DIR}/${IPP_LIB_PREFIX}imf${CMAKE_SHARED_LIBRARY_SUFFIX})
197     list(APPEND IPP_LIBRARIES ${INTEL_COMPILER_LIBRARY_DIR}/${IPP_LIB_PREFIX}svml${CMAKE_SHARED_LIBRARY_SUFFIX})
198   endif()
199
200   #message(STATUS "IPP libs: ${IPP_LIBRARIES}")
201 endmacro()
202
203 if(WITH_IPP)
204   set(IPPPATH $ENV{IPPROOT})
205   if(UNIX)
206     list(APPEND IPPPATH /opt/intel/ipp)
207   endif()
208 elseif(WITH_ICV)
209   if(DEFINED ENV{IPPICVROOT})
210     set(IPPPATH $ENV{IPPICVROOT})
211   else()
212     set(IPPPATH ${OpenCV_SOURCE_DIR}/3rdparty/ippicv)
213   endif()
214 endif()
215
216
217 find_path(
218     IPP_H_PATH
219     NAMES ippversion.h
220     PATHS ${IPPPATH}
221     PATH_SUFFIXES include
222     DOC "The path to Intel(R) IPP header files"
223     NO_DEFAULT_PATH
224     NO_CMAKE_PATH)
225
226 if(IPP_H_PATH)
227     set(HAVE_IPP 1)
228
229     get_filename_component(IPP_ROOT_DIR ${IPP_H_PATH} PATH)
230
231     ipp_get_version(${IPP_ROOT_DIR})
232     ipp_set_variables(${IPP_VERSION_STR})
233 endif()
234
235
236 if(WIN32 AND MINGW AND NOT IPP_VERSION_MAJOR LESS 7)
237     # Since IPP built with Microsoft compiler and /GS option
238     # ======================================================
239     # From Windows SDK 7.1
240     #   (usually in "C:\Program Files\Microsoft Visual Studio 10.0\VC\lib"),
241     # to avoid undefined reference to __security_cookie and _chkstk:
242     set(MSV_RUNTMCHK "RunTmChk")
243     set(IPP_LIBRARIES ${IPP_LIBRARIES} ${MSV_RUNTMCHK}${IPP_LIB_SUFFIX})
244
245     # To avoid undefined reference to _alldiv and _chkstk
246     # ===================================================
247     # NB: it may require a recompilation of w32api (after having modified
248     #     the file ntdll.def) to export the required functions
249     #     See http://code.opencv.org/issues/1906 for additional details
250     set(MSV_NTDLL    "ntdll")
251     set(IPP_LIBRARIES ${IPP_LIBRARIES} ${MSV_NTDLL}${IPP_LIB_SUFFIX})
252 endif()