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)
15 # Note: it doesn't support lists in arguments
17 # ocv_assert(MyLib_FOUND)
18 # ocv_assert(DEFINED MyLib_INCLUDE_DIRS)
21 string(REPLACE ";" " " __assert_msg "${ARGN}")
22 message(AUTHOR_WARNING "Assertion failed: ${__assert_msg}")
26 macro(ocv_check_environment_variables)
28 if(NOT DEFINED ${_var} AND DEFINED ENV{${_var}})
29 set(__value "$ENV{${_var}}")
30 file(TO_CMAKE_PATH "${__value}" __value) # Assume that we receive paths
31 set(${_var} "${__value}")
32 message(STATUS "Update variable ${_var} from environment: ${${_var}}")
37 # adds include directories in such way that directories from the OpenCV source tree go first
38 function(ocv_include_directories)
41 get_filename_component(__abs_dir "${dir}" ABSOLUTE)
42 if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}" OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}")
43 list(APPEND __add_before "${dir}")
45 include_directories(AFTER SYSTEM "${dir}")
48 include_directories(BEFORE ${__add_before})
51 # clears all passed variables
58 set(OCV_COMPILER_FAIL_REGEX
59 "command line option .* is valid for .* but not for C\\+\\+" # GNU
60 "command line option .* is valid for .* but not for C" # GNU
61 "unrecognized .*option" # GNU
62 "unknown .*option" # Clang
63 "ignoring unknown option" # MSVC
64 "warning D9002" # MSVC, any lang
65 "option .*not supported" # Intel
66 "[Uu]nknown option" # HP
67 "[Ww]arning: [Oo]ption" # SunPro
68 "command option .* is not recognized" # XL
69 "not supported in this configuration; ignored" # AIX
70 "File with unknown suffix passed to linker" # PGI
71 "WARNING: unknown flag:" # Open64
74 MACRO(ocv_check_compiler_flag LANG FLAG RESULT)
75 if(NOT DEFINED ${RESULT})
76 if("_${LANG}_" MATCHES "_CXX_")
77 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx")
78 if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
79 FILE(WRITE "${_fname}" "int main() { return 0; }\n")
81 FILE(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
83 elseif("_${LANG}_" MATCHES "_C_")
84 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c")
85 if("${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
86 FILE(WRITE "${_fname}" "int main(void) { return 0; }\n")
88 FILE(WRITE "${_fname}" "#pragma\nint main(void) { return 0; }\n")
90 elseif("_${LANG}_" MATCHES "_OBJCXX_")
91 set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.mm")
92 if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
93 FILE(WRITE "${_fname}" "int main() { return 0; }\n")
95 FILE(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
101 MESSAGE(STATUS "Performing Test ${RESULT}")
102 TRY_COMPILE(${RESULT}
103 "${CMAKE_BINARY_DIR}"
105 COMPILE_DEFINITIONS "${FLAG}"
106 OUTPUT_VARIABLE OUTPUT)
108 FOREACH(_regex ${OCV_COMPILER_FAIL_REGEX})
109 IF("${OUTPUT}" MATCHES "${_regex}")
116 SET(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}")
117 MESSAGE(STATUS "Performing Test ${RESULT} - Success")
119 MESSAGE(STATUS "Performing Test ${RESULT} - Failed")
120 SET(${RESULT} "" CACHE INTERNAL "Test ${RESULT}")
128 macro(ocv_check_flag_support lang flag varname)
129 if("_${lang}_" MATCHES "_CXX_")
131 elseif("_${lang}_" MATCHES "_C_")
133 elseif("_${lang}_" MATCHES "_OBJCXX_")
139 string(TOUPPER "${flag}" ${varname})
140 string(REGEX REPLACE "^(/|-)" "HAVE_${_lang}_" ${varname} "${${varname}}")
141 string(REGEX REPLACE " -|-|=| |\\." "_" ${varname} "${${varname}}")
143 ocv_check_compiler_flag("${_lang}" "${ARGN} ${flag}" ${${varname}})
147 macro(ocv_warnings_disable)
148 if(NOT ENABLE_NOISY_WARNINGS)
150 set(_msvc_warnings "")
151 set(_gxx_warnings "")
153 if(arg MATCHES "^CMAKE_")
154 list(APPEND _flag_vars ${arg})
155 elseif(arg MATCHES "^/wd")
156 list(APPEND _msvc_warnings ${arg})
157 elseif(arg MATCHES "^-W")
158 list(APPEND _gxx_warnings ${arg})
161 if(MSVC AND _msvc_warnings AND _flag_vars)
162 foreach(var ${_flag_vars})
163 foreach(warning ${_msvc_warnings})
164 set(${var} "${${var}} ${warning}")
167 elseif((CMAKE_COMPILER_IS_GNUCXX OR (UNIX AND CV_ICC)) AND _gxx_warnings AND _flag_vars)
168 foreach(var ${_flag_vars})
169 foreach(warning ${_gxx_warnings})
170 if(NOT warning MATCHES "^-Wno-")
171 string(REPLACE "${warning}" "" ${var} "${${var}}")
172 string(REPLACE "-W" "-Wno-" warning "${warning}")
174 ocv_check_flag_support(${var} "${warning}" _varname)
176 set(${var} "${${var}} ${warning}")
182 unset(_msvc_warnings)
184 endif(NOT ENABLE_NOISY_WARNINGS)
187 # Provides an option that the user can optionally select.
188 # Can accept condition to control when option is available for user.
190 # option(<option_variable> "help string describing the option" <initial value or boolean expression> [IF <condition>])
191 macro(OCV_OPTION variable description value)
192 set(__value ${value})
194 set(__varname "__value")
196 if(arg STREQUAL "IF" OR arg STREQUAL "if")
197 set(__varname "__condition")
199 list(APPEND ${__varname} ${arg})
203 if("${__condition}" STREQUAL "")
204 set(__condition 2 GREATER 1)
208 if("${__value}" MATCHES ";")
210 option(${variable} "${description}" ON)
212 option(${variable} "${description}" OFF)
214 elseif(DEFINED ${__value})
216 option(${variable} "${description}" ON)
218 option(${variable} "${description}" OFF)
221 option(${variable} "${description}" ${__value})
224 unset(${variable} CACHE)
231 # Macros that checks if module have been installed.
232 # After it adds module to build and define
233 # constants passed as second arg
234 macro(CHECK_MODULE module_name define)
237 set(ALIAS ALIASOF_${module_name})
238 set(ALIAS_FOUND ${ALIAS}_FOUND)
239 set(ALIAS_INCLUDE_DIRS ${ALIAS}_INCLUDE_DIRS)
240 set(ALIAS_LIBRARY_DIRS ${ALIAS}_LIBRARY_DIRS)
241 set(ALIAS_LIBRARIES ${ALIAS}_LIBRARIES)
243 PKG_CHECK_MODULES(${ALIAS} ${module_name})
247 foreach(P "${ALIAS_INCLUDE_DIRS}")
249 list(APPEND HIGHGUI_INCLUDE_DIRS ${${P}})
253 foreach(P "${ALIAS_LIBRARY_DIRS}")
255 list(APPEND HIGHGUI_LIBRARY_DIRS ${${P}})
259 list(APPEND HIGHGUI_LIBRARIES ${${ALIAS_LIBRARIES}})
265 set(OPENCV_BUILD_INFO_FILE "${OpenCV_BINARY_DIR}/version_string.tmp")
266 file(REMOVE "${OPENCV_BUILD_INFO_FILE}")
267 function(ocv_output_status msg)
268 message(STATUS "${msg}")
269 string(REPLACE "\\" "\\\\" msg "${msg}")
270 string(REPLACE "\"" "\\\"" msg "${msg}")
271 file(APPEND "${OPENCV_BUILD_INFO_FILE}" "\"${msg}\\n\"\n")
274 macro(ocv_finalize_status)
275 if(NOT OPENCV_SKIP_STATUS_FINALIZATION)
276 if(TARGET opencv_core)
277 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENCV_BUILD_INFO_FILE}" "${opencv_core_BINARY_DIR}/version_string.inc" OUTPUT_QUIET)
283 # Status report function.
284 # Automatically align right column and selects text based on condition.
287 # status(<heading> <value1> [<value2> ...])
288 # status(<heading> <condition> THEN <text for TRUE> ELSE <text for FALSE> )
289 function(status text)
294 set(status_current_name "cond")
296 if(arg STREQUAL "THEN")
297 set(status_current_name "then")
298 elseif(arg STREQUAL "ELSE")
299 set(status_current_name "else")
301 list(APPEND status_${status_current_name} ${arg})
305 if(DEFINED status_cond)
306 set(status_placeholder_length 32)
307 string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder)
308 string(LENGTH "${text}" status_text_length)
309 if(status_text_length LESS status_placeholder_length)
310 string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
311 elseif(DEFINED status_then OR DEFINED status_else)
312 ocv_output_status("${text}")
313 set(status_text "${status_placeholder}")
315 set(status_text "${text}")
318 if(DEFINED status_then OR DEFINED status_else)
320 string(REPLACE ";" " " status_then "${status_then}")
321 string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}")
322 ocv_output_status("${status_text} ${status_then}")
324 string(REPLACE ";" " " status_else "${status_else}")
325 string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}")
326 ocv_output_status("${status_text} ${status_else}")
329 string(REPLACE ";" " " status_cond "${status_cond}")
330 string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}")
331 ocv_output_status("${status_text} ${status_cond}")
334 ocv_output_status("${text}")
339 # splits cmake libraries list of format "general;item1;debug;item2;release;item3" to two lists
340 macro(ocv_split_libs_list lst lstdbg lstopt)
344 foreach(word ${${lst}})
345 if(word STREQUAL "debug" OR word STREQUAL "optimized")
346 set(perv_keyword ${word})
347 elseif(word STREQUAL "general")
349 elseif(perv_keyword STREQUAL "debug")
350 list(APPEND ${lstdbg} "${word}")
352 elseif(perv_keyword STREQUAL "optimized")
353 list(APPEND ${lstopt} "${word}")
356 list(APPEND ${lstdbg} "${word}")
357 list(APPEND ${lstopt} "${word}")
364 # remove all matching elements from the list
365 macro(ocv_list_filterout lst regex)
366 foreach(item ${${lst}})
367 if(item MATCHES "${regex}")
368 list(REMOVE_ITEM ${lst} "${item}")
374 # stable & safe duplicates removal macro
375 macro(ocv_list_unique __lst)
377 list(REMOVE_DUPLICATES ${__lst})
382 # safe list reversal macro
383 macro(ocv_list_reverse __lst)
385 list(REVERSE ${__lst})
390 # safe list sorting macro
391 macro(ocv_list_sort __lst)
398 # add prefix to each item in the list
399 macro(ocv_list_add_prefix LST PREFIX)
401 foreach(item ${${LST}})
402 list(APPEND __tmp "${PREFIX}${item}")
409 # add suffix to each item in the list
410 macro(ocv_list_add_suffix LST SUFFIX)
412 foreach(item ${${LST}})
413 list(APPEND __tmp "${item}${SUFFIX}")
420 # gets and removes the first element from list
421 macro(ocv_list_pop_front LST VAR)
423 list(GET ${LST} 0 ${VAR})
424 list(REMOVE_AT ${LST} 0)
431 # simple regex escaping routine (does not cover all cases!!!)
432 macro(ocv_regex_escape var regex)
433 string(REGEX REPLACE "([+.*^$])" "\\\\1" ${var} "${regex}")
437 # convert list of paths to full paths
438 macro(ocv_convert_to_full_paths VAR)
441 foreach(path ${${VAR}})
442 get_filename_component(${VAR} "${path}" ABSOLUTE)
443 list(APPEND __tmp "${${VAR}}")
451 # add install command
452 function(ocv_install_target)
453 install(TARGETS ${ARGN})
459 if(NOT DEFINED __target)
462 if(isPackage EQUAL 1)
463 set(__package "${e}")
466 if(e STREQUAL "EXPORT")
471 if(DEFINED __package)
472 list(APPEND ${__package}_TARGETS ${__target})
473 set(${__package}_TARGETS "${${__package}_TARGETS}" CACHE INTERNAL "List of ${__package} targets")
476 if(INSTALL_CREATE_DISTRIB)
477 if(MSVC AND NOT BUILD_SHARED_LIBS)
478 set(__target "${ARGV0}")
488 if(isArchive EQUAL 1 AND e STREQUAL "DESTINATION")
491 if(e STREQUAL "ARCHIVE")
498 # message(STATUS "Process ${__target} dst=${__dst}...")
500 get_target_property(fname ${__target} LOCATION_DEBUG)
501 if(fname MATCHES "\\.lib$")
502 string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}")
503 install(FILES ${fname} DESTINATION ${__dst} CONFIGURATIONS Debug)
506 get_target_property(fname ${__target} LOCATION_RELEASE)
507 if(fname MATCHES "\\.lib$")
508 string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}")
509 install(FILES ${fname} DESTINATION ${__dst} CONFIGURATIONS Release)
517 # read set of version defines from the header file
518 macro(ocv_parse_header FILENAME FILE_VAR)
520 set(__parnet_scope OFF)
522 foreach(name ${ARGN})
523 if("${name}" STREQUAL "PARENT_SCOPE")
524 set(__parnet_scope ON)
525 elseif("${name}" STREQUAL "CACHE")
528 set(vars_regex "${vars_regex}|${name}")
530 set(vars_regex "${name}")
533 if(EXISTS "${FILENAME}")
534 file(STRINGS "${FILENAME}" ${FILE_VAR} REGEX "#define[ \t]+(${vars_regex})[ \t]+[0-9]+" )
538 foreach(name ${ARGN})
539 if(NOT "${name}" STREQUAL "PARENT_SCOPE" AND NOT "${name}" STREQUAL "CACHE")
541 if(${FILE_VAR} MATCHES ".+[ \t]${name}[ \t]+([0-9]+).*")
542 string(REGEX REPLACE ".+[ \t]${name}[ \t]+([0-9]+).*" "\\1" ${name} "${${FILE_VAR}}")
547 set(${name} ${${name}} CACHE INTERNAL "${name} parsed from ${FILENAME}" FORCE)
548 elseif(__parnet_scope)
549 set(${name} "${${name}}" PARENT_SCOPE)
558 # read single version define from the header file
559 macro(ocv_parse_header2 LIBNAME HDR_PATH VARNAME)
560 ocv_clear_vars(${LIBNAME}_VERSION_MAJOR
561 ${LIBNAME}_VERSION_MAJOR
562 ${LIBNAME}_VERSION_MINOR
563 ${LIBNAME}_VERSION_PATCH
564 ${LIBNAME}_VERSION_TWEAK
565 ${LIBNAME}_VERSION_STRING)
567 if(EXISTS "${HDR_PATH}")
568 file(STRINGS "${HDR_PATH}" ${LIBNAME}_H REGEX "^#define[ \t]+${VARNAME}[ \t]+\"[^\"]*\".*$" LIMIT_COUNT 1)
572 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MAJOR "${${LIBNAME}_H}")
573 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MINOR "${${LIBNAME}_H}")
574 string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_PATCH "${${LIBNAME}_H}")
575 set(${LIBNAME}_VERSION_MAJOR ${${LIBNAME}_VERSION_MAJOR} ${ARGN})
576 set(${LIBNAME}_VERSION_MINOR ${${LIBNAME}_VERSION_MINOR} ${ARGN})
577 set(${LIBNAME}_VERSION_PATCH ${${LIBNAME}_VERSION_PATCH} ${ARGN})
578 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}.${${LIBNAME}_VERSION_PATCH}")
580 # append a TWEAK version if it exists:
581 set(${LIBNAME}_VERSION_TWEAK "")
582 if("${${LIBNAME}_H}" MATCHES "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.[0-9]+\\.([0-9]+).*$")
583 set(${LIBNAME}_VERSION_TWEAK "${CMAKE_MATCH_1}" ${ARGN})
585 if(${LIBNAME}_VERSION_TWEAK)
586 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}.${${LIBNAME}_VERSION_TWEAK}" ${ARGN})
588 set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}" ${ARGN})
593 # read single version info from the pkg file
594 macro(ocv_parse_pkg LIBNAME PKG_PATH SCOPE)
595 if(EXISTS "${PKG_PATH}/${LIBNAME}.pc")
596 file(STRINGS "${PKG_PATH}/${LIBNAME}.pc" line_to_parse REGEX "^Version:[ \t]+[0-9.]*.*$" LIMIT_COUNT 1)
597 STRING(REGEX REPLACE ".*Version: ([^ ]+).*" "\\1" ALIASOF_${LIBNAME}_VERSION "${line_to_parse}" )
601 ################################################################################################
602 # short command to setup source group
603 function(ocv_source_group group)
604 cmake_parse_arguments(OCV_SOURCE_GROUP "" "" "GLOB" ${ARGN})
605 file(GLOB srcs ${OCV_SOURCE_GROUP_GLOB})
606 source_group(${group} FILES ${srcs})