Merge pull request #16122 from alalek:cmake_update_cpu_compiler_detection
[platform/upstream/opencv.git] / cmake / OpenCVFindIPPIW.cmake
1 #
2 # The script to detect Intel(R) Integrated Performance Primitives Integration Wrappers (IPP Integration Wrappers)
3 # installation/package
4 #
5 #
6 # On return this will define:
7 #
8 # HAVE_IPP_IW       - True if Intel IPP Integration Wrappers found
9 # HAVE_IPP_IW_LL    - True if Intel IPP Integration Wrappers found with Low Level API header
10 # IPP_IW_PATH       - Root of Intel IPP Integration Wrappers directory
11 # IPP_IW_LIBRARIES  - Intel IPP Integration Wrappers libraries
12 # IPP_IW_INCLUDES   - Intel IPP Integration Wrappers include folder
13 #
14
15 unset(HAVE_IPP_IW CACHE)
16 unset(HAVE_IPP_IW_LL CACHE)
17 unset(IPP_IW_PATH)
18 unset(IPP_IW_LIBRARIES)
19 unset(IPP_IW_INCLUDES)
20 unset(IW_CONFIG_DEBUG)
21 #set(IW_CONFIG_DEBUG 1)
22
23 if(NOT HAVE_IPP)
24   return()
25 endif()
26
27 macro(ippiw_debugmsg MESSAGE)
28   if(DEFINED IW_CONFIG_DEBUG)
29     message(STATUS "${MESSAGE}")
30   endif()
31 endmacro()
32
33 macro(ippiw_done)
34   foreach(__file ${IPP_IW_LICENSE_FILES})
35     if(EXISTS "${__file}")
36       ocv_install_3rdparty_licenses(ippiw "${__file}")
37     endif()
38   endforeach()
39   return()
40 endmacro()
41
42 file(TO_CMAKE_PATH "${IPPROOT}" IPPROOT)
43
44 # This function detects Intel IPP Integration Wrappers version by analyzing .h file
45 macro(ippiw_setup PATH BUILD)
46   set(FILE "${PATH}/include/iw/iw_version.h")
47   if(${BUILD})
48     ippiw_debugmsg("Checking sources: ${PATH}")
49   else()
50     ippiw_debugmsg("Checking binaries: ${PATH}")
51   endif()
52   if(EXISTS "${FILE}")
53     ippiw_debugmsg("vfile\tfound")
54     file(STRINGS "${FILE}" IW_VERSION_MAJOR  REGEX "IW_VERSION_MAJOR")
55     file(STRINGS "${FILE}" IW_VERSION_MINOR  REGEX "IW_VERSION_MINOR")
56     file(STRINGS "${FILE}" IW_VERSION_UPDATE REGEX "IW_VERSION_UPDATE")
57
58     file(STRINGS "${FILE}" IW_MIN_COMPATIBLE_IPP_MAJOR  REGEX "IW_MIN_COMPATIBLE_IPP_MAJOR")
59     file(STRINGS "${FILE}" IW_MIN_COMPATIBLE_IPP_MINOR  REGEX "IW_MIN_COMPATIBLE_IPP_MINOR")
60     file(STRINGS "${FILE}" IW_MIN_COMPATIBLE_IPP_UPDATE REGEX "IW_MIN_COMPATIBLE_IPP_UPDATE")
61
62     string(REGEX MATCH "[0-9]+" IW_MIN_COMPATIBLE_IPP_MAJOR  ${IW_MIN_COMPATIBLE_IPP_MAJOR})
63     string(REGEX MATCH "[0-9]+" IW_MIN_COMPATIBLE_IPP_MINOR  ${IW_MIN_COMPATIBLE_IPP_MINOR})
64     string(REGEX MATCH "[0-9]+" IW_MIN_COMPATIBLE_IPP_UPDATE ${IW_MIN_COMPATIBLE_IPP_UPDATE})
65
66     string(REGEX MATCH "[0-9]+" IW_VERSION_MAJOR  ${IW_VERSION_MAJOR})
67     string(REGEX MATCH "[0-9]+" IW_VERSION_MINOR  ${IW_VERSION_MINOR})
68     string(REGEX MATCH "[0-9]+" IW_VERSION_UPDATE ${IW_VERSION_UPDATE})
69
70     math(EXPR IPP_VERSION_EXP           "${IPP_VERSION_MAJOR}*10000 + ${IPP_VERSION_MINOR}*100 + ${IPP_VERSION_BUILD}")
71     math(EXPR IW_MIN_COMPATIBLE_IPP_EXP "${IW_MIN_COMPATIBLE_IPP_MAJOR}*10000 + ${IW_MIN_COMPATIBLE_IPP_MINOR}*100 + ${IW_MIN_COMPATIBLE_IPP_UPDATE}")
72
73     if((IPP_VERSION_EXP GREATER IW_MIN_COMPATIBLE_IPP_EXP) OR (IPP_VERSION_EXP EQUAL IW_MIN_COMPATIBLE_IPP_EXP))
74       ippiw_debugmsg("vcheck\tpassed")
75       if(${BUILD})
76         # check sources
77         if(EXISTS "${PATH}/src/iw_core.c")
78           ippiw_debugmsg("sources\tyes")
79           set(IPP_IW_PATH "${PATH}")
80           message(STATUS "found Intel IPP Integration Wrappers sources: ${IW_VERSION_MAJOR}.${IW_VERSION_MINOR}.${IW_VERSION_UPDATE}")
81           message(STATUS "at: ${IPP_IW_PATH}")
82
83           set(IPP_IW_LIBRARY ippiw)
84           set(IPP_IW_INCLUDES "${IPP_IW_PATH}/include")
85           set(IPP_IW_LIBRARIES ${IPP_IW_LIBRARY})
86           execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OpenCV_SOURCE_DIR}/3rdparty/ippicv/CMakeLists.txt" "${IPP_IW_PATH}/")
87           add_subdirectory("${IPP_IW_PATH}/" ${OpenCV_BINARY_DIR}/3rdparty/ippiw)
88
89           set(HAVE_IPP_IW 1)
90           set(FILE "${PATH}/include/iw/iw_ll.h") # check if Intel IPP Integration Wrappers is OpenCV specific
91           if(EXISTS "${FILE}")
92             set(HAVE_IPP_IW_LL 1)
93           endif()
94           ippiw_done()
95         else()
96           ippiw_debugmsg("sources\tno")
97         endif()
98       else()
99         # check binaries
100         if(IPP_X64)
101           set(FILE "${PATH}/lib/intel64/${CMAKE_STATIC_LIBRARY_PREFIX}ipp_iw${CMAKE_STATIC_LIBRARY_SUFFIX}")
102         else()
103           set(FILE "${PATH}/lib/ia32/${CMAKE_STATIC_LIBRARY_PREFIX}ipp_iw${CMAKE_STATIC_LIBRARY_SUFFIX}")
104         endif()
105         if(EXISTS ${FILE})
106           ippiw_debugmsg("binaries\tyes (64=${IPP_X64})")
107           set(IPP_IW_PATH "${PATH}")
108           message(STATUS "found Intel IPP Integration Wrappers binaries: ${IW_VERSION_MAJOR}.${IW_VERSION_MINOR}.${IW_VERSION_UPDATE}")
109           message(STATUS "at: ${IPP_IW_PATH}")
110
111           add_library(ippiw STATIC IMPORTED)
112           set_target_properties(ippiw PROPERTIES
113             IMPORTED_LINK_INTERFACE_LIBRARIES ""
114             IMPORTED_LOCATION "${FILE}"
115           )
116           if (NOT BUILD_SHARED_LIBS)
117             # CMake doesn't support "install(TARGETS ${name} ...)" command with imported targets
118             install(FILES "${FILE}"
119                     DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
120             set(IPPIW_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_3P_LIB_INSTALL_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}ipp_iw${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE INTERNAL "" FORCE)
121             set(IPPIW_LOCATION_PATH "${FILE}" CACHE INTERNAL "" FORCE)
122           endif()
123
124           set(IPP_IW_INCLUDES "${IPP_IW_PATH}/include")
125           set(IPP_IW_LIBRARIES ippiw)
126
127           set(HAVE_IPP_IW 1)
128           set(BUILD_IPP_IW 0)
129           set(FILE "${PATH}/include/iw/iw_ll.h") # check if Intel IPP Integration Wrappers is OpenCV specific
130           if(EXISTS "${FILE}")
131             set(HAVE_IPP_IW_LL 1)
132           endif()
133           ippiw_done()
134         else()
135           ippiw_debugmsg("binaries\tno")
136         endif()
137       endif()
138     else()
139       ippiw_debugmsg("vcheck\tfailed")
140     endif()
141   else()
142     ippiw_debugmsg("vfile\tnot found")
143   endif()
144   set(HAVE_IPP_IW 0)
145   set(HAVE_IPP_IW_LL 0)
146 endmacro()
147
148 # check build options first
149 if(BUILD_IPP_IW)
150   # custom path
151   if(DEFINED IPPIWROOT)
152     ippiw_setup("${IPPIWROOT}/" 1)
153     message(STATUS "Can't find Intel IPP Integration Wrappers sources at: ${IPPIWROOT}")
154   endif()
155
156   # local sources
157   ippiw_setup("${OpenCV_SOURCE_DIR}/3rdparty/ippiw" 1)
158
159   set(IPPIW_ROOT "${IPPROOT}/../iw")
160   set(IPP_IW_LICENSE_FILES ${IPP_IW_LICENSE_FILES_EXTRA}
161       "${IPPIW_ROOT}/../support.txt"
162       "${IPPIW_ROOT}/../third-party-programs.txt"
163       "${IPPIW_ROOT}/../EULA.rtf"
164       "${IPPIW_ROOT}/../EULA.txt"
165   )
166
167   # Package sources
168   get_filename_component(__PATH "${IPPROOT}/../iw/" ABSOLUTE)
169   ippiw_setup("${__PATH}" 1)
170
171   # take Intel IPP Integration Wrappers from ICV package
172   if(NOT HAVE_IPP_ICV)
173     message(STATUS "Cannot find Intel IPP Integration Wrappers. Checking \"Intel IPP for OpenCV\" package")
174     set(TEMP_ROOT 0)
175     include("${OpenCV_SOURCE_DIR}/3rdparty/ippicv/ippicv.cmake")
176     download_ippicv(TEMP_ROOT)
177     set(IPPIW_ROOT "${TEMP_ROOT}/iw/")
178     set(IPP_IW_LICENSE_FILES ${IPP_IW_LICENSE_FILES_EXTRA}
179         "${IPPIW_ROOT}/../EULA.txt"
180         "${IPPIW_ROOT}/../support.txt"
181         "${IPPIW_ROOT}/../third-party-programs.txt"
182     )
183
184     ippiw_setup("${IPPIW_ROOT}" 1)
185   endif()
186 endif()
187
188
189 # custom binaries
190 if(DEFINED IPPIWROOT)
191   ippiw_setup("${IPPIWROOT}/" 0)
192   message(STATUS "Can't find Intel IPP Integration Wrappers binaries at: ${IPPIWROOT}")
193 endif()
194
195 # check binaries in IPP folder
196 ippiw_setup("${IPPROOT}/" 0)
197
198 # check binaries near IPP folder
199 ippiw_setup("${IPPROOT}/../iw/" 0)
200
201
202 set(HAVE_IPP_IW 0)
203 set(HAVE_IPP_IW_LL 0)
204 message(STATUS "Cannot find Intel IPP Integration Wrappers, optimizations will be limited. Use IPPIWROOT to set custom location")
205 return()