Fixed some cmake 2.6 compatibility issues.
[profile/ivi/opencv.git] / CMakeLists.txt
1 # ----------------------------------------------------------------------------
2 #  Root CMake file for OpenCV
3 #
4 #    From the off-tree build directory, invoke:
5 #      $ cmake <PATH_TO_OPENCV_ROOT>
6 #
7 #
8 #   - OCT-2008: Initial version <joseluisblancoc@gmail.com>
9 #
10 # ----------------------------------------------------------------------------
11
12 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
13
14 # Following block can broke build in case of cross-compilng
15 # but CMAKE_CROSSCOMPILING variable will be set only on project(OpenCV) command
16 # so we will try to detect crosscompiling by presense of CMAKE_TOOLCHAIN_FILE
17 if(NOT CMAKE_TOOLCHAIN_FILE)
18     # Add these standard paths to the search paths for FIND_LIBRARY
19     # to find libraries from these locations first
20     if(UNIX)
21         set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /lib /usr/lib)
22     endif()
23
24     # it _must_ go before PROJECT(OpenCV) in order to work
25     if(WIN32)
26         set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory")
27     else()
28         set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory")
29     endif()
30
31     if(MSVC)
32         set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE)
33     endif()
34 endif(NOT CMAKE_TOOLCHAIN_FILE)
35
36 # --------------------------------------------------------------
37 # Top level OpenCV project
38 # --------------------------------------------------------------
39 if(NOT IOS)
40         cmake_minimum_required(VERSION 2.6.3)
41 else()
42         cmake_minimum_required(VERSION 2.8)
43 endif()
44 project(OpenCV)
45
46 set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
47 if(DEFINED CMAKE_BUILD_TYPE AND CMAKE_VERSION VERSION_GREATER "2.8")
48     set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
49 endif()
50
51 set(CMAKE_C_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
52 set(CMAKE_C_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
53 set(CMAKE_CXX_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
54 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
55 set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
56 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
57 set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
58 set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
59 set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
60 set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
61 set(CMAKE_VERBOSE OFF CACHE BOOL "Verbose mode")
62 if(CMAKE_VERBOSE)
63     set(CMAKE_VERBOSE_MAKEFILE 1)
64 endif()
65
66 # --------------------------------------------------------------
67 # Indicate CMake 2.7 and above that we don't want to mix relative
68 #  and absolute paths in linker lib lists.
69 # Run "cmake --help-policy CMP0003" for more information.
70 # --------------------------------------------------------------
71 if(COMMAND cmake_policy)
72     cmake_policy(SET CMP0003 NEW)
73 endif()
74
75 # ----------------------------------------------------------------------------
76 # Build static or dynamic libs?
77 # Default: dynamic libraries
78 # ----------------------------------------------------------------------------
79 if(NOT IOS)
80         set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)")
81 else()
82         set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)")
83 endif()
84 # ----------------------------------------------------------------------------
85 # Include debug info into debug libs?
86 # Default: yes
87 # ----------------------------------------------------------------------------
88 set(BUILD_WITH_DEBUG_INFO ON CACHE BOOL "Include debug info into debug libs")
89
90 # ----------------------------------------------------------------------------
91 #  Get actual OpenCV version number from sources
92 # ----------------------------------------------------------------------------
93 SET(OPENCV_VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/modules/core/include/opencv2/core/version.hpp")
94 FILE(STRINGS "${OPENCV_VERSION_FILE}" OPENCV_VERSION_PARTS REGEX "#define CV_.+OR_VERSION[ ]+[0-9]+" )
95 string(REGEX REPLACE ".+CV_MAJOR_VERSION[ ]+([0-9]+).*" "\\1" OPENCV_VERSION_MAJOR "${OPENCV_VERSION_PARTS}")
96 string(REGEX REPLACE ".+CV_MINOR_VERSION[ ]+([0-9]+).*" "\\1" OPENCV_VERSION_MINOR "${OPENCV_VERSION_PARTS}")
97 string(REGEX REPLACE ".+CV_SUBMINOR_VERSION[ ]+([0-9]+).*" "\\1" OPENCV_VERSION_PATCH "${OPENCV_VERSION_PARTS}")
98 set(OPENCV_VERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}")
99
100 set(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}")
101
102 # create a dependency on version file
103 # we will never use output of the following command but cmake will rerun if version file changes
104 configure_file("${OPENCV_VERSION_FILE}" "${CMAKE_BINARY_DIR}/junk/version.junk" COPYONLY)
105
106 if(WIN32)
107     # Postfix of DLLs:
108     set(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}")
109     set(OPENCV_DEBUG_POSTFIX d)
110 else()
111     # Postfix of so's:
112     set(OPENCV_DLLVERSION "")
113     set(OPENCV_DEBUG_POSTFIX)
114 endif()
115
116 #name mangling
117 set(OPENCV_INCLUDE_PREFIX include)
118 if(UNIX AND NOT ANDROID AND BUILD_SHARED_LIBS)
119     option(OPENCV_MANGLED_INSTALL_PATHS "Enables mangled install paths, that help with side by side installs." False)
120     if(OPENCV_MANGLED_INSTALL_PATHS)
121       set(OPENCV_INCLUDE_PREFIX include/opencv-${OPENCV_VERSION})
122     endif()
123 endif()
124
125 # SUBDIRECTORIES:
126 # Save libs and executables in the same place
127 set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Output directory for libraries" )
128 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Output directory for applications" )
129
130 if(ANDROID OR WIN32)
131     set(OPENCV_DOC_INSTALL_PATH doc)
132 elseif(OPENCV_MANGLED_INSTALL_PATHS)
133     set(OPENCV_DOC_INSTALL_PATH share/OpenCV-${OPENCV_VERSION}/doc)
134 else()
135     set(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc)
136 endif()
137
138 if(ANDROID)
139     set(OPENCV_LIB_INSTALL_PATH libs/${ARMEABI_NDK_NAME})
140 else()
141     set(OPENCV_LIB_INSTALL_PATH lib${LIB_SUFFIX})
142 endif()
143
144 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}")
145 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
146
147 # search packages for host system instead of packages for target system
148 # in case of cross compilation thess macro should be defined by toolchain file
149 if(NOT COMMAND find_host_package)
150     macro(find_host_package)
151         find_package(${ARGN})
152     endmacro()
153 endif()
154 if(NOT COMMAND find_host_program)
155     macro(find_host_program)
156         find_program(${ARGN})
157     endmacro()
158 endif()
159
160 # ----------------------------------------------------------------------------
161 # Use statically or dynamically linked CRT?
162 # Default: dynamic
163 # ----------------------------------------------------------------------------
164 if(WIN32 AND NOT BUILD_SHARED_LIBS)
165   option (BUILD_WITH_STATIC_CRT "Enables use of staticaly linked CRT" ON)
166 endif()
167   
168 if(MSVC)
169     if(BUILD_WITH_STATIC_CRT)
170         foreach(flag_var
171                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
172                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
173                 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
174                 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
175            if(${flag_var} MATCHES "/MD")
176               string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
177            endif()
178            if(${flag_var} MATCHES "/MDd")
179               string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
180            endif()
181         endforeach(flag_var)
182         
183         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:msvcrtd.lib")
184         set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib")
185         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:libcmtd.lib")
186     else(BUILD_WITH_STATIC_CRT)
187         foreach(flag_var
188                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
189                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
190                 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
191                 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
192            if(${flag_var} MATCHES "/MT")
193               string(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
194            endif()
195            if(${flag_var} MATCHES "/MTd")
196               string(REGEX REPLACE "/MTd" "/MDd" ${flag_var} "${${flag_var}}")
197            endif()
198         endforeach(flag_var)
199     endif(BUILD_WITH_STATIC_CRT)
200
201     if(NOT BUILD_WITH_DEBUG_INFO)
202         string(REPLACE "/debug" "" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
203         string(REPLACE "/DEBUG" "" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
204         string(REPLACE "/INCREMENTAL:YES" "/INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
205         string(REPLACE "/INCREMENTAL " "/INCREMENTAL:NO " CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
206
207         string(REPLACE "/debug" "" CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG}")
208         string(REPLACE "/DEBUG" "" CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG}")
209         string(REPLACE "/INCREMENTAL:YES" "/INCREMENTAL:NO" CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG}")
210         string(REPLACE "/INCREMENTAL " "/INCREMENTAL:NO " CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG}")
211
212         string(REPLACE "/debug" "" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
213         string(REPLACE "/DEBUG" "" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
214         string(REPLACE "/INCREMENTAL:YES" "/INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
215         string(REPLACE "/INCREMENTAL " "/INCREMENTAL:NO " CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
216
217         string(REPLACE "/Zi" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
218         string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
219     endif()
220
221 endif(MSVC)
222
223 # ----------------------------------------------------------------------------
224 #  Variables for cvconfig.h.cmake
225 # ----------------------------------------------------------------------------
226 set(PACKAGE "opencv")
227 set(PACKAGE_BUGREPORT "opencvlibrary-devel@lists.sourceforge.net")
228 set(PACKAGE_NAME "opencv")
229 set(PACKAGE_STRING "${PACKAGE} ${OPENCV_VERSION}")
230 set(PACKAGE_TARNAME "${PACKAGE}")
231 set(PACKAGE_VERSION "${OPENCV_VERSION}")
232
233 # ----------------------------------------------------------------------------
234 #  Autodetect if we are in a SVN repository
235 # ----------------------------------------------------------------------------
236 find_host_program(SVNVERSION_PATH svnversion)
237 mark_as_advanced(force SVNVERSION_PATH)
238 if(SVNVERSION_PATH)
239     message(STATUS "Extracting svn version, please wait...")
240     execute_process(COMMAND ${SVNVERSION_PATH} -n ${OpenCV_SOURCE_DIR} OUTPUT_VARIABLE SVNVERSION_RESULT)
241
242     if(SVNVERSION_RESULT MATCHES "exported")
243         # This is NOT a svn repository:
244         set(OPENCV_SVNVERSION "")
245         message(STATUS "SVNVERSION: exported")
246     else()
247         set(OPENCV_SVNVERSION " svn:${SVNVERSION_RESULT}")
248         message(STATUS "SVNVERSION: ${OPENCV_SVNVERSION}")
249     endif()
250 else()
251     # We don't have svnversion:
252     set(OPENCV_SVNVERSION "")
253 endif()
254
255 # ----------------------------------------------------------------------------
256 # Detect Microsoft compiler:
257 # ----------------------------------------------------------------------------
258 if(CMAKE_CL_64)
259     set(MSVC64 1)
260 endif()
261
262 # ----------------------------------------------------------------------------
263 # Detect GNU version:
264 # ----------------------------------------------------------------------------
265 if(CMAKE_COMPILER_IS_GNUCXX)
266     execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
267                   OUTPUT_VARIABLE CMAKE_OPENCV_GCC_VERSION_FULL
268                   OUTPUT_STRIP_TRAILING_WHITESPACE)
269     
270     execute_process(COMMAND ${CMAKE_CXX_COMPILER} -v
271                   ERROR_VARIABLE CMAKE_OPENCV_GCC_INFO_FULL
272                   OUTPUT_STRIP_TRAILING_WHITESPACE)           
273         
274     # Typical output in CMAKE_OPENCV_GCC_VERSION_FULL: "c+//0 (whatever) 4.2.3 (...)"
275     # Look for the version number
276     string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
277
278     # Split the three parts:
279     string(REGEX MATCHALL "[0-9]+" CMAKE_OPENCV_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}")
280
281     list(GET CMAKE_OPENCV_GCC_VERSIONS 0 CMAKE_OPENCV_GCC_VERSION_MAJOR)
282     list(GET CMAKE_OPENCV_GCC_VERSIONS 1 CMAKE_OPENCV_GCC_VERSION_MINOR)
283
284     set(CMAKE_OPENCV_GCC_VERSION ${CMAKE_OPENCV_GCC_VERSION_MAJOR}${CMAKE_OPENCV_GCC_VERSION_MINOR})
285     math(EXPR CMAKE_OPENCV_GCC_VERSION_NUM "${CMAKE_OPENCV_GCC_VERSION_MAJOR}*100 + ${CMAKE_OPENCV_GCC_VERSION_MINOR}")
286     message(STATUS "Detected version of GNU GCC: ${CMAKE_OPENCV_GCC_VERSION} (${CMAKE_OPENCV_GCC_VERSION_NUM})")
287
288     if(WIN32)
289         execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
290                   OUTPUT_VARIABLE CMAKE_OPENCV_GCC_TARGET_MACHINE
291                   OUTPUT_STRIP_TRAILING_WHITESPACE)
292         if(CMAKE_OPENCV_GCC_TARGET_MACHINE MATCHES "64")
293             set(MINGW64 1)
294         endif()
295     endif()
296 endif()
297
298 # ----------------------------------------------------------------------------
299 # Detect Intel ICC compiler -- for -fPIC in 3rdparty ( UNIX ONLY ):
300 #  see  include/opencv/cxtypes.h file for related   ICC & CV_ICC defines.
301 # NOTE: The system needs to determine if the '-fPIC' option needs to be added
302 #  for the 3rdparty static libs being compiled.  The CMakeLists.txt files
303 #  in 3rdparty use the CV_ICC definition being set here to determine if
304 #  the -fPIC flag should be used.
305 # ----------------------------------------------------------------------------
306 if(UNIX)
307     if  (__ICL)
308         set(CV_ICC   __ICL)
309     elseif(__ICC)
310         set(CV_ICC   __ICC)
311     elseif(__ECL)
312         set(CV_ICC   __ECL)
313     elseif(__ECC)
314         set(CV_ICC   __ECC)
315     elseif(__INTEL_COMPILER)
316         set(CV_ICC   __INTEL_COMPILER)
317     elseif(CMAKE_C_COMPILER MATCHES "icc")
318         set(CV_ICC   icc_matches_c_compiler)
319     endif()
320 endif()
321
322 # ----------------------------------------------------------------------------
323 #       CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
324 # ----------------------------------------------------------------------------
325
326 # Build/install (or not) some apps:
327 # ===================================================
328 set(BUILD_EXAMPLES OFF CACHE BOOL "Build all examples")
329 set(INSTALL_C_EXAMPLES OFF CACHE BOOL "Install C examples")
330 set(INSTALL_PYTHON_EXAMPLES OFF CACHE BOOL "Install Python examples")
331 if(ANDROID)
332     set(INSTALL_ANDROID_EXAMPLES OFF CACHE BOOL "Install Android examples")
333 endif()
334
335 # Build tests:
336 # ===================================================
337 if(NOT IOS)
338         set(BUILD_TESTS ON CACHE BOOL "Build tests")
339 else()
340         set(BUILD_TESTS OFF CACHE BOOL "Build tests")
341 endif()
342 set(BUILD_PERF_TESTS ON CACHE BOOL "Build performance tests")
343
344 # Build 3rdparty libraries under unix
345 # ===================================================
346 if(WIN32)
347     set(OPENCV_BUILD_3RDPARTY_LIBS TRUE  CACHE BOOL "Build 3rd party libraries")
348 else()
349     set(OPENCV_BUILD_3RDPARTY_LIBS FALSE CACHE BOOL "Build 3rd party libraries")
350 endif()
351
352 if(NOT IOS)
353 include(OpenCVPCHSupport.cmake REQUIRED)
354 endif()
355
356 include(OpenCVModule.cmake REQUIRED)
357 if(ANDROID)
358     include(OpenCVAndroidProject.cmake REQUIRED)
359 endif()
360
361 if(PCHSupport_FOUND)
362     SET(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Use precompiled headers")
363 else()
364     SET(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Use precompiled headers" FORCE)
365 endif()
366
367 if(UNIX)
368     include(OpenCVFindPkgConfig.cmake OPTIONAL)
369     include(CheckFunctionExists)
370     include(CheckIncludeFile)
371 endif()
372
373 if(CMAKE_COMPILER_IS_GNUCXX)
374     set(ENABLE_PROFILING OFF CACHE BOOL "Enable profiling in the GCC compiler (Add flags: -g -pg)")
375     set(USE_OMIT_FRAME_POINTER ON CACHE BOOL "Enable -fomit-frame-pointer for GCC")
376
377     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64.*|x86_64.*)
378         set(X86_64 1)
379     endif()
380     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686.*|i386.*|x86.*)
381         set(X86 1)
382     endif()
383     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES powerpc.*)
384         set(ENABLE_POWERPC ON CACHE BOOL "Enable PowerPC for GCC")
385     endif ()
386
387     if(X86 OR X86_64)
388         # enable everything, since the available set of instructions is checked at runtime
389         #IF ("${CMAKE_GCC_REGEX_VERSION}" VERSION_GREATER 4.5)
390             SET(_USE_FAST_MATH OFF)
391         #ELSE()
392         #    SET(_USE_FAST_MATH ON)
393         #ENDIF()
394         set(USE_FAST_MATH ${_USE_FAST_MATH} CACHE BOOL "Enable -ffast-math (not recommended for GCC 4.6.x)")
395         set(ENABLE_SSE ON CACHE BOOL "Enable SSE instructions")
396         set(ENABLE_SSE2 ON CACHE BOOL "Enable SSE2 instructions")
397         set(ENABLE_SSE3 OFF CACHE BOOL "Enable SSE3 instructions")
398         set(ENABLE_SSSE3 OFF CACHE BOOL "Enable SSSE3 instructions")
399         set(ENABLE_SSE41 OFF CACHE BOOL "Enable SSE4.1 instructions")
400         set(ENABLE_SSE42 OFF CACHE BOOL "Enable SSE4.2 instructions")
401     endif()
402 endif()
403
404 if(MSVC)
405     set(ENABLE_SSE ON CACHE BOOL "Enable SSE instructions for MSVC")
406     set(ENABLE_SSE2 ON CACHE BOOL "Enable SSE2 instructions for MSVC")
407     if(CMAKE_C_COMPILER MATCHES "icc")
408         set(ENABLE_SSE3 OFF CACHE BOOL "Enable SSE3 instructions for ICC")
409         set(ENABLE_SSE4_1 OFF CACHE BOOL "Enable SSE4.1 instructions for ICC")
410     endif()
411 endif()
412
413 # allow fine grained control over which libraries not to link, even if
414 # they are available on the system
415 # ====================================================================
416 if(NOT IOS)
417 set(WITH_PNG ON CACHE BOOL "Include PNG support")
418 set(WITH_JPEG ON CACHE BOOL "Include JPEG support")
419 set(WITH_JASPER ON CACHE BOOL "Include JPEG2K support")
420 set(WITH_TIFF ON CACHE BOOL "Include TIFF support")
421 set(WITH_OPENEXR ON CACHE BOOL "Include ILM support via OpenEXR")
422
423
424 if(UNIX)
425     set(WITH_FFMPEG ON CACHE BOOL "Include FFMPEG support")
426     if(NOT APPLE)
427         set(WITH_UNICAP OFF CACHE BOOL "Include Unicap support (GPL)")
428         set(WITH_GTK ON CACHE BOOL "Include GTK support")
429         set(WITH_GSTREAMER ON CACHE BOOL "Include Gstreamer support")
430         set(WITH_V4L ON CACHE BOOL "Include Video 4 Linux support")
431         set(WITH_XINE OFF CACHE BOOL "Include Xine support (GPL)")
432     endif()
433     set(WITH_PVAPI ON CACHE BOOL "Include Prosilica GigE support")
434     set(WITH_1394 ON CACHE BOOL "Include IEEE1394 support")
435 endif()
436
437 endif()
438
439 if(APPLE)
440     set(WITH_CARBON OFF CACHE BOOL "Use Carbon for UI instead of Cocoa")
441     set(WITH_QUICKTIME OFF CACHE BOOL "Use QuickTime for Video I/O insted of QTKit")
442 endif()
443
444 if(IOS)
445         set(WITH_AVFOUNDATION ON CACHE BOOL "Use AVFoundation for Video I/O")
446 endif()
447
448 set(WITH_TBB OFF CACHE BOOL "Include Intel TBB support")
449 set(WITH_IPP OFF CACHE BOOL "Include Intel IPP support")
450 set(WITH_EIGEN ON CACHE BOOL "Include Eigen2/Eigen3 support")
451
452 if( CMAKE_VERSION VERSION_GREATER "2.8")
453     set(WITH_CUDA ON CACHE BOOL "Include NVidia Cuda Runtime support")
454 else()
455     set(WITH_CUDA OFF CACHE BOOL "Include NVidia Cuda Runtime support")
456 endif()
457
458 set(WITH_OPENNI OFF CACHE BOOL "Include OpenNI support")
459 set(WITH_XIMEA OFF CACHE BOOL "Include XIMEA cameras support")
460
461 # ===================================================
462 # Macros that checks if module have been installed.
463 # After it adds module to build and define
464 # constants passed as second arg
465 # ===================================================
466
467 macro(CHECK_MODULE module_name define)
468     set(${define} 0)
469     if(PKG_CONFIG_FOUND)
470         set(ALIAS               ALIASOF_${module_name})
471         set(ALIAS_FOUND                 ${ALIAS}_FOUND)
472         set(ALIAS_INCLUDE_DIRS   ${ALIAS}_INCLUDE_DIRS)
473         set(ALIAS_LIBRARY_DIRS   ${ALIAS}_LIBRARY_DIRS)
474         set(ALIAS_LIBRARIES         ${ALIAS}_LIBRARIES)
475
476         PKG_CHECK_MODULES(${ALIAS} ${module_name})
477
478         if (${ALIAS_FOUND})
479             set(${define} 1)
480             foreach(P "${ALIAS_INCLUDE_DIRS}")
481                 if (${P})
482                     list(APPEND HIGHGUI_INCLUDE_DIRS ${${P}})
483                 endif()
484             endforeach()
485
486             foreach(P "${ALIAS_LIBRARY_DIRS}")
487                 if (${P})
488                     list(APPEND HIGHGUI_LIBRARY_DIRS ${${P}})
489                 endif()
490             endforeach()
491
492             list(APPEND HIGHGUI_LIBRARIES ${${ALIAS_LIBRARIES}})
493         endif()
494     endif()
495 endmacro()
496
497 if(UNIX)
498     if(NOT APPLE)
499       if(WITH_GTK)
500         CHECK_MODULE(gtk+-2.0 HAVE_GTK)
501         CHECK_MODULE(gthread-2.0 HAVE_GTHREAD)
502       else()
503         set(HAVE_GTK FALSE)
504         set(HAVE_GTHREAD FALSE)
505       endif()
506       if(WITH_GSTREAMER)
507         CHECK_MODULE(gstreamer-base-0.10 HAVE_GSTREAMER)
508         CHECK_MODULE(gstreamer-app-0.10 HAVE_GSTREAMER)
509         CHECK_MODULE(gstreamer-video-0.10 HAVE_GSTREAMER)
510       else()
511         set(HAVE_GSTREAMER FALSE)
512       endif()
513     endif()
514
515     if(WITH_UNICAP)
516       CHECK_MODULE(libunicap HAVE_UNICAP_)
517       CHECK_MODULE(libucil HAVE_UNICAP_UCIL)
518       if(HAVE_UNICAP_ AND HAVE_UNICAP_UCIL)
519         set(HAVE_UNICAP 1)
520       endif()
521     else()
522       set(HAVE_UNICAP FALSE)
523     endif()
524
525     if(WITH_PVAPI)
526       find_path(PVAPI_INCLUDE_PATH "PvApi.h"
527                 PATHS "/usr/local/include" "/usr/include"
528                 DOC "The path to PvAPI header")
529       if(PVAPI_INCLUDE_PATH)
530         set(HAVE_PVAPI 1)
531       endif()
532     endif()
533
534     set(HAVE_FFMPEG 0)
535     if(WITH_FFMPEG)
536       CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
537       CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT)
538       CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL)
539       CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE)
540       CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG)
541       CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG)
542       if(NOT HAVE_GENTOO_FFMPEG AND NOT HAVE_FFMPEG_FFMPEG)
543         if(EXISTS /usr/include/ffmpeg/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE)
544           set(HAVE_GENTOO_FFMPEG 1)
545         endif()
546       endif()
547       if(HAVE_FFMPEG_CODEC AND HAVE_FFMPEG_FORMAT AND HAVE_FFMPEG_UTIL)
548         if(HAVE_FFMPEG_SWSCALE OR NOT HAVE_GENTOO_FFMPEG)
549             set(HAVE_FFMPEG 1)
550         endif()
551       endif()
552       # Find the bzip2 library because it is required on some systems
553       FIND_LIBRARY(BZIP2_LIBRARIES NAMES bz2 bzip2)
554       if(NOT BZIP2_LIBRARIES)
555         # Do an other trial
556         FIND_FILE(BZIP2_LIBRARIES NAMES libbz2.so.1 PATHS /lib)
557       endif()
558     endif()
559
560     if(WITH_1394)
561       CHECK_MODULE(libdc1394-2 HAVE_DC1394_2)
562       if(NOT HAVE_DC1394_2)
563         CHECK_MODULE(libdc1394 HAVE_DC1394)
564       endif()
565     else()
566       set(HAVE_DC1394_2 FALSE)
567       set(HAVE_DC1394 FALSE)
568     endif()
569
570     if(NOT OPENCV_BUILD_3RDPARTY_LIBS)
571         include(FindZLIB)
572         if(WITH_PNG)
573             include(FindPNG)
574             if(PNG_FOUND)
575                 CHECK_INCLUDE_FILE(${PNG_PNG_INCLUDE_DIR}/png.h HAVE_PNG_H)
576                 CHECK_INCLUDE_FILE(${PNG_PNG_INCLUDE_DIR}/libpng/png.h HAVE_LIBPNG_PNG_H)
577             endif()
578         else()
579             set(PNG_FOUND FALSE)
580         endif()
581         if(WITH_TIFF)
582             include(FindTIFF)
583         else()
584             set(TIFF_FOUND FALSE)
585         endif()
586         if(WITH_JASPER)
587             include(FindJasper)
588         else()
589             set(JASPER_FOUND FALSE)
590         endif()
591         if(WITH_JPEG)
592             include(FindJPEG)
593         else()
594             set(JPEG_FOUND FALSE)
595         endif()
596     endif()
597
598     if(NOT APPLE)
599         CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
600         CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
601         CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
602         CHECK_INCLUDE_FILE(pthread.h HAVE_LIBPTHREAD)
603
604         if(WITH_XINE)
605             CHECK_MODULE(libxine HAVE_XINE)
606         else()
607             set(HAVE_XINE FALSE)
608         endif()
609         if(WITH_V4L)
610             CHECK_MODULE(libv4l1 HAVE_LIBV4L)
611             CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
612             CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
613         else()
614             set(HAVE_LIBV4L FALSE)
615             set(HAVE_CAMV4L FALSE)
616             set(HAVE_CAMV4L2 FALSE)
617         endif()
618
619         if(ANDROID)
620             set(OPENCV_LINKER_LIBS dl m log)
621         elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
622             set(OPENCV_LINKER_LIBS m pthread)
623         else()
624             set(OPENCV_LINKER_LIBS dl m pthread rt)
625         endif()
626     else()
627         add_definitions(-DHAVE_ALLOCA -DHAVE_ALLOCA_H -DHAVE_LIBPTHREAD -DHAVE_UNISTD_H)
628     endif()
629 endif()
630
631 if(WITH_PNG AND NOT PNG_FOUND)
632     set(PNG_LIBRARIES libpng)
633 endif()
634
635 if(WITH_JPEG AND NOT JPEG_FOUND)
636     set(JPEG_LIBRARIES libjpeg)
637 endif()
638
639 if(WITH_TIFF AND NOT TIFF_FOUND)
640     set(TIFF_LIBRARIES libtiff)
641 endif()
642
643 if(WITH_JASPER AND NOT JASPER_FOUND)
644     set(JASPER_LIBRARIES libjasper)
645 endif()
646
647 if(NOT ZLIB_FOUND)
648     set(ZLIB_LIBRARY zlib)
649 endif()
650
651 #message(STATUS "Graphic libraries: ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${TIFF_LIBRARIES} ${JASPER_LIBRARIES}")
652
653 if(WITH_OPENEXR)
654     include(OpenCVFindOpenEXR.cmake)
655 endif()
656
657 set(BUILD_DOCS ON CACHE BOOL "Build OpenCV Documentation")
658
659 if(BUILD_DOCS)
660   include(OpenCVFindLATEX.cmake REQUIRED)
661 endif()
662
663 set(BUILD_NEW_PYTHON_SUPPORT ON CACHE BOOL "Build with Python support")
664
665 if (WIN32)
666     if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
667         set(BUILD_NEW_PYTHON_SUPPORT OFF)
668     endif()
669 endif()
670
671 if(ANDROID)
672     set(BUILD_NEW_PYTHON_SUPPORT OFF)
673 endif()
674
675 # Always try to find python
676 # ===================================================
677 find_host_package(PythonInterp)
678 find_host_package(PythonLibs)
679
680 # cmake 2.4 (at least on Ubuntu 8.04 (hardy)) don't define PYTHONLIBS_FOUND
681 if(NOT PYTHONLIBS_FOUND AND PYTHON_INCLUDE_PATH)
682     set(PYTHONLIBS_FOUND ON)
683 endif()
684
685 execute_process(COMMAND ${PYTHON_EXECUTABLE} --version
686       ERROR_VARIABLE PYTHON_VERSION_FULL
687       OUTPUT_STRIP_TRAILING_WHITESPACE)
688
689 string(REGEX MATCH "[0-9]+.[0-9]+" PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_FULL}")
690 if(CMAKE_HOST_UNIX)
691     execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print get_python_lib()"
692                     RESULT_VARIABLE PYTHON_CVPY_PROCESS
693                     OUTPUT_VARIABLE PYTHON_STD_PACKAGES_PATH
694                     OUTPUT_STRIP_TRAILING_WHITESPACE)
695     if("${PYTHON_STD_PACKAGES_PATH}" MATCHES "site-packages")
696         set(PYTHON_PACKAGES_PATH lib/python${PYTHON_VERSION_MAJOR_MINOR}/site-packages CACHE PATH "Where to install the python packages.")
697     else() #debian based assumed, install to the dist-packages.
698         set(PYTHON_PACKAGES_PATH lib/python${PYTHON_VERSION_MAJOR_MINOR}/dist-packages CACHE PATH "Where to install the python packages.")
699     endif()
700 endif()
701 if(CMAKE_HOST_WIN32)
702     get_filename_component(PYTHON_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${PYTHON_VERSION_MAJOR_MINOR}\\InstallPath]" ABSOLUTE CACHE)
703     set(PYTHON_PACKAGES_PATH "${PYTHON_PATH}/Lib/site-packages")
704 endif()
705
706 IF ("${PYTHON_VERSION_MAJOR_MINOR}" VERSION_GREATER 2.4)
707     SET(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} -B)
708 ENDIF()
709
710 # Attempt to discover the NumPy include directory. If this succeeds, then build python API with NumPy
711 execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import os; os.environ['DISTUTILS_USE_SDK']='1'; import numpy.distutils; print numpy.distutils.misc_util.get_numpy_include_dirs()[0]"
712             RESULT_VARIABLE PYTHON_NUMPY_PROCESS
713             OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIRS
714             OUTPUT_STRIP_TRAILING_WHITESPACE)
715
716 if(PYTHON_NUMPY_PROCESS EQUAL 0)
717     set(PYTHON_USE_NUMPY 1)
718     add_definitions(-D PYTHON_USE_NUMPY=1)
719     include_directories(AFTER ${PYTHON_NUMPY_INCLUDE_DIRS})
720     message(STATUS "    Use NumPy headers from: ${PYTHON_NUMPY_INCLUDE_DIRS}")
721 else()
722     set(PYTHON_USE_NUMPY 0)
723 endif()
724
725 execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sphinx; print sphinx.__version__"
726             RESULT_VARIABLE SPHINX_PROCESS
727             OUTPUT_VARIABLE SPHINX_VERSION
728             OUTPUT_STRIP_TRAILING_WHITESPACE)
729
730 set(HAVE_SPHINX 0)
731 if(SPHINX_PROCESS EQUAL 0)
732     find_host_program(SPHINX_BUILD sphinx-build)
733     if(SPHINX_BUILD)
734         set(HAVE_SPHINX 1)
735         message(STATUS "    Found Sphinx ${SPHINX_VERSION}: ${SPHINX_BUILD}")
736     endif()
737 endif()
738
739 # Java support
740 # ===================================================
741 if (PYTHON_EXECUTABLE AND ANDROID AND ANDROID_API_LEVEL GREATER 7)
742     option(BUILD_JAVA_SUPPORT "Build with Java support" TRUE)
743 endif()
744
745 if (BUILD_JAVA_SUPPORT)
746     file(TO_CMAKE_PATH "$ENV{ANT_DIR}" ANT_DIR_ENV_PATH)
747     file(TO_CMAKE_PATH "$ENV{ProgramFiles}" ProgramFiles_ENV_PATH)
748
749     if(ANDROID)
750         file(TO_CMAKE_PATH "$ENV{ANDROID_SDK}" ANDROID_SDK_ENV_PATH)
751         
752         #find android SDK
753         find_host_program(ANDROID_EXECUTABLE
754             NAMES android.bat android
755             PATHS "${ANDROID_SDK_ENV_PATH}/tools/"
756                   "${ProgramFiles_ENV_PATH}/Android/android-sdk/tools/"
757                   "/opt/android-sdk/tools/"
758                   "/opt/android-sdk-linux_x86/tools/"
759                   "/opt/android-sdk-mac_x86/tools/"
760                   "/opt/android-sdk-linux_86/tools/"
761                   "/opt/android-sdk-mac_86/tools/"
762             )
763         if(ANDROID_EXECUTABLE)
764             message(STATUS "    Found android tool: ${ANDROID_EXECUTABLE}")
765
766             get_filename_component(ANDROID_SDK_TOOLS_PATH "${ANDROID_EXECUTABLE}" PATH)
767
768             #read source.properties
769             if (EXISTS "${ANDROID_SDK_TOOLS_PATH}/source.properties")
770                 file(STRINGS "${ANDROID_SDK_TOOLS_PATH}/source.properties" ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES REGEX "^[ ]*[^#].*$")
771                 foreach(line ${ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES})
772                     string(REPLACE "\\:" ":" line ${line})
773                     string(REPLACE "=" ";" line ${line})
774                     list(GET line 0 line_name)
775                     list(GET line 1 line_value)
776                     string(REPLACE "." "_" line_name ${line_name})
777                     SET(ANDROID_TOOLS_${line_name} "${line_value}")
778                     MARK_AS_ADVANCED(ANDROID_TOOLS_${line_name})
779                 endforeach()
780             endif()
781             if (NOT ANDROID_TOOLS_Pkg_Revision)
782                 SET(ANDROID_TOOLS_Pkg_Revision "Unknown")
783                 MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Revision)
784             endif()
785             if (NOT ANDROID_TOOLS_Pkg_Desc)
786                 SET(ANDROID_TOOLS_Pkg_Desc "Android SDK Tools, revision ${ANDROID_TOOLS_Pkg_Revision}.")
787                 if (NOT ANDROID_TOOLS_Pkg_Revision GREATER 11)
788                     SET(ANDROID_TOOLS_Pkg_Desc "${ANDROID_TOOLS_Pkg_Desc} It is recommended to update your SDK tools to revision 12 or newer.")
789                 endif()
790                 MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Desc)
791             endif()
792
793             #get installed targets
794             execute_process(COMMAND ${ANDROID_EXECUTABLE} list target
795                 RESULT_VARIABLE ANDROID_PROCESS
796                 OUTPUT_VARIABLE ANDROID_SDK_TARGETS_FULL
797                 ERROR_VARIABLE ANDROID_PROCESS_ERRORS
798                 OUTPUT_STRIP_TRAILING_WHITESPACE)
799             string(REGEX MATCHALL "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" ANDROID_SDK_TARGETS_FULL "${ANDROID_SDK_TARGETS_FULL}")
800
801             SET(ANDROID_SDK_TARGETS)
802             if (ANDROID_PROCESS EQUAL 0)
803                 foreach(line ${ANDROID_SDK_TARGETS_FULL})
804                     string(REGEX REPLACE "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" "\\2" line "${line}")
805                     list(APPEND ANDROID_SDK_TARGETS "${line}")
806                 endforeach()
807             endif()
808
809             # detect ANDROID_SDK_TARGET if no target is provided by user
810             if (NOT ANDROID_SDK_TARGET)
811                 set(desired_android_target_level ${ANDROID_API_LEVEL})
812                 if (desired_android_target_level LESS 8)
813                     set(desired_android_target_level 8)
814                 endif()
815                 if (ANDROID_PROCESS EQUAL 0)
816                     math(EXPR desired_android_target_level_1 "${desired_android_target_level}-1")
817
818                     foreach(target ${ANDROID_SDK_TARGETS})
819                         string(REGEX MATCH "[0-9]+$" target_level "${target}")
820                         if (target_level GREATER desired_android_target_level_1)
821                            set(ANDROID_SDK_TARGET "${target}")
822                            break()
823                         endif()
824                     endforeach()
825                 else()
826                     set(ANDROID_SDK_TARGET android-${desired_android_target_level})
827                     message(WARNING "Could not retrieve list of installed Android targets. Will try to use \"${ANDROID_SDK_TARGET}\" target")
828                 endif()
829             endif()
830
831             SET(ANDROID_SDK_TARGET ${ANDROID_SDK_TARGET} CACHE STRING "SDK target for Android tests and samples")
832             if (ANDROID_PROCESS EQUAL 0 AND CMAKE_VERSION VERSION_GREATER "2.8")
833                 set_property( CACHE ANDROID_SDK_TARGET PROPERTY STRINGS ${ANDROID_SDK_TARGETS} )
834             endif()
835             string(REGEX MATCH "[0-9]+$" ANDROID_SDK_TARGET_LEVEL "${ANDROID_SDK_TARGET}")
836         endif()
837     endif()
838
839     #find apache ant
840     find_host_program(ANT_EXECUTABLE NAMES ant.bat ant
841         PATHS "${ANT_DIR_ENV_PATH}/bin"
842               "${ProgramFiles_ENV_PATH}/apache-ant/bin"
843         )
844     if(ANT_EXECUTABLE)
845         execute_process(COMMAND ${ANT_EXECUTABLE} -version
846             OUTPUT_VARIABLE ANT_VERSION_FULL
847             OUTPUT_STRIP_TRAILING_WHITESPACE)
848         string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" ANT_VERSION "${ANT_VERSION_FULL}")
849
850         message(STATUS "    Found apache ant ${ANT_VERSION}: ${ANT_EXECUTABLE}")
851     endif()
852
853     if (ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND (ANT_VERSION VERSION_GREATER 1.7) AND (ANDROID_SDK_TARGET_LEVEL GREATER 7))
854         SET(CAN_BUILD_ANDROID_PROJECTS TRUE)
855     else()
856         SET(CAN_BUILD_ANDROID_PROJECTS FALSE)
857     endif()
858 endif()
859
860 if(CAN_BUILD_ANDROID_PROJECTS)
861     SET(BUILD_ANDROID_EXAMPLES TRUE CACHE BOOL "Build examples for Android platform")
862 endif()
863
864 #YV
865 ############################### QT ################################
866
867 set(WITH_QT OFF CACHE BOOL "Build with Qt Backend support")
868 set(WITH_QT_OPENGL OFF CACHE BOOL "Add OpenGL extension to Qt")
869
870 set(HAVE_QT 0)
871 set(HAVE_QT_OPENGL 0)
872
873 if (WITH_QT)
874     find_package(Qt4)
875     if (QT4_FOUND)
876         set(HAVE_QT 1)
877         add_definitions(-DHAVE_QT)#We need to define te macro this way, using cvconfig.h.cmake does not work
878         find_package (OpenGL QUIET)
879
880         #if (NOT WIN32)
881         if (WITH_QT_OPENGL)
882             if (QT_QTOPENGL_FOUND AND OPENGL_FOUND)
883                 set(HAVE_QT_OPENGL 1)
884                 add_definitions(-DHAVE_QT_OPENGL)
885                 #link_directories("${OPENGL_LIBRARIES}")
886                 set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})
887             endif()
888         endif()
889         #endif()
890     endif()
891 endif()
892
893 ############################### TBB ################################
894
895 if (WITH_TBB)
896     if (UNIX AND NOT APPLE AND NOT ANDROID)
897         PKG_CHECK_MODULES(TBB tbb)
898
899         if (TBB_FOUND)
900             set(HAVE_TBB 1)
901             if(NOT ${TBB_INCLUDE_DIRS} STREQUAL "")
902                 include_directories(${TBB_INCLUDE_DIRS})
903             endif()
904             link_directories(${TBB_LIBRARY_DIRS})
905             set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${TBB_LIBRARIES})        
906         endif()
907     endif()    
908     
909     if (NOT HAVE_TBB)
910         set(TBB_DEFAULT_INCLUDE_DIRS "/opt/intel/tbb" "/usr/local/include" "/usr/include" "C:/Program Files/Intel/TBB" "C:/Program Files (x86)/Intel/TBB" "C:/Program Files (x86)/TBB" "${CMAKE_INSTALL_PREFIX}/include")
911         
912         find_path(TBB_INCLUDE_DIR "tbb/tbb.h" PATHS ${TBB_DEFAULT_INCLUDE_DIRS} DOC "The path to TBB headers")
913         if (TBB_INCLUDE_DIR)
914             if (UNIX)
915                 set(TBB_LIB_DIR "${TBB_INCLUDE_DIR}/../lib" CACHE PATH "Full path of TBB library directory")
916                 link_directories("${TBB_LIB_DIR}")
917             endif()
918             if (APPLE)
919                 set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} libtbb.dylib)
920             elseif (ANDROID)
921                 set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} tbbmalloc tbb)
922                 add_definitions(-DTBB_USE_GCC_BUILTINS)
923             elseif (UNIX)
924                 set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} tbb)
925             elseif (WIN32)
926                 if (CMAKE_COMPILER_IS_GNUCXX)
927                     set(TBB_LIB_DIR "${TBB_INCLUDE_DIR}/../lib" CACHE PATH "Full path of TBB library directory")
928                     link_directories("${TBB_LIB_DIR}")
929                     set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} tbb)
930                 else()
931                     get_filename_component(_TBB_LIB_PATH "${TBB_INCLUDE_DIR}/../lib" ABSOLUTE)                          
932                    
933                     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64*|x86_64* OR MSVC64)
934                         set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/intel64")
935                     elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES x86*|i386*|i686*)
936                         set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/ia32")
937                     endif()
938
939                     if (MSVC80)
940                        set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/vc8")
941                     elseif(MSVC90)
942                        set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/vc9")                    
943                     elseif(MSVC10)
944                         set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/vc10")
945                     endif()
946                     set(TBB_LIB_DIR "${_TBB_LIB_PATH}" CACHE PATH "Full path of TBB library directory")
947                     link_directories("${TBB_LIB_DIR}")
948                 endif()
949             endif()
950
951             set(HAVE_TBB 1)
952             if(NOT "${TBB_INCLUDE_DIR}" STREQUAL "")
953                 include_directories("${TBB_INCLUDE_DIR}")
954             endif()
955         endif()
956     endif()
957 endif(WITH_TBB)
958
959 #Threading Framework -- temporary decision for ARM-s instead of TBB
960 if (NOT HAVE_TBB)
961     file(GLOB THREADING_FRAMEWORK_HEADER "${OpenCV_SOURCE_DIR}/modules/core/include/opencv2/core/threading_framework.hpp")
962     file(GLOB THREADING_FRAMEWORK_SOURCE "${OpenCV_SOURCE_DIR}/modules/core/src/threading_framework.cpp")
963     if(THREADING_FRAMEWORK_HEADER AND THREADING_FRAMEWORK_SOURCE)
964         set(HAVE_THREADING_FRAMEWORK 1)
965     endif()
966 endif()
967
968 ############################ Intel IPP #############################
969 set(IPP_FOUND)
970
971 if(WITH_IPP)
972     include(OpenCVFindIPP.cmake)
973 endif()
974
975 if(IPP_FOUND)
976     add_definitions(-DHAVE_IPP)
977     include_directories(${IPP_INCLUDE_DIRS})
978     link_directories(${IPP_LIBRARY_DIRS})
979     set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${IPP_LIBRARIES})
980 endif()
981
982
983 ############################### CUDA ################################
984
985 if(WITH_CUDA)
986     find_package(CUDA 4.0)
987     
988     if(CUDA_FOUND)
989         set(HAVE_CUDA 1)
990         message(STATUS "CUDA detected: " ${CUDA_VERSION})
991
992         set(CUDA_ARCH_BIN "1.1 1.2 1.3 2.0 2.1(2.0)" CACHE STRING "Specify 'real' GPU architectures to build binaries for, BIN(PTX) format is supported")
993         set(CUDA_ARCH_PTX "2.0" CACHE STRING "Specify 'virtual' PTX architectures to build PTX intermediate code for")
994         
995         string(REGEX REPLACE "\\." "" ARCH_BIN_NO_POINTS "${CUDA_ARCH_BIN}")
996         string(REGEX REPLACE "\\." "" ARCH_PTX_NO_POINTS "${CUDA_ARCH_PTX}")
997         
998         # Ckeck if user specified 1.0 compute capability: we don't support it
999         string(REGEX MATCH "1.0" HAS_ARCH_10 "${CUDA_ARCH_BIN} ${CUDA_ARCH_PTX}")
1000         set(CUDA_ARCH_BIN_OR_PTX_10 0)
1001         if(NOT ${HAS_ARCH_10} STREQUAL "")
1002             set(CUDA_ARCH_BIN_OR_PTX_10 1)
1003         endif()
1004         
1005         # NVCC flags to be set
1006         set(NVCC_FLAGS_EXTRA "")      
1007         
1008         # These vars will be passed into the templates
1009         set(OPENCV_CUDA_ARCH_BIN "") 
1010         set(OPENCV_CUDA_ARCH_PTX "") 
1011         set(OPENCV_CUDA_ARCH_FEATURES "")        
1012         
1013         # Tell NVCC to add binaries for the specified GPUs
1014         string(REGEX MATCHALL "[0-9()]+" ARCH_LIST "${ARCH_BIN_NO_POINTS}")
1015         foreach(ARCH IN LISTS ARCH_LIST)
1016             if (ARCH MATCHES "([0-9]+)\\(([0-9]+)\\)")
1017                 # User explicitly specified PTX for the concrete BIN
1018                 set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
1019                 set(OPENCV_CUDA_ARCH_BIN "${OPENCV_CUDA_ARCH_BIN} ${CMAKE_MATCH_1}")
1020                 set(OPENCV_CUDA_ARCH_FEATURES "${OPENCV_CUDA_ARCH_FEATURES} ${CMAKE_MATCH_2}")
1021             else()
1022                 # User didn't explicitly specify PTX for the concrete BIN, we assume PTX=BIN                
1023                 set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${ARCH},code=sm_${ARCH})
1024                 set(OPENCV_CUDA_ARCH_BIN "${OPENCV_CUDA_ARCH_BIN} ${ARCH}")
1025                 set(OPENCV_CUDA_ARCH_FEATURES "${OPENCV_CUDA_ARCH_FEATURES} ${ARCH}")
1026             endif()
1027         endforeach()
1028         
1029         # Tell NVCC to add PTX intermediate code for the specified architectures
1030         string(REGEX MATCHALL "[0-9]+" ARCH_LIST "${ARCH_PTX_NO_POINTS}")
1031         foreach(ARCH IN LISTS ARCH_LIST)
1032             set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${ARCH},code=compute_${ARCH})
1033             set(OPENCV_CUDA_ARCH_PTX "${OPENCV_CUDA_ARCH_PTX} ${ARCH}")
1034             set(OPENCV_CUDA_ARCH_FEATURES "${OPENCV_CUDA_ARCH_FEATURES} ${ARCH}")
1035         endforeach()
1036         
1037         # These vars will be processed in other scripts
1038         set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} ${NVCC_FLAGS_EXTRA})        
1039         set(OpenCV_CUDA_CC "${NVCC_FLAGS_EXTRA}")
1040         
1041         message(STATUS "CUDA NVCC target flags: ${CUDA_NVCC_FLAGS}")
1042     else()
1043         unset(CUDA_ARCH_BIN CACHE)
1044         unset(CUDA_ARCH_PTX CACHE)  
1045     endif() 
1046 endif()
1047
1048
1049 ############################### OpenNI ################################
1050 set(HAVE_OPENNI FALSE)
1051 set(HAVE_OPENNI_PRIME_SENSOR_MODULE FALSE)
1052
1053 if(WITH_OPENNI)
1054     include(OpenCVFindOpenNI.cmake)
1055 endif()
1056
1057 ############################### XIMEA ################################
1058 set(HAVE_XIMEA FALSE)
1059  
1060 if(WITH_XIMEA)
1061     include(OpenCVFindXimea.cmake)
1062 endif()
1063
1064 if(XIMEA_FOUND)
1065     set(HAVE_XIMEA TRUE)
1066 endif()
1067
1068 ############################## Eigen ##############################
1069
1070 if(WITH_EIGEN)
1071     find_path(EIGEN_INCLUDE_PATH "Eigen/Core"
1072             PATHS "/usr/local/include/eigen2" "/opt/include/eigen2" "/usr/include/eigen2"
1073             "/usr/local/include/eigen3" "/opt/include/eigen3" "/usr/include/eigen3"
1074             DOC "The path to Eigen2/Eigen3 headers")
1075     if(EIGEN_INCLUDE_PATH)
1076         include_directories(${EIGEN_INCLUDE_PATH})
1077         set(HAVE_EIGEN 1)
1078     endif()
1079 endif()
1080
1081
1082 ################## Extra HighGUI libs on Windows ###################
1083
1084 if(WIN32)
1085     set(WITH_VIDEOINPUT ON CACHE BOOL "Build HighGUI with DirectShow support")
1086     set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} comctl32 gdi32 ole32)
1087
1088     if(WITH_VIDEOINPUT)
1089         set(HAVE_VIDEOINPUT 1)
1090     endif()
1091     
1092     if (MSVC)
1093         set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} vfw32)
1094     endif()
1095
1096     if(MINGW)
1097         if(MINGW64)
1098             set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} msvfw32 avifil32 avicap32 winmm)
1099         else()
1100             set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} vfw32 winmm)
1101         endif()  
1102     endif()
1103 endif()
1104
1105 ############## Android source tree for native camera ###############
1106 if(ANDROID AND ANDROID_API_LEVEL GREATER 7)
1107     option(WITH_ANDROID_CAMERA "Build with native Android camera support" TRUE)
1108
1109     SET (ANDROID_SOURCE_TREE "ANDROID_SOURCE_TREE-NOTFOUND" CACHE PATH 
1110 "Path to Android source tree.
1111 Set this variable to path to your Android sources to compile
1112 libnative_camera_rx.x.x.so for your Android")
1113     SET(BUILD_ANDROID_CAMERA_WRAPPER OFF)
1114     if (ANDROID_SOURCE_TREE)
1115         FILE(STRINGS "${ANDROID_SOURCE_TREE}/development/sdk/platform_source.properties" ANDROID_VERSION REGEX "Platform\\.Version=[0-9]+\\.[0-9]+(\\.[0-9]+)?" )
1116         string(REGEX REPLACE "Platform\\.Version=([0-9]+\\.[0-9]+(\\.[0-9]+)?)" "\\1" ANDROID_VERSION "${ANDROID_VERSION}")
1117         if (ANDROID_VERSION MATCHES "^[0-9]+\\.[0-9]+$")
1118             SET(ANDROID_VERSION "${ANDROID_VERSION}.0")
1119         endif()
1120         if(NOT "${ANDROID_VERSION}" STREQUAL "")
1121             SET(BUILD_ANDROID_CAMERA_WRAPPER ON)
1122         endif()
1123     endif()
1124     MARK_AS_ADVANCED(ANDROID_SOURCE_TREE)
1125 endif()
1126
1127 # ----------------------------------------------------------------------------
1128 #                   UPDATE CONFIG FILES & SCRIPTS:
1129 #
1130 #  CONFIGURE_FILE(InputFile OutputFile [COPYONLY] [ESCAPE_QUOTES] [@ONLY])
1131 #  If @ONLY is specified, only variables of the form @VAR@ will be
1132 #  replaces and ${VAR} will be ignored.
1133 #
1134 #  A directory will be created for each platform so the "cvconfig.h" file is
1135 #  not overwritten if cmake generates code in the same path.
1136 # ----------------------------------------------------------------------------
1137 add_definitions(-DHAVE_CVCONFIG_H)
1138
1139 set(OPENCV_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/" CACHE PATH "Where to create the platform-dependant cvconfig.h")
1140
1141 message(STATUS "Parsing 'cvconfig.h.cmake'")
1142 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cvconfig.h.cmake" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h")
1143
1144 # ---------------------------------------------------------------------------
1145 # The C+//0 include & link directories:
1146 # ---------------------------------------------------------------------------
1147 include_directories("."
1148     "${OPENCV_CONFIG_FILE_INCLUDE_DIR}"
1149     "${CMAKE_CURRENT_SOURCE_DIR}/include"
1150     "${CMAKE_CURRENT_SOURCE_DIR}/include/opencv"
1151     )
1152
1153 # ----------------------------------------------------------------------------
1154 #           Set the maximum level of warnings:
1155 # ----------------------------------------------------------------------------
1156 # Should be set to true for development
1157 set(OPENCV_WARNINGS_ARE_ERRORS OFF CACHE BOOL "Treat warnings as errors")
1158 if (WIN32 AND ${CMAKE_GENERATOR} MATCHES "(MinGW)|(MSYS)")
1159     set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG" CACHE STRING "")
1160 endif()
1161
1162 set(EXTRA_C_FLAGS "")
1163 set(EXTRA_C_FLAGS_RELEASE "")
1164 set(EXTRA_C_FLAGS_DEBUG "")
1165 set(EXTRA_EXE_LINKER_FLAGS "")
1166 set(EXTRA_EXE_LINKER_FLAGS_RELEASE "")
1167 set(EXTRA_EXE_LINKER_FLAGS_DEBUG "")
1168
1169 if(MSVC)
1170     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
1171     # 64-bit portability warnings, in MSVC8
1172     if(MSVC80)
1173         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /Wp64")
1174     endif()
1175     #if(MSVC90)
1176     #    set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /D _BIND_TO_CURRENT_CRT_VERSION=1 /D _BIND_TO_CURRENT_VCLIBS_VERSION=1")
1177     #endif()
1178
1179     if(BUILD_WITH_DEBUG_INFO)
1180         set(EXTRA_EXE_LINKER_FLAGS_RELEASE "${EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
1181     endif()
1182
1183     # Remove unreferenced functions: function level linking
1184     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /Gy")
1185     if(BUILD_WITH_DEBUG_INFO)
1186        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /Zi")
1187     endif()
1188 endif()
1189
1190 if(CMAKE_COMPILER_IS_GNUCXX)
1191     # High level of warnings.
1192     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wall")
1193
1194     # The -Wno-long-long is required in 64bit systems when including sytem headers.
1195     if(X86_64)
1196         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-long-long")
1197     endif()
1198
1199     # We need pthread's
1200     if(UNIX AND NOT ANDROID)
1201         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -pthread")
1202     endif()
1203
1204     if(OPENCV_WARNINGS_ARE_ERRORS)
1205         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror")
1206     endif()
1207
1208     if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
1209         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -march=i686")
1210     endif()
1211
1212     # Other optimizations
1213     if(USE_OMIT_FRAME_POINTER)
1214         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer")
1215     endif()
1216     if(USE_FAST_MATH)
1217         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -ffast-math")
1218     endif()
1219     if(ENABLE_POWERPC)
1220         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5")
1221     endif()
1222     if(ENABLE_SSE)
1223         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse")
1224     endif()
1225     if(ENABLE_SSE2)
1226         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse2")
1227     endif()
1228     # SSE3 and further should be disabled under MingW because it generates compiler errors
1229     if(NOT MINGW)
1230         if(ENABLE_SSE3)
1231             set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse3")
1232         endif()
1233         
1234         if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 402)
1235             set(HAVE_GCC43_OR_NEWER 1)
1236         endif()
1237         if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 401)
1238             set(HAVE_GCC42_OR_NEWER 1)
1239         endif()
1240         
1241         if(HAVE_GCC42_OR_NEWER OR APPLE)
1242             if(ENABLE_SSSE3)
1243                 set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mssse3")
1244             endif()
1245             if(HAVE_GCC43_OR_NEWER)
1246                 if(ENABLE_SSE41)
1247                     set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse4.1")
1248                 endif()
1249                 if(ENABLE_SSE42)
1250                     set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse4.2")
1251                 endif()
1252             endif()
1253         endif()
1254     endif()
1255
1256     if(X86 OR X86_64)
1257         if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
1258             set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mfpmath=387")
1259         endif()
1260     endif()
1261
1262     # Profiling?
1263     if(ENABLE_PROFILING)
1264         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -pg -g")
1265     elseif(NOT APPLE)
1266         # Remove unreferenced functions: function level linking
1267         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -ffunction-sections")
1268     endif()
1269
1270     set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -DNDEBUG")
1271     set(EXTRA_C_FLAGS_DEBUG "${EXTRA_C_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
1272     if(BUILD_WITH_DEBUG_INFO)
1273        set(EXTRA_C_FLAGS_DEBUG "${EXTRA_C_FLAGS_DEBUG} -ggdb3")
1274     endif()
1275 endif()
1276
1277 if(MSVC)
1278     # 64-bit MSVC compiler uses SSE/SSE2 by default
1279     if(NOT MSVC64)
1280        if(ENABLE_SSE)
1281           set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /arch:SSE")
1282        endif()
1283        if(ENABLE_SSE2)
1284           set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /arch:SSE2")
1285        endif()
1286     endif()
1287     if(ENABLE_SSE3)
1288        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /arch:SSE3")
1289     endif()
1290     if(ENABLE_SSE4_1)
1291        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /arch:SSE4.1")
1292     endif()
1293     if (ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1)
1294        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /Oi")
1295     endif()
1296 endif()
1297
1298 # Extra link libs if the user selects building static libs:
1299 if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
1300     # Android does not need these settings because they are already set by toolchain file
1301     set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} stdc++)
1302     set(OPENCV_EXTRA_C_FLAGS "-fPIC ${OPENCV_EXTRA_C_FLAGS}")
1303 endif()
1304
1305 # Add user supplied extra options (optimization, etc...)
1306 # ==========================================================
1307 set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS}" CACHE STRING "Extra compiler options")
1308 set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE}" CACHE STRING "Extra compiler options for Release build")
1309 set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG}" CACHE STRING "Extra compiler options for Debug build")
1310 set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS}" CACHE STRING "Extra linker flags" FORCE)
1311 set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}" CACHE STRING "Extra linker flags for Release build" FORCE)
1312 set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING "Extra linker flags for Debug build" FORCE)
1313
1314 #combine all "extra" options
1315 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
1316 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
1317 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${EXTRA_C_FLAGS_RELEASE} ${OPENCV_EXTRA_C_FLAGS_RELEASE}")
1318 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${EXTRA_C_FLAGS_RELEASE} ${OPENCV_EXTRA_C_FLAGS_RELEASE}")
1319 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_C_FLAGS_DEBUG} ${OPENCV_EXTRA_C_FLAGS_DEBUG}")
1320 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${EXTRA_C_FLAGS_DEBUG} ${OPENCV_EXTRA_C_FLAGS_DEBUG}")
1321 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXTRA_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
1322 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${EXTRA_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
1323 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${EXTRA_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
1324
1325 # In case of Makefiles if the user does not setup CMAKE_BUILD_TYPE, assume it's Release:
1326 if (${CMAKE_GENERATOR} MATCHES ".*Makefiles" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
1327     set(CMAKE_BUILD_TYPE Release)
1328 endif()
1329
1330 if (WIN32 AND MSVC)
1331     # avoid warnings from MSVC about overriding the /W* option
1332     # we replace /W3 with /W4 only for C++ files,
1333     # since all the 3rd-party libraries OpenCV uses are in C,
1334     # and we do not care about their warnings.
1335     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1336     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
1337     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
1338
1339     # allow extern "C" functions throw exceptions
1340     string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1341     string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
1342     string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
1343     string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1344     string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
1345     string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
1346
1347     string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1348     string(REPLACE "/Zm1000" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1349 endif()
1350
1351 if("${CMAKE_CONFIGURE_LDFLAGS}")
1352     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CONFIGURE_LDFLAGS}")
1353 endif("${CMAKE_CONFIGURE_LDFLAGS}")
1354
1355 # --------------------------------------------------------------------------------------------
1356 #  Installation for CMake Module:  OpenCVConfig.cmake
1357 #  Part 1/3: ${BIN_DIR}/OpenCVConfig.cmake              -> For use *without* "make install"
1358 #  Part 2/3: ${BIN_DIR}/unix-install/OpenCVConfig.cmake -> For use with "make install"
1359 #  Part 3/3: ${BIN_DIR}/win-install/OpenCVConfig.cmake  -> For use within binary installers/packages
1360 # -------------------------------------------------------------------------------------------
1361
1362 # -------------------------------------------------------------------------------------------
1363 #  Part 1/3: ${BIN_DIR}/OpenCVConfig.cmake              -> For use *without* "make install"
1364 # -------------------------------------------------------------------------------------------
1365 set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"${OPENCV_CONFIG_FILE_INCLUDE_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}/include\" \"${CMAKE_CURRENT_SOURCE_DIR}/include/opencv\"")
1366 set(CMAKE_OPENCV2_INCLUDE_DIRS_CONFIGCMAKE "${CMAKE_CURRENT_SOURCE_DIR}")
1367 set(CMAKE_LIB_DIRS_CONFIGCMAKE "${LIBRARY_OUTPUT_PATH}")
1368 set(CMAKE_3RDPARTY_LIB_DIRS_CONFIGCMAKE "\"${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}\"")
1369
1370 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig.cmake" IMMEDIATE @ONLY)
1371 #support for version checking when finding opencv. find_package(OpenCV 2.3.1 EXACT) should now work.
1372 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig-version.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig-version.cmake" IMMEDIATE @ONLY)
1373 # --------------------------------------------------------------------------------------------
1374 #  Part 2/3: ${BIN_DIR}/unix-install/OpenCVConfig.cmake -> For use *with* "make install"
1375 # -------------------------------------------------------------------------------------------
1376 set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/${OPENCV_INCLUDE_PREFIX}/opencv" "\${OpenCV_INSTALL_PATH}/${OPENCV_INCLUDE_PREFIX}\"")
1377
1378 set(CMAKE_OPENCV2_INCLUDE_DIRS_CONFIGCMAKE "")
1379 if(ANDROID)
1380     set(CMAKE_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/libs/\${ARMEABI_NDK_NAME}\"")
1381     set(CMAKE_3RDPARTY_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/share/OpenCV/3rdparty/libs/\${ARMEABI_NDK_NAME}\"")
1382 else()
1383     set(CMAKE_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/${OPENCV_LIB_INSTALL_PATH}\"")
1384     set(CMAKE_3RDPARTY_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}\"")
1385     if(OPENCV_MANGLED_INSTALL_PATHS)
1386       set(CMAKE_3RDPARTY_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_INSTALL_PATH}/share/OpenCV-${OPENCV_VERSION}/3rdparty/${OPENCV_LIB_INSTALL_PATH}\"")
1387     endif()
1388 endif()
1389
1390 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig.cmake" IMMEDIATE @ONLY)
1391 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig-version.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig-version.cmake" IMMEDIATE @ONLY)
1392
1393 if(UNIX)
1394   #http://www.vtk.org/Wiki/CMake/Tutorials/Packaging reference
1395   # For a command "find_package(<name> [major[.minor]] [EXACT] [REQUIRED|QUIET])"
1396   # cmake will look in the following dir on unix:
1397   #                <prefix>/(share|lib)/cmake/<name>*/                     (U)
1398   #                <prefix>/(share|lib)/<name>*/                           (U)
1399   #                <prefix>/(share|lib)/<name>*/(cmake|CMake)/             (U)
1400   if(OPENCV_MANGLED_INSTALL_PATHS)
1401     install(FILES ${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig.cmake DESTINATION share/OpenCV-${OPENCV_VERSION}/)
1402     install(FILES ${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig-version.cmake DESTINATION share/OpenCV-${OPENCV_VERSION}/)
1403   else()
1404     install(FILES "${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig.cmake" DESTINATION share/OpenCV/)
1405     install(FILES ${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig-version.cmake DESTINATION share/OpenCV/)
1406   endif()
1407 endif()
1408
1409 if(ANDROID)
1410     install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/android/android.toolchain.cmake" DESTINATION share/OpenCV)
1411 endif()
1412
1413 # --------------------------------------------------------------------------------------------
1414 #  Part 3/3: ${BIN_DIR}/win-install/OpenCVConfig.cmake  -> For use within binary installers/packages
1415 # -------------------------------------------------------------------------------------------
1416 if(WIN32)
1417     set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"\${OpenCV_CONFIG_PATH}/include\" \"\${OpenCV_CONFIG_PATH}/include/opencv\"")
1418     set(CMAKE_OPENCV2_INCLUDE_DIRS_CONFIGCMAKE "")
1419     set(CMAKE_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_CONFIG_PATH}/${OPENCV_LIB_INSTALL_PATH}\"")
1420     set(CMAKE_3RDPARTY_LIB_DIRS_CONFIGCMAKE "\"\${OpenCV_CONFIG_PATH}/share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}\"")
1421
1422     exec_program(mkdir ARGS "-p \"${CMAKE_BINARY_DIR}/win-install/\"" OUTPUT_VARIABLE RET_VAL)
1423     configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/win-install/OpenCVConfig.cmake" IMMEDIATE @ONLY)
1424
1425     # Install the OpenCVConfig.cmake file which has the right paths pointing to the install directory 
1426     install(FILES "${CMAKE_BINARY_DIR}/win-install/OpenCVConfig.cmake" DESTINATION "${CMAKE_INSTALL_PREFIX}/") 
1427 endif()
1428
1429 # --------------------------------------------------------------------------------------------
1430 #  Installation for Android ndk-build makefile:  OpenCV.mk
1431 #  Part 1/2: ${BIN_DIR}/OpenCV.mk              -> For use *without* "make install"
1432 #  Part 2/2: ${BIN_DIR}/unix-install/OpenCV.mk -> For use with "make install"
1433 # -------------------------------------------------------------------------------------------
1434 if(ANDROID)
1435     if(BUILD_SHARED_LIBS)
1436         SET(OPENCV_LIBTYPE_CONFIGMAKE "SHARED")
1437     else()
1438         SET(OPENCV_LIBTYPE_CONFIGMAKE "STATIC")
1439     endif()
1440     if(BUILD_ANDROID_CAMERA_WRAPPER)
1441         set(CMAKE_CAMERA_LIBS_CONFIGCMAKE "native_camera_r${ANDROID_VERSION}")
1442     elseif(WITH_ANDROID_CAMERA)
1443         SET(CMAKE_CAMERA_LIBS_CONFIGCMAKE "")
1444         file(GLOB CMAKE_CAMERA_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/lib/${ARMEABI_NDK_NAME}/libnative_camera_r*.so")
1445         foreach(cam_lib ${CMAKE_CAMERA_LIBS})
1446             get_filename_component(cam_lib "${cam_lib}" NAME)
1447             string(REGEX REPLACE "lib(native_camera_r[0-9]+\\.[0-9]+\\.[0-9]+)\\.so" "\\1" cam_lib "${cam_lib}")
1448             SET(CMAKE_CAMERA_LIBS_CONFIGCMAKE "${CMAKE_CAMERA_LIBS_CONFIGCMAKE} ${cam_lib}")
1449         endforeach()
1450     endif()
1451 endif(ANDROID)
1452
1453 # -------------------------------------------------------------------------------------------
1454 #  Part 1/2: ${BIN_DIR}/OpenCV.mk              -> For use *without* "make install"
1455 # -------------------------------------------------------------------------------------------
1456 if(ANDROID)
1457     set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"${OPENCV_CONFIG_FILE_INCLUDE_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}/include\" \"${CMAKE_CURRENT_SOURCE_DIR}/include/opencv\"")
1458     set(CMAKE_BASE_INCLUDE_DIR_CONFIGCMAKE "\"${CMAKE_CURRENT_SOURCE_DIR}\"")
1459     set(CMAKE_LIBS_DIR_CONFIGCMAKE "\$(OPENCV_THIS_DIR)")
1460
1461     configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCV.mk.in" "${CMAKE_BINARY_DIR}/OpenCV.mk" IMMEDIATE @ONLY)
1462 endif(ANDROID)
1463
1464 # -------------------------------------------------------------------------------------------
1465 #  Part 2/2: ${BIN_DIR}/unix-install/OpenCV.mk -> For use with "make install"
1466 # -------------------------------------------------------------------------------------------
1467 if(ANDROID)
1468     set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"\$(LOCAL_PATH)/\$(OPENCV_THIS_DIR)/../../include/opencv\" \"\$(LOCAL_PATH)/\$(OPENCV_THIS_DIR)/../../include\"")
1469     set(CMAKE_BASE_INCLUDE_DIR_CONFIGCMAKE "")
1470     set(CMAKE_LIBS_DIR_CONFIGCMAKE "\$(OPENCV_THIS_DIR)/../..")
1471
1472     configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCV.mk.in" "${CMAKE_BINARY_DIR}/unix-install/OpenCV.mk" IMMEDIATE @ONLY)
1473     install(FILES ${CMAKE_BINARY_DIR}/unix-install/OpenCV.mk DESTINATION share/OpenCV/)
1474 endif(ANDROID)
1475
1476 # --------------------------------------------------------------------------------------------
1477 #according to man pkg-config
1478 #  The package name specified on the pkg-config command line is defined to
1479 #      be the name of the metadata file, minus the .pc extension. If a library
1480 #      can install multiple versions simultaneously, it must give each version
1481 #      its own name (for example, GTK 1.2 might have the package  name  "gtk+"
1482 #      while GTK 2.0 has "gtk+-2.0").
1483 #  Part 2/2: ${BIN_DIR}/unix-install/opencv.pc -> For use *with* "make install"
1484 # prefix=/usr
1485 # exec_prefix=${prefix}
1486 # libdir=${exec_prefix}/lib
1487 # includedir=${prefix}/include/opencv
1488 # -------------------------------------------------------------------------------------------
1489 set(prefix      ${CMAKE_INSTALL_PREFIX})
1490 set(exec_prefix "\${prefix}")
1491 set(libdir      "\${exec_prefix}/lib${LIB_SUFFIX}")
1492 set(includedir  "\${prefix}/${OPENCV_INCLUDE_PREFIX}")
1493 set(VERSION     ${OPENCV_VERSION})
1494
1495 set(OPENCV_PC_FILE_NAME opencv.pc)
1496 #need to be explicit with naming the pc file and version number for side by side installs to work.
1497 if(OPENCV_MANGLED_INSTALL_PATHS)
1498   SET(OpenCV_LIB_COMPONENTS opencv_contrib opencv_legacy opencv_objdetect opencv_calib3d opencv_features2d opencv_video opencv_highgui opencv_ml opencv_imgproc opencv_flann opencv_core )
1499   #be explicit about the library names.
1500   set(OpenCV_LIB_COMPONENTS_ )
1501   foreach( CVLib ${OpenCV_LIB_COMPONENTS})
1502     set(OpenCV_LIB_COMPONENTS_ "${OpenCV_LIB_COMPONENTS_} ${libdir}/lib${CVLib}.so.${OPENCV_VERSION}" )
1503   endforeach()
1504   set(OpenCV_LIB_COMPONENTS ${OpenCV_LIB_COMPONENTS_})
1505   set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
1506   configure_file("${CMAKE_CURRENT_SOURCE_DIR}/opencv-XXX.pc.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}" @ONLY IMMEDIATE)
1507 else()
1508   configure_file("${CMAKE_CURRENT_SOURCE_DIR}/opencv.pc.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}" @ONLY IMMEDIATE)
1509 endif()
1510
1511 if(UNIX AND NOT ANDROID)
1512   install(FILES ${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME} DESTINATION ${OPENCV_LIB_INSTALL_PATH}/pkgconfig)
1513 endif()
1514
1515 # ----------------------------------------------------------------------------
1516 #   Uninstall target, for "make uninstall"
1517 # ----------------------------------------------------------------------------
1518 CONFIGURE_FILE(
1519   "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
1520   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
1521   IMMEDIATE @ONLY)
1522
1523 ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
1524
1525 #-----------------------------------
1526 # Source package:
1527 #-----------------------------------
1528 set(BUILD_PACKAGE ON CACHE BOOL "Enables 'make package_source' command")
1529
1530 if(BUILD_PACKAGE)
1531     set(TARBALL_NAME "${CMAKE_PROJECT_NAME}-${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}")
1532     if (NOT WIN32)
1533         if(APPLE)
1534             set(TAR_CMD gnutar)
1535         else()
1536             set(TAR_CMD tar)
1537         endif()
1538         set(TAR_TRANSFORM "\"s,^,${TARBALL_NAME}/,\"")
1539         add_custom_target(package_source
1540         #TODO: maybe we should not remove dll's
1541         COMMAND ${TAR_CMD} --transform ${TAR_TRANSFORM} -cjpf ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.tar.bz2 --exclude=".svn" --exclude="*.pyc" --exclude="*.vcproj" --exclude="*/lib/*" --exclude="*.dll" ./
1542         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1543     else()
1544         add_custom_target(package_source
1545         COMMAND zip -9 -r ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.zip . -x '*/.svn/*' '*.vcproj' '*.pyc'
1546         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1547     endif()
1548 endif()
1549
1550
1551 #-----------------------------------
1552 # Solution folders:
1553 #-----------------------------------
1554
1555 if(${CMAKE_VERSION} VERSION_GREATER "2.8.0")
1556     set(ENABLE_SOLUTION_FOLDERS OFF CACHE BOOL "Solution folder in Visual Studio or in other IDEs")
1557 endif()
1558
1559 if(ENABLE_SOLUTION_FOLDERS)
1560     set_property(GLOBAL PROPERTY USE_FOLDERS ON)
1561     set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
1562 endif()
1563
1564 #-----------------------------------
1565 # performance tests
1566 #-----------------------------------
1567 if(BUILD_PERF_TESTS AND PYTHON_EXECUTABLE)
1568     add_custom_target(perf 
1569         ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/modules/ts/misc/run.py" --configuration $<CONFIGURATION> "${CMAKE_BINARY_DIR}"
1570         WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
1571         DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/modules/ts/misc/run.py"
1572     )
1573 endif()
1574
1575 #-----------------------------------
1576 # Subdirectories:
1577 #-----------------------------------
1578 add_subdirectory(include)
1579 add_subdirectory(modules)
1580 add_subdirectory(doc)
1581 add_subdirectory(data)
1582 add_subdirectory(3rdparty)
1583
1584 if(BUILD_EXAMPLES OR BUILD_ANDROID_EXAMPLES OR INSTALL_PYTHON_EXAMPLES)
1585     add_subdirectory(samples)
1586 endif()
1587
1588 # ----------------------------------------------------------------------------
1589 #   Summary:
1590 # ----------------------------------------------------------------------------
1591 macro(status text)
1592     SET(status_cond)
1593     SET(status_then)
1594     SET(status_else)
1595     
1596     SET(status_current_name "cond")
1597     foreach(arg ${ARGN})
1598        if(arg STREQUAL "THEN")
1599            SET(status_current_name "then")
1600        elseif(arg STREQUAL "ELSE")
1601            SET(status_current_name "else")
1602        else()
1603            LIST(APPEND status_${status_current_name} ${arg})
1604        endif()
1605     endforeach()
1606
1607     if(DEFINED status_cond)
1608         SET(status_placeholder_length 32)
1609         string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder)
1610         string(LENGTH "${text}" status_text_length)
1611         if (status_text_length LESS status_placeholder_length)
1612             string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
1613         elseif (DEFINED status_then OR DEFINED status_else)
1614             message(STATUS "${text}")
1615             SET(status_text "${status_placeholder}")
1616         else()
1617             SET(status_text "${text}")
1618         endif()
1619
1620         if (DEFINED status_then OR DEFINED status_else)
1621             if(${status_cond})
1622                 string(REPLACE ";" " " status_then "${status_then}")
1623                 message(STATUS "${status_text}" "${status_then}")
1624             else()
1625                 string(REPLACE ";" " " status_else "${status_else}")
1626                 message(STATUS "${status_text}" "${status_else}")
1627             endif()
1628         else()
1629             string(REPLACE ";" " " status_cond "${status_cond}")
1630             message(STATUS "${status_text}" "${status_cond}")
1631         endif()
1632      else()
1633          message(STATUS "${text}")
1634      endif()
1635 endmacro()
1636
1637 status("")
1638 status("General configuration for opencv ${OPENCV_VERSION} =====================================")
1639 status("")
1640 status("    Built as dynamic libs?:" BUILD_SHARED_LIBS THEN YES ELSE NO)
1641 status("    Compiler:"               CMAKE_COMPILER THEN "${CMAKE_COMPILER}" ELSE "${CMAKE_CXX_COMPILER}")
1642 status("    C++ flags (Release):"    ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE})
1643 status("    C++ flags (Debug):"      ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG})
1644 if(WIN32)
1645     status("    Linker flags (Release):" ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_RELEASE})
1646     status("    Linker flags (Debug):"   ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_DEBUG})
1647 else()
1648     status("    Linker flags (Release):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})
1649     status("    Linker flags (Debug):"   ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})
1650 endif()
1651
1652 if(ANDROID)
1653     status("    Floating point type:" ${ARM_TARGET})
1654     status("    Native API level:" android-${ANDROID_API_LEVEL})
1655     status("    SDK target:" "${ANDROID_SDK_TARGET}")
1656 endif()
1657
1658 #YV
1659 status("")
1660 status("  GUI: ")
1661
1662 if (HAVE_QT)
1663     status("    QT 4.x:"            HAVE_QT        THEN YES ELSE NO)
1664     status("    QT OpenGL support:" HAVE_QT_OPENGL THEN YES ELSE NO)
1665 else()
1666     if(WIN32)
1667         status("    Win32 UI:" YES)
1668     else()
1669         if(APPLE)
1670             if(WITH_CARBON)
1671                 status("    Carbon:" YES)
1672             else()
1673                 status("    Cocoa:"  YES)
1674             endif()
1675         else()
1676             status("    GTK+ 2.x:" HAVE_GTK     THEN YES ELSE NO)
1677             status("    GThread:"  HAVE_GTHREAD THEN YES ELSE NO)
1678         endif()
1679     endif()
1680 endif()
1681
1682 # media
1683 status("")
1684 status("  Media I/O: ")
1685 status("    ZLib:"      ZLIB_FOUND                         THEN YES             ELSE build)
1686 status("    JPEG:"      NOT WITH_JPEG OR JPEG_FOUND        THEN ${JPEG_FOUND}   ELSE build)
1687 status("    PNG:"       NOT WITH_PNG OR PNG_FOUND          THEN ${PNG_FOUND}    ELSE build)
1688 status("    TIFF:"      NOT WITH_TIFF OR TIFF_FOUND        THEN ${TIFF_FOUND}   ELSE build)
1689 status("    JPEG 2000:" NOT WITH_JASPER OR JASPER_FOUND    THEN ${JASPER_FOUND} ELSE build)
1690 status("    OpenEXR:"   WITH_OPENEXR AND OPENEXR_FOUND     THEN YES             ELSE NO)
1691
1692 status("    OpenNI:"    HAVE_OPENNI                        THEN YES             ELSE NO)
1693 status("    OpenNI PrimeSensor Modules:"
1694                         HAVE_OPENNI_PRIME_SENSOR_MODULE    THEN YES             ELSE NO)
1695 status("    XIMEA:"     HAVE_XIMEA  THEN YES ELSE NO)
1696
1697 # video
1698 status("")
1699 if(UNIX AND NOT APPLE)
1700     status("  Video I/O:")
1701     status("    DC1394 1.x:"     HAVE_DC1394         THEN YES ELSE NO)
1702     status("    DC1394 2.x:"     HAVE_DC1394_2       THEN YES ELSE NO)
1703     status("    FFMPEG:"         HAVE_FFMPEG         THEN YES ELSE NO)
1704     status("      codec:"        HAVE_FFMPEG_CODEC   THEN YES ELSE NO)
1705     status("      format:"       HAVE_FFMPEG_FORMAT  THEN YES ELSE NO)
1706     status("      util:"         HAVE_FFMPEG_UTIL    THEN YES ELSE NO)
1707     status("      swscale:"      HAVE_FFMPEG_SWSCALE THEN YES ELSE NO)
1708     status("      gentoo-style:" HAVE_GENTOO_FFMPEG  THEN YES ELSE NO)
1709     status("    GStreamer:"      HAVE_GSTREAMER      THEN YES ELSE NO)
1710     status("    UniCap:"         HAVE_UNICAP         THEN YES ELSE NO)
1711     status("    PvAPI:"          HAVE_PVAPI          THEN YES ELSE NO)
1712     status("    V4L/V4L2:"       HAVE_LIBV4L         THEN Using libv4l ELSE ${HAVE_CAMV4L}/${HAVE_CAMV4L2})
1713     status("    Xine:"           HAVE_XINE           THEN YES ELSE NO)
1714
1715     if(ANDROID)
1716         if(WITH_ANDROID_CAMERA)
1717             status("    AndroidNativeCamera:" BUILD_ANDROID_CAMERA_WRAPPER THEN "build for Android ${ANDROID_VERSION}" ELSE "use prebuilt libraries")
1718         else()
1719             status("    AndroidNativeCamera:" "NO (native camera requires Android API level 8 or higher)")
1720         endif()
1721     endif()
1722 elseif(APPLE)
1723         if(NOT IOS)
1724                 status("  Video I/O:"        WITH_QUICKTIME      THEN QuickTime ELSE QTKit)
1725         else()
1726                 status("  Video I/O: AVFoundation")
1727         endif()         
1728 elseif(WIN32)
1729     status("  Video I/O:"        HAVE_VIDEOINPUT     THEN DirectShow ELSE NO)
1730 endif()
1731
1732 # Other third-party libraries
1733 status("")
1734 status("  Other third-party libraries:")
1735
1736 if(WITH_IPP AND IPP_FOUND)
1737     status("    Use IPP:" "${IPP_LATEST_VERSION_STR} [${IPP_LATEST_VERSION_MAJOR}.${IPP_LATEST_VERSION_MINOR}.${IPP_LATEST_VERSION_BUILD}]")
1738     status("         at:" "${IPP_ROOT_DIR}")
1739 else()
1740     status("    Use IPP:"   WITH_IPP AND NOT IPP_FOUND THEN IPP not found ELSE NO)
1741 endif()
1742
1743 status("    Use TBB:" HAVE_TBB THEN YES ELSE NO)
1744
1745 if(UNIX)
1746     status("    Use ThreadingFramework:" HAVE_THREADING_FRAMEWORK THEN YES ELSE NO)
1747 endif()
1748
1749 status("    Use Cuda:"  HAVE_CUDA  THEN YES ELSE NO)
1750 status("    Use Eigen:" HAVE_EIGEN THEN YES ELSE NO)
1751
1752 # interfaces to other languages
1753 status("")
1754 status("  Interfaces:")
1755 status("    Python:"              BUILD_NEW_PYTHON_SUPPORT THEN YES ELSE NO)
1756 status("    Python interpreter:"  PYTHON_EXECUTABLE        THEN "${PYTHON_EXECUTABLE} (ver ${PYTHON_VERSION_MAJOR_MINOR})" ELSE NO)
1757 status("    Python numpy:"        PYTHON_USE_NUMPY         THEN YES ELSE "NO (Python wrappers will not be generated)")
1758 if(ANDROID AND ANDROID_API_LEVEL LESS 8)
1759     status("    Java:" "NO (Java API requires Android API level 8 or higher)")
1760 else()
1761     status("    Java:" BUILD_JAVA_SUPPORT THEN YES ELSE NO)
1762 endif()
1763
1764 if(ANDROID)
1765     status("    android tool:"    ANDROID_EXECUTABLE       THEN "${ANDROID_EXECUTABLE} (${ANDROID_TOOLS_Pkg_Desc})" ELSE NO)
1766     status("    ant:"             ANT_EXECUTABLE           THEN "${ANT_EXECUTABLE} (ver ${ANT_VERSION})" ELSE NO)
1767 endif()
1768
1769 # documentation
1770 status("")
1771 status("  Documentation:")
1772 status("    Sphinx:"              HAVE_SPHINX              THEN "${SPHINX_BUILD} (ver ${SPHINX_VERSION})" ELSE NO)
1773 status("    PdfLaTeX compiler:"   PDFLATEX_COMPILER        THEN "${PDFLATEX_COMPILER}" ELSE NO)
1774 if (BUILD_DOCS AND HAVE_SPHINX)
1775     status("    Build Documentation:" PDFLATEX_COMPILER THEN YES ELSE "YES (only HTML without math formulas)")
1776 else()
1777     status("    Build Documentation:" NO)
1778 endif()
1779
1780 # samples and tests
1781 status("")
1782 status("  Tests and samples:")
1783 status("    Tests:"             BUILD_TESTS       THEN YES ELSE NO)
1784 status("    Performance tests:" BUILD_PERF_TESTS  THEN YES ELSE NO)
1785 status("    Examples:"          BUILD_EXAMPLES    THEN YES ELSE NO)
1786
1787 if(ANDROID)
1788    status("    Android tests:" BUILD_TESTS AND CAN_BUILD_ANDROID_PROJECTS THEN YES ELSE NO)
1789    status("    Android examples:" BUILD_ANDROID_EXAMPLES THEN YES ELSE NO)
1790 endif()
1791
1792 # auxiliary
1793 status("")
1794 status("  Install path:" "${CMAKE_INSTALL_PREFIX}")
1795 status("")
1796 status("  cvconfig.h is in:" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}")
1797 status("-----------------------------------------------------------------")
1798 status("")
1799
1800 # warn in the case of in-source build
1801 if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
1802     message(WARNING "The source directory is the same as binary directory. \"make clean\" may damage the source tree")
1803 endif()