1 # Search packages for host system instead of packages for target system
2 # in case of cross compilation thess macro should be defined by toolchain file
3 if(NOT COMMAND find_host_package)
4 macro(find_host_package)
8 if(NOT COMMAND find_host_program)
9 macro(find_host_program)
14 # adds include directories in such way that directories from the OpenCV source tree go first
15 function(ocv_include_directories)
18 get_filename_component(__abs_dir "${dir}" ABSOLUTE)
19 if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}" OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}")
20 list(APPEND __add_before "${dir}")
22 include_directories(AFTER SYSTEM "${dir}")
25 include_directories(BEFORE ${__add_before})
28 # clears all passed variables
35 set(OCV_COMPILER_FAIL_REGEX
36 "command line option .* is valid for .* but not for C\\+\\+" # GNU
37 "command line option .* is valid for .* but not for C" # GNU
38 "unrecognized .*option" # GNU
39 "unknown .*option" # Clang
40 "ignoring unknown option" # MSVC
41 "warning D9002" # MSVC, any lang
42 "option .*not supported" # Intel
43 "[Uu]nknown option" # HP
44 "[Ww]arning: [Oo]ption" # SunPro
45 "command option .* is not recognized" # XL
46 "not supported in this configuration; ignored" # AIX
47 "File with unknown suffix passed to linker" # PGI
48 "WARNING: unknown flag:" # Open64
51 MACRO(ocv_check_compiler_flag LANG FLAG RESULT)
52 if(NOT DEFINED ${RESULT})
53 if("_${LANG}_" MATCHES "_CXX_")
54 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx")
55 if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
56 FILE(WRITE "${_fname}" "int main() { return 0; }\n")
58 FILE(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
60 elseif("_${LANG}_" MATCHES "_C_")
61 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c")
62 if("${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
63 FILE(WRITE "${_fname}" "int main(void) { return 0; }\n")
65 FILE(WRITE "${_fname}" "#pragma\nint main(void) { return 0; }\n")
67 elseif("_${LANG}_" MATCHES "_OBJCXX_")
68 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.mm")
69 if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
70 FILE(WRITE "${_fname}" "int main() { return 0; }\n")
72 FILE(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
78 MESSAGE(STATUS "Performing Test ${RESULT}")
82 COMPILE_DEFINITIONS "${FLAG}"
83 OUTPUT_VARIABLE OUTPUT)
85 FOREACH(_regex ${OCV_COMPILER_FAIL_REGEX})
86 IF("${OUTPUT}" MATCHES "${_regex}")
93 SET(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}")
94 MESSAGE(STATUS "Performing Test ${RESULT} - Success")
96 MESSAGE(STATUS "Performing Test ${RESULT} - Failed")
97 SET(${RESULT} "" CACHE INTERNAL "Test ${RESULT}")
105 macro(ocv_check_flag_support lang flag varname)
106 if("_${lang}_" MATCHES "_CXX_")
108 elseif("_${lang}_" MATCHES "_C_")
110 elseif("_${lang}_" MATCHES "_OBJCXX_")
116 string(TOUPPER "${flag}" ${varname})
117 string(REGEX REPLACE "^(/|-)" "HAVE_${_lang}_" ${varname} "${${varname}}")
118 string(REGEX REPLACE " -|-|=| |\\." "_" ${varname} "${${varname}}")
120 ocv_check_compiler_flag("${_lang}" "${ARGN} ${flag}" ${${varname}})
124 macro(ocv_warnings_disable)
125 if(NOT ENABLE_NOISY_WARNINGS)
127 set(_msvc_warnings "")
128 set(_gxx_warnings "")
130 if(arg MATCHES "^CMAKE_")
131 list(APPEND _flag_vars ${arg})
132 elseif(arg MATCHES "^/wd")
133 list(APPEND _msvc_warnings ${arg})
134 elseif(arg MATCHES "^-W")
135 list(APPEND _gxx_warnings ${arg})
138 if(MSVC AND _msvc_warnings AND _flag_vars)
139 foreach(var ${_flag_vars})
140 foreach(warning ${_msvc_warnings})
141 set(${var} "${${var}} ${warning}")
144 elseif((CMAKE_COMPILER_IS_GNUCXX OR (UNIX AND CV_ICC)) AND _gxx_warnings AND _flag_vars)
145 foreach(var ${_flag_vars})
146 foreach(warning ${_gxx_warnings})
147 if(NOT warning MATCHES "^-Wno-")
148 string(REPLACE "${warning}" "" ${var} "${${var}}")
149 string(REPLACE "-W" "-Wno-" warning "${warning}")
151 ocv_check_flag_support(${var} "${warning}" _varname)
153 set(${var} "${${var}} ${warning}")
159 unset(_msvc_warnings)
161 endif(NOT ENABLE_NOISY_WARNINGS)
164 # Provides an option that the user can optionally select.
165 # Can accept condition to control when option is available for user.
167 # option(<option_variable> "help string describing the option" <initial value or boolean expression> [IF <condition>])
168 macro(OCV_OPTION variable description value)
169 set(__value ${value})
171 set(__varname "__value")
173 if(arg STREQUAL "IF" OR arg STREQUAL "if")
174 set(__varname "__condition")
176 list(APPEND ${__varname} ${arg})
180 if("${__condition}" STREQUAL "")
181 set(__condition 2 GREATER 1)
185 if("${__value}" MATCHES ";")
187 option(${variable} "${description}" ON)
189 option(${variable} "${description}" OFF)
191 elseif(DEFINED ${__value})
193 option(${variable} "${description}" ON)
195 option(${variable} "${description}" OFF)
198 option(${variable} "${description}" ${__value})
201 unset(${variable} CACHE)
208 # Macros that checks if module have been installed.
209 # After it adds module to build and define
210 # constants passed as second arg
211 macro(CHECK_MODULE module_name define)
214 set(ALIAS ALIASOF_${module_name})
215 set(ALIAS_FOUND ${ALIAS}_FOUND)
216 set(ALIAS_INCLUDE_DIRS ${ALIAS}_INCLUDE_DIRS)
217 set(ALIAS_LIBRARY_DIRS ${ALIAS}_LIBRARY_DIRS)
218 set(ALIAS_LIBRARIES ${ALIAS}_LIBRARIES)
220 PKG_CHECK_MODULES(${ALIAS} ${module_name})
224 foreach(P "${ALIAS_INCLUDE_DIRS}")
226 list(APPEND HIGHGUI_INCLUDE_DIRS ${${P}})
230 foreach(P "${ALIAS_LIBRARY_DIRS}")
232 list(APPEND HIGHGUI_LIBRARY_DIRS ${${P}})
236 list(APPEND HIGHGUI_LIBRARIES ${${ALIAS_LIBRARIES}})
242 set(OPENCV_BUILD_INFO_FILE "${OpenCV_BINARY_DIR}/version_string.tmp")
243 file(REMOVE "${OPENCV_BUILD_INFO_FILE}")
244 function(ocv_output_status msg)
245 message(STATUS "${msg}")
246 string(REPLACE "\\" "\\\\" msg "${msg}")
247 string(REPLACE "\"" "\\\"" msg "${msg}")
248 file(APPEND "${OPENCV_BUILD_INFO_FILE}" "\"${msg}\\n\"\n")
251 macro(ocv_finalize_status)
252 if(NOT OPENCV_SKIP_STATUS_FINALIZATION)
253 if(TARGET opencv_core)
254 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENCV_BUILD_INFO_FILE}" "${opencv_core_BINARY_DIR}/version_string.inc" OUTPUT_QUIET)
260 # Status report function.
261 # Automatically align right column and selects text based on condition.
264 # status(<heading> <value1> [<value2> ...])
265 # status(<heading> <condition> THEN <text for TRUE> ELSE <text for FALSE> )
266 function(status text)
271 set(status_current_name "cond")
273 if(arg STREQUAL "THEN")
274 set(status_current_name "then")
275 elseif(arg STREQUAL "ELSE")
276 set(status_current_name "else")
278 list(APPEND status_${status_current_name} ${arg})
282 if(DEFINED status_cond)
283 set(status_placeholder_length 32)
284 string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder)
285 string(LENGTH "${text}" status_text_length)
286 if(status_text_length LESS status_placeholder_length)
287 string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
288 elseif(DEFINED status_then OR DEFINED status_else)
289 ocv_output_status("${text}")
290 set(status_text "${status_placeholder}")
292 set(status_text "${text}")
295 if(DEFINED status_then OR DEFINED status_else)
297 string(REPLACE ";" " " status_then "${status_then}")
298 string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}")
299 ocv_output_status("${status_text} ${status_then}")
301 string(REPLACE ";" " " status_else "${status_else}")
302 string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}")
303 ocv_output_status("${status_text} ${status_else}")
306 string(REPLACE ";" " " status_cond "${status_cond}")
307 string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}")
308 ocv_output_status("${status_text} ${status_cond}")
311 ocv_output_status("${text}")
316 # splits cmake libraries list of format "general;item1;debug;item2;release;item3" to two lists
317 macro(ocv_split_libs_list lst lstdbg lstopt)
321 foreach(word ${${lst}})
322 if(word STREQUAL "debug" OR word STREQUAL "optimized")
323 set(perv_keyword ${word})
324 elseif(word STREQUAL "general")
326 elseif(perv_keyword STREQUAL "debug")
327 list(APPEND ${lstdbg} "${word}")
329 elseif(perv_keyword STREQUAL "optimized")
330 list(APPEND ${lstopt} "${word}")
333 list(APPEND ${lstdbg} "${word}")
334 list(APPEND ${lstopt} "${word}")
341 # remove all matching elements from the list
342 macro(ocv_list_filterout lst regex)
343 foreach(item ${${lst}})
344 if(item MATCHES "${regex}")
345 list(REMOVE_ITEM ${lst} "${item}")
351 # stable & safe duplicates removal macro
352 macro(ocv_list_unique __lst)
354 list(REMOVE_DUPLICATES ${__lst})
359 # safe list reversal macro
360 macro(ocv_list_reverse __lst)
362 list(REVERSE ${__lst})
367 # safe list sorting macro
368 macro(ocv_list_sort __lst)
375 # add prefix to each item in the list
376 macro(ocv_list_add_prefix LST PREFIX)
378 foreach(item ${${LST}})
379 list(APPEND __tmp "${PREFIX}${item}")
386 # add suffix to each item in the list
387 macro(ocv_list_add_suffix LST SUFFIX)
389 foreach(item ${${LST}})
390 list(APPEND __tmp "${item}${SUFFIX}")
397 # gets and removes the first element from list
398 macro(ocv_list_pop_front LST VAR)
400 list(GET ${LST} 0 ${VAR})
401 list(REMOVE_AT ${LST} 0)
408 # simple regex escaping routine (does not cover all cases!!!)
409 macro(ocv_regex_escape var regex)
410 string(REGEX REPLACE "([+.*^$])" "\\\\1" ${var} "${regex}")
414 # convert list of paths to full paths
415 macro(ocv_convert_to_full_paths VAR)
418 foreach(path ${${VAR}})
419 get_filename_component(${VAR} "${path}" ABSOLUTE)
420 list(APPEND __tmp "${${VAR}}")
428 # read set of version defines from the header file
429 macro(ocv_parse_header FILENAME FILE_VAR)
431 set(__parnet_scope OFF)
433 foreach(name ${ARGN})
434 if("${name}" STREQUAL "PARENT_SCOPE")
435 set(__parnet_scope ON)
436 elseif("${name}" STREQUAL "CACHE")
439 set(vars_regex "${vars_regex}|${name}")
441 set(vars_regex "${name}")
444 if(EXISTS "${FILENAME}")
445 file(STRINGS "${FILENAME}" ${FILE_VAR} REGEX "#define[ \t]+(${vars_regex})[ \t]+[0-9]+" )
449 foreach(name ${ARGN})
450 if(NOT "${name}" STREQUAL "PARENT_SCOPE" AND NOT "${name}" STREQUAL "CACHE")
452 if(${FILE_VAR} MATCHES ".+[ \t]${name}[ \t]+([0-9]+).*")
453 string(REGEX REPLACE ".+[ \t]${name}[ \t]+([0-9]+).*" "\\1" ${name} "${${FILE_VAR}}")
458 set(${name} ${${name}} CACHE INTERNAL "${name} parsed from ${FILENAME}" FORCE)
459 elseif(__parnet_scope)
460 set(${name} "${${name}}" PARENT_SCOPE)
469 # read single version define from the header file
470 macro(ocv_parse_header2 LIBNAME HDR_PATH VARNAME)
471 ocv_clear_vars(${LIBNAME}_VERSION_MAJOR
472 ${LIBNAME}_VERSION_MAJOR
473 ${LIBNAME}_VERSION_MINOR
474 ${LIBNAME}_VERSION_PATCH
475 ${LIBNAME}_VERSION_TWEAK
476 ${LIBNAME}_VERSION_STRING)
478 if(EXISTS "${HDR_PATH}")
479 file(STRINGS "${HDR_PATH}" ${LIBNAME}_H REGEX "^#define[ \t]+${VARNAME}[ \t]+\"[^\"]*\".*$" LIMIT_COUNT 1)
483 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MAJOR "${${LIBNAME}_H}")
484 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MINOR "${${LIBNAME}_H}")
485 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_PATCH "${${LIBNAME}_H}")
486 set(${LIBNAME}_VERSION_MAJOR ${${LIBNAME}_VERSION_MAJOR} ${ARGN})
487 set(${LIBNAME}_VERSION_MINOR ${${LIBNAME}_VERSION_MINOR} ${ARGN})
488 set(${LIBNAME}_VERSION_PATCH ${${LIBNAME}_VERSION_PATCH} ${ARGN})
489 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}.${${LIBNAME}_VERSION_PATCH}")
491 # append a TWEAK version if it exists:
492 set(${LIBNAME}_VERSION_TWEAK "")
493 if("${${LIBNAME}_H}" MATCHES "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.[0-9]+\\.([0-9]+).*$")
494 set(${LIBNAME}_VERSION_TWEAK "${CMAKE_MATCH_1}" ${ARGN})
496 if(${LIBNAME}_VERSION_TWEAK)
497 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}.${${LIBNAME}_VERSION_TWEAK}" ${ARGN})
499 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}" ${ARGN})
504 # read single version info from the pkg file
505 macro(ocv_parse_pkg LIBNAME PKG_PATH SCOPE)
506 if(EXISTS "${PKG_PATH}/${LIBNAME}.pc")
507 file(STRINGS "${PKG_PATH}/${LIBNAME}.pc" line_to_parse REGEX "^Version:[ \t]+[0-9.]*.*$" LIMIT_COUNT 1)
508 STRING(REGEX REPLACE ".*Version: ([^ ]+).*" "\\1" ALIASOF_${LIBNAME}_VERSION "${line_to_parse}" )
512 ################################################################################################
513 # short command to setup source group
514 function(ocv_source_group group)
515 cmake_parse_arguments(OCV_SOURCE_GROUP "" "" "GLOB" ${ARGN})
516 file(GLOB srcs ${OCV_SOURCE_GROUP_GLOB})
517 source_group(${group} FILES ${srcs})