OpenCVUtils.cmake 15 KB

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