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