]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/CMakeLists.txt
included [OPENCV_]EXTRA_C_FLAGS into the real command-line passed to the compiler
[opencv.git] / opencv / 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 # it _must_ go before PROJECT(OpenCV) in order to work
15 if (NOT CMAKE_INSTALL_PREFIX)
16     if (WIN32)
17         set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR} CACHE INTERNAL "" FORCE)
18     elseif()
19         set(CMAKE_INSTALL_PREFIX "/usr" CACHE INTERNAL "" FORCE)
20     endif()
21 endif()
22
23 set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
24 set(CMAKE_C_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
25 set(CMAKE_C_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
26 set(CMAKE_CXX_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
27 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
28 set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
29 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
30 set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
31 set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
32 set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "" FORCE)
33 set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "" FORCE)
34
35 project(OpenCV)
36
37 cmake_minimum_required(VERSION 2.4)
38
39 if(MSVC)
40     set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE)
41 endif()
42
43 # --------------------------------------------------------------
44 # Indicate CMake 2.7 and above that we don't want to mix relative
45 #  and absolute paths in linker lib lists.
46 # Run "cmake --help-policy CMP0003" for more information.
47 # --------------------------------------------------------------
48 if(COMMAND cmake_policy)
49     cmake_policy(SET CMP0003 NEW)
50 endif()
51
52 # ----------------------------------------------------------------------------
53 #  Current version number:
54 # ----------------------------------------------------------------------------
55 set(OPENCV_VERSION "1.1.0")
56
57 string(REGEX MATCHALL "[0-9]" OPENCV_VERSION_PARTS "${OPENCV_VERSION}")
58
59 list(GET OPENCV_VERSION_PARTS 0 OPENCV_VERSION_MAJOR)
60 list(GET OPENCV_VERSION_PARTS 1 OPENCV_VERSION_MINOR)
61 list(GET OPENCV_VERSION_PARTS 2 OPENCV_VERSION_PATCH)
62
63 set(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}")
64
65 if(WIN32)
66         # Postfix of DLLs:
67         set(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}")
68         set(OPENCV_DEBUG_POSTFIX d)
69 else()
70         # Postfix of so's:
71         #set(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}")
72         set(OPENCV_DLLVERSION "")
73         set(OPENCV_DEBUG_POSTFIX)
74 endif()
75
76
77 # ----------------------------------------------------------------------------
78 #  Variables for cvconfig.h.cmake
79 # ----------------------------------------------------------------------------
80 set(PACKAGE "opencv")
81 set(PACKAGE_BUGREPORT "opencvlibrary-devel@lists.sourceforge.net")
82 set(PACKAGE_NAME "opencv")
83 set(PACKAGE_STRING "${PACKAGE} ${OPENCV_VERSION}")
84 set(PACKAGE_TARNAME "${PACKAGE}")
85 set(PACKAGE_VERSION "${OPENCV_VERSION}")
86
87 # ----------------------------------------------------------------------------
88 #  Autodetect if we are in a SVN repository
89 # ----------------------------------------------------------------------------
90 find_program(SVNVERSION_PATH svnversion)
91 mark_as_advanced(force SVNVERSION_PATH)
92 if(SVNVERSION_PATH)
93     message(STATUS "Extracting svn version, please wait...")
94     execute_process(COMMAND ${SVNVERSION_PATH} -n ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE SVNVERSION_RESULT)
95
96     if(SVNVERSION_RESULT MATCHES "exported")
97        # This is NOT a svn repository:
98        set(OPENCV_SVNVERSION "")
99     else()
100         set(OPENCV_SVNVERSION " svn:${SVNVERSION_RESULT}")
101     endif()
102
103     message(STATUS "SVNVERSION: ${OPENCV_SVNVERSION}")
104 else()
105     # We don't have svnversion:
106     set(OPENCV_SVNVERSION "")
107 endif()
108
109 # ----------------------------------------------------------------------------
110 # Detect GNU version:
111 # ----------------------------------------------------------------------------
112 if(CMAKE_COMPILER_IS_GNUCXX)
113     execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
114                   OUTPUT_VARIABLE CMAKE_OPENCV_GCC_VERSION_FULL
115                   OUTPUT_STRIP_TRAILING_WHITESPACE)
116
117     # Typical output in CMAKE_OPENCV_GCC_VERSION_FULL: "c+//0 (whatever) 4.2.3 (...)"
118     #  Look for the version number
119     string(REGEX MATCH "[0-9].[0-9].[0-9]" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
120
121     # Split the three parts:
122     string(REGEX MATCHALL "[0-9]" CMAKE_OPENCV_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}")
123
124     list(GET CMAKE_OPENCV_GCC_VERSIONS 0 CMAKE_OPENCV_GCC_VERSION_MAJOR)
125     list(GET CMAKE_OPENCV_GCC_VERSIONS 1 CMAKE_OPENCV_GCC_VERSION_MINOR)
126
127     set(CMAKE_OPENCV_GCC_VERSION ${CMAKE_OPENCV_GCC_VERSION_MAJOR}${CMAKE_OPENCV_GCC_VERSION_MINOR})
128     message(STATUS "Detected version of GNU GCC: ${CMAKE_OPENCV_GCC_VERSION}")
129 endif()
130
131 # ----------------------------------------------------------------------------
132 #               CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
133 # ----------------------------------------------------------------------------
134
135 # Build/install (or not) some apps:
136 # ===================================================
137 set(BUILD_EXAMPLES OFF CACHE BOOL "Build all examples")
138 set(INSTALL_C_EXAMPLES OFF CACHE BOOL "Install C examples")
139 set(INSTALL_PYTHON_EXAMPLES OFF CACHE BOOL "Install Python examples")
140 set(INSTALL_OCTAVE_EXAMPLES OFF CACHE BOOL "Install Octave examples")
141
142 # Build tests:
143 # ===================================================
144 set(BUILD_TESTS ON CACHE BOOL "Build tests")
145
146 # Build 3rdparty libraries under unix
147 # ===================================================
148 if(WIN32)
149         set(OPENCV_BUILD_3RDPARTY_LIBS TRUE  CACHE BOOL "Build 3rd party libraries")
150 else()
151         set(OPENCV_BUILD_3RDPARTY_LIBS FALSE CACHE BOOL "Build 3rd party libraries")
152 endif()
153
154 if(UNIX)
155     include(OpenCVFindPkgConfig.cmake OPTIONAL)
156     include(CheckFunctionExists)
157     include(CheckIncludeFile)
158 endif()
159
160 set(OPENCV_ENABLE_OPENMP OFF CACHE BOOL "")
161
162 if(CMAKE_COMPILER_IS_GNUCXX)
163     set(OPENCV_ENABLE_PROFILING OFF CACHE BOOL "Enable profiling in the GCC compiler (Add flags: -g -pg)")
164     set(OPENCV_USE_OMIT_FRAME_POINTER ON CACHE BOOL "Enable -fomit-frame-pointer for GCC")
165     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES arm*)
166         # We can use only -O2 because the -O3 causes gcc crash
167         set(OPENCV_USE_O2 ON CACHE BOOL "Enable -O2 for GCC")
168         set(OPENCV_USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC")
169     endif()
170     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64*)
171         set(OPENCV_USE_O3 ON CACHE BOOL "Enable -O3 for GCC")
172         set(OPENCV_USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC")
173         set(OPENCV_USE_MMX ON CACHE BOOL "Enable MMX for GCC")
174         set(OPENCV_USE_SSE ON CACHE BOOL "Enable SSE for GCC")
175         set(OPENCV_USE_SSE2 ON CACHE BOOL "Enable SSE2 for GCC")
176         set(OPENCV_USE_SSE3 ON CACHE BOOL "Enable SSE3 for GCC")
177     endif()
178     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64*)
179         set(OPENCV_USE_O3 ON CACHE BOOL "Enable -O3 for GCC")
180         set(OPENCV_USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC")
181         set(OPENCV_USE_MMX ON CACHE BOOL "Enable MMX for GCC")
182         set(OPENCV_USE_SSE ON CACHE BOOL "Enable SSE for GCC")
183         set(OPENCV_USE_SSE2 ON CACHE BOOL "Enable SSE2 for GCC")
184         set(OPENCV_USE_SSE3 ON CACHE BOOL "Enable SSE3 for GCC")
185     endif()
186     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES powerpc*)
187         set(OPENCV_USE_O3 ON CACHE BOOL "Enable -O3 for GCC")
188         set(OPENCV_USE_POWERPC ON CACHE BOOL "Enable PowerPC for GCC")
189     endif ()
190     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686*)
191         set(OPENCV_USE_O3 ON CACHE BOOL "Enable -O3 for GCC")
192         set(OPENCV_USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC")
193         set(OPENCV_USE_MMX ON CACHE BOOL "Enable MMX for GCC")
194                 set(OPENCV_USE_SSE OFF CACHE BOOL "Enable SSE for GCC")
195         set(OPENCV_USE_SSE2 OFF CACHE BOOL "Enable SSE2 for GCC")
196         set(OPENCV_USE_SSE3 OFF CACHE BOOL "Enable SSE3 for GCC")
197         # SSE/SSE2 might probably be not available for some old AMD or VIA processors
198     endif ()
199     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES x86)
200         set(OPENCV_USE_O3 ON CACHE BOOL "Enable -O3 for GCC")
201         set(OPENCV_USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC")
202         set(OPENCV_USE_MMX ON CACHE BOOL "Enable MMX for GCC")
203                 set(OPENCV_USE_SSE OFF CACHE BOOL "Enable SSE for GCC")
204         set(OPENCV_USE_SSE2 OFF CACHE BOOL "Enable SSE2 for GCC")
205         set(OPENCV_USE_SSE3 OFF CACHE BOOL "Enable SSE3 for GCC")
206         # SSE/SSE2 might probably be not available for some old AMD or VIA processors
207     endif ()
208 endif()
209
210 # ===================================================
211 # Macros that checks if module have been installed.
212 # After it adds module to build and define
213 # constants passed as second arg
214 # ===================================================
215
216 macro(CHECK_MODULE module_name define)
217     set(${define} 0)
218     if(PKG_CONFIG_FOUND)
219         set(ALIAS               ALIASOF_${module_name})
220         set(ALIAS_FOUND                 ${ALIAS}_FOUND)
221         set(ALIAS_INCLUDE_DIRS   ${ALIAS}_INCLUDE_DIRS)
222         set(ALIAS_LIBRARY_DIRS   ${ALIAS}_LIBRARY_DIRS)
223         set(ALIAS_LIBRARIES         ${ALIAS}_LIBRARIES)
224
225         PKG_CHECK_MODULES(${ALIAS} ${module_name})
226
227         if (${ALIAS_FOUND})
228             set(${define} 1)
229             foreach(P "${ALIAS_INCLUDE_DIRS}")
230                 list(APPEND HIGHGUI_INCLUDE_DIRS ${${P}})
231             endforeach()
232
233             foreach(P "${ALIAS_LIBRARY_DIRS}")
234                 if (${${P}})
235                     list(APPEND HIGHGUI_LIBRARY_DIRS ${${P}})
236                 endif()
237             endforeach()
238
239             list(APPEND HIGHGUI_LIBRARIES ${${ALIAS_LIBRARIES}})
240         endif()
241     endif()
242 endmacro()
243
244 if(UNIX)
245     if(NOT APPLE)
246         CHECK_MODULE(gtk+-2.0 HAVE_GTK)
247         CHECK_MODULE(gthread-2.0 HAVE_GTHREAD)
248         CHECK_MODULE(gstreamer-base-0.10 HAVE_GSTREAMER)
249     endif()
250
251     CHECK_MODULE(libunicap HAVE_UNICAP_)
252     CHECK_MODULE(libucil HAVE_UNICAP_UCIL)
253     if(HAVE_UNICAP_ AND HAVE_UNICAP_UCIL)
254         set(HAVE_UNICAP 1)
255     endif()
256
257     CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
258     CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT)
259     CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL)
260     CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE)
261     CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG)
262     if(HAVE_FFMPEG_CODEC AND HAVE_FFMPEG_FORMAT AND HAVE_FFMPEG_UTIL)
263         set(HAVE_FFMPEG 1)
264     endif()
265
266     CHECK_MODULE(libdc1394-2 HAVE_DC1394_2)
267     if(NOT HAVE_DC1394_2)
268         CHECK_MODULE(libdc1394 HAVE_DC1394)
269     endif()
270
271     if(NOT APPLE)
272         CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
273         CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
274         CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
275         CHECK_INCLUDE_FILE(pthread.h HAVE_LIBPTHREAD)
276
277         CHECK_MODULE(libxine HAVE_XINE)
278                 CHECK_MODULE(libv4l1 HAVE_LIBV4L)
279         CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
280         CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
281
282                 if(NOT OPENCV_BUILD_3RDPARTY_LIBS)
283                         include(FindPNG)
284                         if(PNG_FOUND)
285                                 CHECK_INCLUDE_FILE(${PNG_PNG_INCLUDE_DIR}/png.h HAVE_PNG_H)
286                                 CHECK_INCLUDE_FILE(${PNG_PNG_INCLUDE_DIR}/libpng/png.h HAVE_LIBPNG_PNG_H)
287                         endif()
288                         include(FindJPEG)
289                         include(FindTIFF)
290                         include(FindJasper)
291                 endif()
292
293         set(OPENCV_LINKER_LIBS dl m pthread rt)
294     else()
295         add_definitions(-DHAVE_ALLOCA -DHAVE_ALLOCA_H -DHAVE_LIBPTHREAD -DHAVE_UNISTD_H)
296     endif()
297 endif()
298
299 set(BUILD_PYTHON_SUPPORT OFF CACHE BOOL "Build with Python support")
300 set(BUILD_OCTAVE_SUPPORT OFF CACHE BOOL "Build with Octave support")
301
302 find_package(SWIG)
303 if(SWIG_FOUND)
304
305     find_package(PythonInterp)
306     find_package(PythonLibs)
307     
308     # cmake 2.4 (at least on Ubuntu 8.04 (hardy)) don't define PYTHONLIBS_FOUND
309     if(NOT PYTHONLIBS_FOUND AND PYTHON_INCLUDE_PATH)
310         set(PYTHONLIBS_FOUND ON)
311     endif(NOT PYTHONLIBS_FOUND AND PYTHON_INCLUDE_PATH)
312     
313     # Build with python if installed:
314     # ===================================================
315     if(PYTHONLIBS_FOUND AND BUILD_PYTHON_SUPPORT)
316         execute_process(COMMAND ${PYTHON_EXECUTABLE} --version
317                   ERROR_VARIABLE PYTHON_VERSION_FULL
318                   OUTPUT_STRIP_TRAILING_WHITESPACE)
319     
320         string(REGEX MATCH "[0-9].[0-9]" PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_FULL}")
321         if(UNIX)
322             set(PYTHON_PLUGIN_INSTALL_PATH lib/python${PYTHON_VERSION_MAJOR_MINOR}/site-packages/opencv)
323         endif()
324         if(WIN32)
325             get_filename_component(PYTHON_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${PYTHON_VERSION_MAJOR_MINOR}\\InstallPath]" ABSOLUTE CACHE)
326             set(PYTHON_PLUGIN_INSTALL_PATH "${PYTHON_PATH}/Lib/site-packages/opencv")
327         endif()
328     endif()
329
330 endif()
331
332 if(WIN32)
333
334 set(IPP_FOUND)
335 foreach(v "6.1" "6.0" "5.3" "5.2" "5.1")
336     if(NOT IPP_FOUND)
337         find_path(IPP_PATH "ippi-${v}.dll"
338             PATHS ${CMAKE_PROGRAM_PATH} ${CMAKE_SYSTEM_PROGRAM_PATH}
339             DOC "The path to IPP DLLs")
340         if(IPP_PATH)
341             file(GLOB IPP_HDRS "${IPP_PATH}/../include")
342             if(IPP_HDRS)
343                 set(IPP_FOUND TRUE)
344             endif()
345         endif()
346     endif()
347 endforeach()
348
349 message(STATUS "IPP detected: ${IPP_FOUND}")
350 set(USE_IPP ${IPP_FOUND} CACHE BOOL "Use IPP when available")
351
352 if(IPP_FOUND AND USE_IPP)
353     add_definitions(-DHAVE_IPP)
354     include_directories("${IPP_PATH}/../include")
355     link_directories("${IPP_PATH}/../lib")
356     set(IPP_LIBS ippsmerged.lib ippsemerged.lib ippimerged.lib ippiemerged.lib
357         ippvmmerged.lib ippvmemerged.lib ippccmerged.lib ippccemerged.lib
358         ippcvmerged.lib ippcvemerged.lib ippcorel.lib)
359 endif()
360
361 endif()
362
363 # ----------------------------------------------------------------------------
364 #                               UPDATE CONFIG FILES & SCRIPTS:
365 #
366 #  CONFIGURE_FILE(InputFile OutputFile [COPYONLY] [ESCAPE_QUOTES] [@ONLY])
367 # If @ONLY is specified, only variables of the form @VAR@ will be
368 #  replaces and ${VAR} will be ignored.
369 #
370 #  A directory will be created for each platform so the "cvconfig.h" file is
371 #   not overwritten if cmake generates code in the same path.
372 # ----------------------------------------------------------------------------
373 add_definitions(-DHAVE_CONFIG_H)
374
375 set(OPENCV_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/" CACHE PATH "Where to create the platform-dependant cvconfig.h")
376
377 message(STATUS "Parsing 'cvconfig.h.cmake'")
378 configure_file("${CMAKE_SOURCE_DIR}/cvconfig.h.cmake" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h")
379
380 # ---------------------------------------------------------------------------
381 # The C+//0 include & link directories:
382 # ---------------------------------------------------------------------------
383 include_directories("."
384     "${OPENCV_CONFIG_FILE_INCLUDE_DIR}"
385     "${CMAKE_SOURCE_DIR}/include"
386     "${CMAKE_SOURCE_DIR}/include/opencv"
387     )
388
389 # ----------------------------------------------------------------------------
390 #                       Set the maximum level of warnings:
391 # ----------------------------------------------------------------------------
392 # Should be set to true for development
393 set(OPENCV_WARNINGS_ARE_ERRORS OFF CACHE BOOL "Treat warnings as errors")
394
395 # Whole program optimization?
396 set(OPENCV_WHOLE_PROGRAM_OPTIMIZATION OFF CACHE BOOL "Flags for whole program optimization.")
397
398 set(EXTRA_C_FLAGS "")
399 set(EXTRA_C_FLAGS_RELEASE "")
400 set(EXTRA_C_FLAGS_DEBUG "")
401 set(EXTRA_EXE_LINKER_FLAGS "")
402 set(EXTRA_EXE_LINKER_FLAGS_RELEASE "")
403 set(EXTRA_EXE_LINKER_FLAGS_DEBUG "")
404
405 if(MSVC)
406     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE")
407     # 64-bit portability warnings, in MSVC8
408     if(MSVC80)
409         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /Wp64")
410     endif()
411
412     set(EXTRA_EXE_LINKER_FLAGS_RELEASE "${EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
413
414     # Whole program optimization
415     if(OPENCV_WHOLE_PROGRAM_OPTIMIZATION AND MSVC_VERSION GREATER 1300)
416         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /GL")
417         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
418         set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /LTCG")
419     endif()
420
421     if(OPENCV_ENABLE_OPENMP)
422         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /openmp")
423     endif()
424
425     # Remove unreferenced functions: function level linking
426     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /Gy")
427     set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} /Zi")
428 endif()
429
430 if(CMAKE_COMPILER_IS_GNUCXX)
431     # High level of warnings.
432     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wall")
433
434     # The -Wno-long-long is required in 64bit systems when including sytem headers.
435     if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64*)
436     set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-long-long")
437     endif()
438
439     # We need pthread's
440     if(UNIX)
441         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -pthread")
442     endif()
443
444     if(OPENCV_WARNINGS_ARE_ERRORS)
445         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror")
446     endif()
447
448     # Whole program optimization
449     if(OPENCV_WHOLE_PROGRAM_OPTIMIZATION)
450         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fwhole-program --combine")
451     endif()
452
453     # Other optimizations
454     if(OPENCV_USE_OMIT_FRAME_POINTER)
455        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer")
456     endif()
457     if(OPENCV_USE_O2)
458        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O2")
459     endif()
460     if(OPENCV_USE_O3)
461        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O3")
462     endif()
463     if(OPENCV_USE_FAST_MATH)
464        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -ffast-math")
465     endif()
466     if(OPENCV_USE_POWERPC)
467        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5")
468     endif()
469     if(OPENCV_USE_MMX)
470        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mmmx")
471     endif()
472     # SSE should be disabled under MingW because it generates compiler errors
473     if(OPENCV_USE_SSE)
474        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse")
475     endif()
476     # SSE2 should be disabled under MingW because it generates compiler errors
477     if(OPENCV_USE_SSE2)
478        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse2")
479     endif()
480     # SSE3 should be disabled under MingW because it generates compiler errors
481     if(OPENCV_USE_SSE3 AND NOT MINGW)
482        set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse3")
483     endif()
484
485     # Profiling?
486     if(OPENCV_ENABLE_PROFILING)
487         set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -pg -g")
488     else()
489         # Remove unreferenced functions: function level linking
490         if(NOT APPLE)
491             set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -ffunction-sections")
492         endif()
493     endif()
494
495     # Parallel mode
496     if(OPENCV_ENABLE_OPENMP)
497         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -D_GLIBCXX_PARALLEL -fopenmp")
498     endif()
499
500     set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -DNDEBUG")
501     set(EXTRA_C_FLAGS_DEBUG "${EXTRA_C_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
502 endif()
503
504
505 # Add user supplied extra options (optimization, etc...)
506 # ==========================================================
507 set(OPENCV_EXTRA_C_FLAGS ${EXTRA_C_FLAGS} CACHE STRING "Extra compiler options" FORCE)
508 set(OPENCV_EXTRA_C_FLAGS_RELEASE ${EXTRA_C_FLAGS_RELEASE} CACHE STRING "Extra compiler options for Release build" FORCE)
509 set(OPENCV_EXTRA_C_FLAGS_DEBUG ${EXTRA_C_FLAGS_DEBUG} CACHE STRING "Extra compiler options for Debug build" FORCE)
510 set(OPENCV_EXTRA_EXE_LINKER_FLAGS ${EXTRA_EXE_LINKER_FLAGS} CACHE STRING "Extra linker flags" FORCE)
511 set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE ${EXTRA_EXE_LINKER_FLAGS_RELEASE} CACHE STRING "Extra linker flags for Release build" FORCE)
512 set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG ${EXTRA_EXE_LINKER_FLAGS_DEBUG} CACHE STRING "Extra linker flags for Debug build" FORCE)
513
514 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
515 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
516 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_C_FLAGS_RELEASE}")
517 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${OPENCV_EXTRA_C_FLAGS_RELEASE}")
518 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_C_FLAGS_DEBUG}")
519 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${OPENCV_EXTRA_C_FLAGS_DEBUG}")
520 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
521 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
522 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
523
524 # In case of Makefiles if the user does not setup CMAKE_BUILD_TYPE, assume it's Release:
525 if (${CMAKE_GENERATOR} MATCHES ".*Makefiles")
526     if("${CMAKE_BUILD_TYPE}" STREQUAL "")
527         set(CMAKE_BUILD_TYPE Release)
528     endif()
529 endif()
530
531 if (WIN32 AND MSVC)
532     # avoid warnings from MSVC about overriding the /W* option
533     # we replace /W3 with /W4 only for C++ files,
534     # since all the 3rd-party libraries OpenCV uses are in C,
535     # and we do not care about their warnings.
536     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
537     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
538     string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
539 endif()
540
541 if("${CMAKE_CONFIGURE_LDFLAGS}")
542     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CONFIGURE_LDFLAGS}")
543 endif("${CMAKE_CONFIGURE_LDFLAGS}")
544
545 # ----------------------------------------------------------------------------
546 #                                       PROCESS SUBDIRECTORIES:
547 # ----------------------------------------------------------------------------
548 # Save libs and executables in the same place
549 set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib CACHE PATH "Output directory for libraries" )
550 set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE PATH "Output directory for applications" )
551
552 if(WIN32)
553 set(OPENCV_DOC_INSTALL_PATH doc)
554 else()
555 set(OPENCV_DOC_INSTALL_PATH share/opencv/doc)
556 endif()
557
558 #-----------------------------------
559 # Subdirectories:
560 #-----------------------------------
561 add_subdirectory(src)
562 add_subdirectory(apps)
563 add_subdirectory(doc)
564 add_subdirectory(data)
565
566 if(BUILD_EXAMPLES OR INSTALL_PYTHON_EXAMPLES OR INSTALL_OCTAVE_EXAMPLES)
567     add_subdirectory(samples)
568 endif()
569
570 if(BUILD_TESTS)
571     enable_testing()
572     add_subdirectory(tests)
573 endif()
574
575 add_subdirectory(interfaces)
576 add_subdirectory(3rdparty)
577
578 # --------------------------------------------------------------------------------------------
579 #   Installation for CMake Module:  OpenCVConfig.cmake
580 #  Part 1/3: ${BIN_DIR}/OpenCVConfig.cmake              -> For use *without* "make install"
581 #  Part 2/3: ${BIN_DIR}/unix-install/OpenCVConfig.cmake -> For use with "make install"
582 #  Part 3/3: ${BIN_DIR}/win-install/OpenCVConfig.cmake  -> For use within binary installers/packages
583 # -------------------------------------------------------------------------------------------
584
585 # -------------------------------------------------------------------------------------------
586 #  Part 1/2: ${BIN_DIR}/OpenCVConfig.cmake              -> For use *without* "make install"
587 # -------------------------------------------------------------------------------------------
588
589 # Name of libraries is: libcv.so.1.1.0, etc...
590 #  OPENCV_DLLVERSION must be set to "110", etc..
591 # Already done above.
592
593 # Set CMAKE_INCLUDE_DIRS_CONFIGCMAKE to the list of include directories:
594 set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE)
595 list(APPEND CMAKE_INCLUDE_DIRS_CONFIGCMAKE "${OPENCV_CONFIG_FILE_INCLUDE_DIR}")
596 list(APPEND CMAKE_INCLUDE_DIRS_CONFIGCMAKE "${CMAKE_SOURCE_DIR}/include")
597 list(APPEND CMAKE_INCLUDE_DIRS_CONFIGCMAKE "${CMAKE_SOURCE_DIR}/include/opencv")
598
599 set(CMAKE_LIB_DIRS_CONFIGCMAKE ${LIBRARY_OUTPUT_PATH})
600
601 configure_file("${CMAKE_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig.cmake" IMMEDIATE @ONLY)
602
603 # --------------------------------------------------------------------------------------------
604 #  Part 2/2: ${BIN_DIR}/unix-install/OpenCVConfig.cmake -> For use *with* "make install"
605 # -------------------------------------------------------------------------------------------
606 # Set CMAKE_INCLUDE_DIRS_CONFIGCMAKE to the list of include directories:
607
608 set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}/include/opencv")
609 set(CMAKE_LIB_DIRS_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}/lib")
610
611 #exec_program(${CMAKE_COMMAND} ARGS "-E make_directory \"${CMAKE_BINARY_DIR}/unix-install/\"")
612 exec_program(mkdir ARGS "-p \"${CMAKE_BINARY_DIR}/unix-install/\"")
613 configure_file("${CMAKE_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig.cmake" IMMEDIATE @ONLY)
614
615 if(UNIX)
616     # For a command "FIND_PACKAGE(FOO)", CMake will look at the directory /usr/share|lib/FOO/FOOConfig.cmake, so:
617     install(FILES ${CMAKE_BINARY_DIR}/unix-install/OpenCVConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share/opencv/)
618 endif()
619
620 # --------------------------------------------------------------------------------------------
621 #  Part 3/3: ${BIN_DIR}/win-install/OpenCVConfig.cmake  -> For use within binary installers/packages
622 # -------------------------------------------------------------------------------------------
623 if(WIN32)
624         # Set CMAKE_INCLUDE_DIRS_CONFIGCMAKE to the list of include directories:
625         
626         # This will expand to, for example, <program files>/OpenCV 1.1.0/include
627         set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"\${THIS_OPENCV_CONFIG_PATH}/include\"")
628
629         # This will expand to, for example, <program files>/OpenCV 1.1.0/lib
630         set(CMAKE_LIB_DIRS_CONFIGCMAKE "\"\${THIS_OPENCV_CONFIG_PATH}/lib\"")
631
632         #exec_program(${CMAKE_COMMAND} ARGS "-E make_directory \"${CMAKE_BINARY_DIR}/win-install/\"")
633         exec_program(mkdir ARGS "-p \"${CMAKE_BINARY_DIR}/win-install/\"")
634         configure_file("${CMAKE_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/win-install/OpenCVConfig.cmake" IMMEDIATE @ONLY)
635 endif()
636
637
638 # --------------------------------------------------------------------------------------------
639 #  Part 2/2: ${BIN_DIR}/unix-install/opencv.pc -> For use *with* "make install"
640 # prefix=/usr
641 # exec_prefix=${prefix}
642 # libdir=${exec_prefix}/lib
643 # includedir=${prefix}/include/opencv
644 # -------------------------------------------------------------------------------------------
645 set(prefix              ${CMAKE_INSTALL_PREFIX})
646 set(exec_prefix         "\${prefix}")
647 set(libdir              "\${exec_prefix}/lib")
648 set(includedir          "\${prefix}/include")
649 set(VERSION             ${OPENCV_VERSION})
650
651 configure_file("${CMAKE_SOURCE_DIR}/opencv.pc.cmake.in" "${CMAKE_BINARY_DIR}/unix-install/opencv.pc" @ONLY IMMEDIATE)
652
653 if(UNIX)
654     install(FILES ${CMAKE_BINARY_DIR}/unix-install/opencv.pc DESTINATION lib/pkgconfig)
655 endif()
656
657
658 # ----------------------------------------------------------------------------
659 #   Uninstall target, for "make uninstall"
660 # ----------------------------------------------------------------------------
661 CONFIGURE_FILE(
662   "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
663   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
664   IMMEDIATE @ONLY)
665
666 ADD_CUSTOM_TARGET(uninstall
667   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
668
669
670 # ----------------------------------------------------------------------------
671 #   CPack target
672 # ----------------------------------------------------------------------------
673
674 option(BUILD_PACKAGE "Build a installer with the SDK")
675
676 if(BUILD_PACKAGE)
677
678         configure_file(
679         Package.cmake.in
680         ${CMAKE_BINARY_DIR}/.cpack/Package.cmake
681         @ONLY
682         )
683         
684         install(FILES 
685                 AUTHORS
686                 ChangeLog
687                 COPYING
688                 INSTALL
689                 NEWS
690                 README
691                 THANKS
692                 TODO
693                 DESTINATION ${OPENCV_DOC_INSTALL_PATH}
694         COMPONENT doc
695                 )
696                 
697         include(${CMAKE_BINARY_DIR}/.cpack/Package.cmake)
698         
699 endif()
700
701 # ----------------------------------------------------------------------------
702 #   Sumary:
703 # ----------------------------------------------------------------------------
704 message(STATUS "")
705 message(STATUS "General configuration for opencv ${OPENCV_VERSION} =====================================")
706 message(STATUS "")
707 message(STATUS "    Compiler:                  ${CMAKE_COMPILER}")
708 message(STATUS "    C++ flags (Release):       ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
709 message(STATUS "    C++ flags (Debug):         ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
710 if(WIN32)
711 message(STATUS "    Linker flags (Release):    ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
712 message(STATUS "    Linker flags (Debug):      ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
713 else()
714 message(STATUS "    Linker flags (Release):    ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
715 message(STATUS "    Linker flags (Debug):      ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
716 endif()
717
718 if(UNIX)
719 if(NOT APPLE)
720 message(STATUS "")
721 message(STATUS "  GUI: ")
722 message(STATUS "    GTK+ 2.x:                  ${HAVE_GTK}")
723 message(STATUS "    GThread:                   ${HAVE_GTHREAD}")
724 message(STATUS "")
725 if(NOT OPENCV_BUILD_3RDPARTY_LIBS)
726 message(STATUS "  Image I/O: ")
727 message(STATUS "    JPEG:                      ${JPEG_FOUND}")
728 message(STATUS "    PNG:                       ${PNG_FOUND}")
729 message(STATUS "    TIFF:                      ${TIFF_FOUND}")
730 message(STATUS "    JASPER:                    ${JASPER_FOUND}")
731 else()
732 message(STATUS "  Image I/O: ")
733 message(STATUS "    JPEG:                      build")
734 message(STATUS "    PNG:                       build")
735 message(STATUS "    TIFF:                      build")
736 message(STATUS "    JASPER:                    build")
737 endif()
738 endif()
739 message(STATUS "")
740 message(STATUS "  Video I/O: ")
741 message(STATUS "    DC1394 1.x:                ${HAVE_DC1394}")
742 message(STATUS "    DC1394 2.x:                ${HAVE_DC1394_2}")
743 message(STATUS "    FFMPEG:                    ${HAVE_FFMPEG}")
744 message(STATUS "    GStreamer:                 ${HAVE_GSTREAMER}")
745 message(STATUS "    UniCap:                    ${HAVE_UNICAP}")
746 if(HAVE_LIBV4L)
747 message(STATUS "    V4L/V4L2:                  Using libv4l")
748 else()
749 message(STATUS "    V4L/V4L2:                  ${HAVE_CAMV4L}/${HAVE_CAMV4L2}")
750 endif()
751 message(STATUS "    Xine:                      ${HAVE_XINE}")
752 endif()
753 message(STATUS "")
754 message(STATUS "  Interfaces: ")
755 if(PYTHONLIBS_FOUND AND BUILD_PYTHON_SUPPORT)
756 message(STATUS "    Python:                    1")
757 else()
758 message(STATUS "    Python:                    0")
759 endif()
760 if(IPP_FOUND AND USE_IPP)
761 message(STATUS "    Use IPP:                   1")
762 else()
763 message(STATUS "    Use IPP:                   0")
764 endif()
765 message(STATUS "")
766 message(STATUS "    Install path:              ${CMAKE_INSTALL_PREFIX}")
767 message(STATUS "")
768 message(STATUS "    cvconfig.h is in:          ${OPENCV_CONFIG_FILE_INCLUDE_DIR}")
769 message(STATUS "-----------------------------------------------------------------")
770 message(STATUS "")
771
772 #----------------------------------------------------------------------------
773 #   Generate the OpenCVConfig.cmake file for unix
774 #      installation in CMAKE_INSTALL_PREFIX
775 #----------------------------------------------------------------------------