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