OpenCVUtils.cmake 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  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)
  5. find_package(${ARGN})
  6. endmacro()
  7. endif()
  8. if(NOT COMMAND find_host_program)
  9. macro(find_host_program)
  10. find_program(${ARGN})
  11. endmacro()
  12. endif()
  13. # adds include directories in such way that directories from the OpenCV source tree go first
  14. function(ocv_include_directories)
  15. set(__add_before "")
  16. foreach(dir ${ARGN})
  17. get_filename_component(__abs_dir "${dir}" ABSOLUTE)
  18. if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}" OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}")
  19. list(APPEND __add_before "${dir}")
  20. else()
  21. include_directories(AFTER SYSTEM "${dir}")
  22. endif()
  23. endforeach()
  24. include_directories(BEFORE ${__add_before})
  25. endfunction()
  26. # clears all passed variables
  27. macro(ocv_clear_vars)
  28. foreach(_var ${ARGN})
  29. unset(${_var} CACHE)
  30. endforeach()
  31. endmacro()
  32. set(OCV_COMPILER_FAIL_REGEX
  33. "command line option .* is valid for .* but not for C\\+\\+" # GNU
  34. "command line option .* is valid for .* but not for C" # GNU
  35. "unrecognized .*option" # GNU
  36. "unknown .*option" # Clang
  37. "ignoring unknown option" # MSVC
  38. "warning D9002" # MSVC, any lang
  39. "option .*not supported" # Intel
  40. "[Uu]nknown option" # HP
  41. "[Ww]arning: [Oo]ption" # SunPro
  42. "command option .* is not recognized" # XL
  43. "not supported in this configuration; ignored" # AIX
  44. "File with unknown suffix passed to linker" # PGI
  45. "WARNING: unknown flag:" # Open64
  46. )
  47. MACRO(ocv_check_compiler_flag LANG FLAG RESULT)
  48. if(NOT DEFINED ${RESULT})
  49. if("_${LANG}_" MATCHES "_CXX_")
  50. set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx")
  51. if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
  52. FILE(WRITE "${_fname}" "int main() { return 0; }\n")
  53. else()
  54. FILE(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
  55. endif()
  56. elseif("_${LANG}_" MATCHES "_C_")
  57. set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c")
  58. if("${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
  59. FILE(WRITE "${_fname}" "int main(void) { return 0; }\n")
  60. else()
  61. FILE(WRITE "${_fname}" "#pragma\nint main(void) { return 0; }\n")
  62. endif()
  63. else()
  64. unset(_fname)
  65. endif()
  66. if(_fname)
  67. MESSAGE(STATUS "Performing Test ${RESULT}")
  68. TRY_COMPILE(${RESULT}
  69. ${CMAKE_BINARY_DIR}
  70. "${_fname}"
  71. COMPILE_DEFINITIONS "${FLAG}"
  72. OUTPUT_VARIABLE OUTPUT)
  73. FOREACH(_regex ${OCV_COMPILER_FAIL_REGEX})
  74. IF("${OUTPUT}" MATCHES "${_regex}")
  75. SET(${RESULT} 0)
  76. break()
  77. ENDIF()
  78. ENDFOREACH()
  79. IF(${RESULT})
  80. SET(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}")
  81. MESSAGE(STATUS "Performing Test ${RESULT} - Success")
  82. ELSE(${RESULT})
  83. MESSAGE(STATUS "Performing Test ${RESULT} - Failed")
  84. SET(${RESULT} "" CACHE INTERNAL "Test ${RESULT}")
  85. ENDIF(${RESULT})
  86. else()
  87. SET(${RESULT} 0)
  88. endif()
  89. endif()
  90. ENDMACRO()
  91. macro(ocv_check_flag_support lang flag varname)
  92. if("_${lang}_" MATCHES "_CXX_")
  93. set(_lang CXX)
  94. elseif("_${lang}_" MATCHES "_C_")
  95. set(_lang C)
  96. else()
  97. set(_lang ${lang})
  98. endif()
  99. string(TOUPPER "${flag}" ${varname})
  100. string(REGEX REPLACE "^(/|-)" "HAVE_${_lang}_" ${varname} "${${varname}}")
  101. string(REGEX REPLACE " -|-|=| |\\." "_" ${varname} "${${varname}}")
  102. ocv_check_compiler_flag("${_lang}" "${ARGN} ${flag}" ${${varname}})
  103. endmacro()
  104. # turns off warnings
  105. macro(ocv_warnings_disable)
  106. if(NOT ENABLE_NOISY_WARNINGS)
  107. set(_flag_vars "")
  108. set(_msvc_warnings "")
  109. set(_gxx_warnings "")
  110. foreach(arg ${ARGN})
  111. if(arg MATCHES "^CMAKE_")
  112. list(APPEND _flag_vars ${arg})
  113. elseif(arg MATCHES "^/wd")
  114. list(APPEND _msvc_warnings ${arg})
  115. elseif(arg MATCHES "^-W")
  116. list(APPEND _gxx_warnings ${arg})
  117. endif()
  118. endforeach()
  119. if(MSVC AND _msvc_warnings AND _flag_vars)
  120. foreach(var ${_flag_vars})
  121. foreach(warning ${_msvc_warnings})
  122. set(${var} "${${var}} ${warning}")
  123. endforeach()
  124. endforeach()
  125. elseif(CV_COMPILER_IS_GNU AND _gxx_warnings AND _flag_vars)
  126. foreach(var ${_flag_vars})
  127. foreach(warning ${_gxx_warnings})
  128. if(NOT warning MATCHES "^-Wno-")
  129. string(REPLACE "${warning}" "" ${var} "${${var}}")
  130. string(REPLACE "-W" "-Wno-" warning "${warning}")
  131. endif()
  132. ocv_check_flag_support(${var} "${warning}" _varname)
  133. if(${_varname})
  134. set(${var} "${${var}} ${warning}")
  135. endif()
  136. endforeach()
  137. endforeach()
  138. endif()
  139. unset(_flag_vars)
  140. unset(_msvc_warnings)
  141. unset(_gxx_warnings)
  142. endif(NOT ENABLE_NOISY_WARNINGS)
  143. endmacro()
  144. # Provides an option that the user can optionally select.
  145. # Can accept condition to control when option is available for user.
  146. # Usage:
  147. # option(<option_variable> "help string describing the option" <initial value or boolean expression> [IF <condition>])
  148. macro(OCV_OPTION variable description value)
  149. set(__value ${value})
  150. set(__condition "")
  151. set(__varname "__value")
  152. foreach(arg ${ARGN})
  153. if(arg STREQUAL "IF" OR arg STREQUAL "if")
  154. set(__varname "__condition")
  155. else()
  156. list(APPEND ${__varname} ${arg})
  157. endif()
  158. endforeach()
  159. unset(__varname)
  160. if("${__condition}" STREQUAL "")
  161. set(__condition 2 GREATER 1)
  162. endif()
  163. if(${__condition})
  164. if("${__value}" MATCHES ";")
  165. if(${__value})
  166. option(${variable} "${description}" ON)
  167. else()
  168. option(${variable} "${description}" OFF)
  169. endif()
  170. elseif(DEFINED ${__value})
  171. if(${__value})
  172. option(${variable} "${description}" ON)
  173. else()
  174. option(${variable} "${description}" OFF)
  175. endif()
  176. else()
  177. option(${variable} "${description}" ${__value})
  178. endif()
  179. else()
  180. unset(${variable} CACHE)
  181. endif()
  182. unset(__condition)
  183. unset(__value)
  184. endmacro()
  185. # Macros that checks if module have been installed.
  186. # After it adds module to build and define
  187. # constants passed as second arg
  188. macro(CHECK_MODULE module_name define)
  189. set(${define} 0)
  190. if(PKG_CONFIG_FOUND)
  191. set(ALIAS ALIASOF_${module_name})
  192. set(ALIAS_FOUND ${ALIAS}_FOUND)
  193. set(ALIAS_INCLUDE_DIRS ${ALIAS}_INCLUDE_DIRS)
  194. set(ALIAS_LIBRARY_DIRS ${ALIAS}_LIBRARY_DIRS)
  195. set(ALIAS_LIBRARIES ${ALIAS}_LIBRARIES)
  196. PKG_CHECK_MODULES(${ALIAS} ${module_name})
  197. if(${ALIAS_FOUND})
  198. set(${define} 1)
  199. foreach(P "${ALIAS_INCLUDE_DIRS}")
  200. if(${P})
  201. list(APPEND HIGHGUI_INCLUDE_DIRS ${${P}})
  202. endif()
  203. endforeach()
  204. foreach(P "${ALIAS_LIBRARY_DIRS}")
  205. if(${P})
  206. list(APPEND HIGHGUI_LIBRARY_DIRS ${${P}})
  207. endif()
  208. endforeach()
  209. list(APPEND HIGHGUI_LIBRARIES ${${ALIAS_LIBRARIES}})
  210. endif()
  211. endif()
  212. endmacro()
  213. set(OPENCV_BUILD_INFO_FILE "${OpenCV_BINARY_DIR}/version_string.tmp")
  214. file(REMOVE "${OPENCV_BUILD_INFO_FILE}")
  215. function(ocv_output_status msg)
  216. message(STATUS "${msg}")
  217. string(REPLACE "\\" "\\\\" msg "${msg}")
  218. string(REPLACE "\"" "\\\"" msg "${msg}")
  219. file(APPEND "${OPENCV_BUILD_INFO_FILE}" "\"${msg}\\n\"\n")
  220. endfunction()
  221. macro(ocv_finalize_status)
  222. if(NOT OPENCV_SKIP_STATUS_FINALIZATION)
  223. if(TARGET opencv_core)
  224. execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENCV_BUILD_INFO_FILE}" "${opencv_core_BINARY_DIR}/version_string.inc" OUTPUT_QUIET)
  225. endif()
  226. endif()
  227. endmacro()
  228. # Status report function.
  229. # Automatically align right column and selects text based on condition.
  230. # Usage:
  231. # status(<text>)
  232. # status(<heading> <value1> [<value2> ...])
  233. # status(<heading> <condition> THEN <text for TRUE> ELSE <text for FALSE> )
  234. function(status text)
  235. set(status_cond)
  236. set(status_then)
  237. set(status_else)
  238. set(status_current_name "cond")
  239. foreach(arg ${ARGN})
  240. if(arg STREQUAL "THEN")
  241. set(status_current_name "then")
  242. elseif(arg STREQUAL "ELSE")
  243. set(status_current_name "else")
  244. else()
  245. list(APPEND status_${status_current_name} ${arg})
  246. endif()
  247. endforeach()
  248. if(DEFINED status_cond)
  249. set(status_placeholder_length 32)
  250. string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder)
  251. string(LENGTH "${text}" status_text_length)
  252. if(status_text_length LESS status_placeholder_length)
  253. string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
  254. elseif(DEFINED status_then OR DEFINED status_else)
  255. ocv_output_status("${text}")
  256. set(status_text "${status_placeholder}")
  257. else()
  258. set(status_text "${text}")
  259. endif()
  260. if(DEFINED status_then OR DEFINED status_else)
  261. if(${status_cond})
  262. string(REPLACE ";" " " status_then "${status_then}")
  263. string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}")
  264. ocv_output_status("${status_text} ${status_then}")
  265. else()
  266. string(REPLACE ";" " " status_else "${status_else}")
  267. string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}")
  268. ocv_output_status("${status_text} ${status_else}")
  269. endif()
  270. else()
  271. string(REPLACE ";" " " status_cond "${status_cond}")
  272. string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}")
  273. ocv_output_status("${status_text} ${status_cond}")
  274. endif()
  275. else()
  276. ocv_output_status("${text}")
  277. endif()
  278. endfunction()
  279. # splits cmake libraries list of format "general;item1;debug;item2;release;item3" to two lists
  280. macro(ocv_split_libs_list lst lstdbg lstopt)
  281. set(${lstdbg} "")
  282. set(${lstopt} "")
  283. set(perv_keyword "")
  284. foreach(word ${${lst}})
  285. if(word STREQUAL "debug" OR word STREQUAL "optimized")
  286. set(perv_keyword ${word})
  287. elseif(word STREQUAL "general")
  288. set(perv_keyword "")
  289. elseif(perv_keyword STREQUAL "debug")
  290. list(APPEND ${lstdbg} "${word}")
  291. set(perv_keyword "")
  292. elseif(perv_keyword STREQUAL "optimized")
  293. list(APPEND ${lstopt} "${word}")
  294. set(perv_keyword "")
  295. else()
  296. list(APPEND ${lstdbg} "${word}")
  297. list(APPEND ${lstopt} "${word}")
  298. set(perv_keyword "")
  299. endif()
  300. endforeach()
  301. endmacro()
  302. # remove all matching elements from the list
  303. macro(ocv_list_filterout lst regex)
  304. foreach(item ${${lst}})
  305. if(item MATCHES "${regex}")
  306. list(REMOVE_ITEM ${lst} "${item}")
  307. endif()
  308. endforeach()
  309. endmacro()
  310. # stable & safe duplicates removal macro
  311. macro(ocv_list_unique __lst)
  312. if(${__lst})
  313. list(REMOVE_DUPLICATES ${__lst})
  314. endif()
  315. endmacro()
  316. # safe list reversal macro
  317. macro(ocv_list_reverse __lst)
  318. if(${__lst})
  319. list(REVERSE ${__lst})
  320. endif()
  321. endmacro()
  322. # safe list sorting macro
  323. macro(ocv_list_sort __lst)
  324. if(${__lst})
  325. list(SORT ${__lst})
  326. endif()
  327. endmacro()
  328. # add prefix to each item in the list
  329. macro(ocv_list_add_prefix LST PREFIX)
  330. set(__tmp "")
  331. foreach(item ${${LST}})
  332. list(APPEND __tmp "${PREFIX}${item}")
  333. endforeach()
  334. set(${LST} ${__tmp})
  335. unset(__tmp)
  336. endmacro()
  337. # add suffix to each item in the list
  338. macro(ocv_list_add_suffix LST SUFFIX)
  339. set(__tmp "")
  340. foreach(item ${${LST}})
  341. list(APPEND __tmp "${item}${SUFFIX}")
  342. endforeach()
  343. set(${LST} ${__tmp})
  344. unset(__tmp)
  345. endmacro()
  346. # gets and removes the first element from list
  347. macro(ocv_list_pop_front LST VAR)
  348. if(${LST})
  349. list(GET ${LST} 0 ${VAR})
  350. list(REMOVE_AT ${LST} 0)
  351. else()
  352. set(${VAR} "")
  353. endif()
  354. endmacro()
  355. # simple regex escaping routine (does not cover all cases!!!)
  356. macro(ocv_regex_escape var regex)
  357. string(REGEX REPLACE "([+.*^$])" "\\\\1" ${var} "${regex}")
  358. endmacro()
  359. # get absolute path with symlinks resolved
  360. macro(ocv_get_real_path VAR PATHSTR)
  361. if(CMAKE_VERSION VERSION_LESS 2.8)
  362. get_filename_component(${VAR} "${PATHSTR}" ABSOLUTE)
  363. else()
  364. get_filename_component(${VAR} "${PATHSTR}" REALPATH)
  365. endif()
  366. endmacro()
  367. # convert list of paths to full paths
  368. macro(ocv_convert_to_full_paths VAR)
  369. if(${VAR})
  370. set(__tmp "")
  371. foreach(path ${${VAR}})
  372. get_filename_component(${VAR} "${path}" ABSOLUTE)
  373. list(APPEND __tmp "${${VAR}}")
  374. endforeach()
  375. set(${VAR} ${__tmp})
  376. unset(__tmp)
  377. endif()
  378. endmacro()
  379. # read set of version defines from the header file
  380. macro(ocv_parse_header FILENAME FILE_VAR)
  381. set(vars_regex "")
  382. set(__parnet_scope OFF)
  383. set(__add_cache OFF)
  384. foreach(name ${ARGN})
  385. if("${name}" STREQUAL "PARENT_SCOPE")
  386. set(__parnet_scope ON)
  387. elseif("${name}" STREQUAL "CACHE")
  388. set(__add_cache ON)
  389. elseif(vars_regex)
  390. set(vars_regex "${vars_regex}|${name}")
  391. else()
  392. set(vars_regex "${name}")
  393. endif()
  394. endforeach()
  395. if(EXISTS "${FILENAME}")
  396. file(STRINGS "${FILENAME}" ${FILE_VAR} REGEX "#define[ \t]+(${vars_regex})[ \t]+[0-9]+" )
  397. else()
  398. unset(${FILE_VAR})
  399. endif()
  400. foreach(name ${ARGN})
  401. if(NOT "${name}" STREQUAL "PARENT_SCOPE" AND NOT "${name}" STREQUAL "CACHE")
  402. if(${FILE_VAR})
  403. if(${FILE_VAR} MATCHES ".+[ \t]${name}[ \t]+([0-9]+).*")
  404. string(REGEX REPLACE ".+[ \t]${name}[ \t]+([0-9]+).*" "\\1" ${name} "${${FILE_VAR}}")
  405. else()
  406. set(${name} "")
  407. endif()
  408. if(__add_cache)
  409. set(${name} ${${name}} CACHE INTERNAL "${name} parsed from ${FILENAME}" FORCE)
  410. elseif(__parnet_scope)
  411. set(${name} "${${name}}" PARENT_SCOPE)
  412. endif()
  413. else()
  414. unset(${name} CACHE)
  415. endif()
  416. endif()
  417. endforeach()
  418. endmacro()
  419. # read single version define from the header file
  420. macro(ocv_parse_header2 LIBNAME HDR_PATH VARNAME SCOPE)
  421. set(${LIBNAME}_H "")
  422. if(EXISTS "${HDR_PATH}")
  423. file(STRINGS "${HDR_PATH}" ${LIBNAME}_H REGEX "^#define[ \t]+${VARNAME}[ \t]+\"[^\"]*\".*$" LIMIT_COUNT 1)
  424. endif()
  425. if(${LIBNAME}_H)
  426. string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MAJOR "${${LIBNAME}_H}")
  427. string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MINOR "${${LIBNAME}_H}")
  428. string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_PATCH "${${LIBNAME}_H}")
  429. set(${LIBNAME}_VERSION_MAJOR ${${LIBNAME}_VERSION_MAJOR} ${SCOPE})
  430. set(${LIBNAME}_VERSION_MINOR ${${LIBNAME}_VERSION_MINOR} ${SCOPE})
  431. set(${LIBNAME}_VERSION_PATCH ${${LIBNAME}_VERSION_PATCH} ${SCOPE})
  432. set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}.${${LIBNAME}_VERSION_PATCH}" ${SCOPE})
  433. # append a TWEAK version if it exists:
  434. set(${LIBNAME}_VERSION_TWEAK "")
  435. if("${${LIBNAME}_H}" MATCHES "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.[0-9]+\\.([0-9]+).*$")
  436. set(${LIBNAME}_VERSION_TWEAK "${CMAKE_MATCH_1}" ${SCOPE})
  437. set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}.${${LIBNAME}_VERSION_TWEAK}" ${SCOPE})
  438. endif()
  439. else()
  440. ocv_clear_vars(${LIBNAME}_VERSION_MAJOR
  441. ${LIBNAME}_VERSION_MAJOR
  442. ${LIBNAME}_VERSION_MINOR
  443. ${LIBNAME}_VERSION_PATCH
  444. ${LIBNAME}_VERSION_TWEAK
  445. ${LIBNAME}_VERSION_STRING)
  446. endif()
  447. endmacro()