2012-02-03 12:26:49 +01:00
# Local variables (set for each module):
#
# name - short name in lower case i.e. core
# the_module - full name in lower case i.e. opencv_core
# Global variables:
#
# OPENCV_MODULE_${the_module}_LOCATION
# OPENCV_MODULE_${the_module}_DESCRIPTION
2012-05-13 11:34:33 +02:00
# OPENCV_MODULE_${the_module}_CLASS - PUBLIC|INTERNAL|BINDINGS
2012-02-03 12:26:49 +01:00
# OPENCV_MODULE_${the_module}_HEADERS
# OPENCV_MODULE_${the_module}_SOURCES
# OPENCV_MODULE_${the_module}_DEPS - final flattened set of module dependencies
2013-08-07 10:53:48 +02:00
# OPENCV_MODULE_${the_module}_DEPS_EXT - non-module dependencies
2012-02-03 12:26:49 +01:00
# OPENCV_MODULE_${the_module}_REQ_DEPS
# OPENCV_MODULE_${the_module}_OPT_DEPS
2013-08-07 10:53:48 +02:00
# OPENCV_MODULE_${the_module}_PRIVATE_REQ_DEPS
# OPENCV_MODULE_${the_module}_PRIVATE_OPT_DEPS
2012-02-03 12:26:49 +01:00
# HAVE_${the_module} - for fast check of module availability
# To control the setup of the module you could also set:
# the_description - text to be used as current module description
# OPENCV_MODULE_TYPE - STATIC|SHARED - set to force override global settings for current module
2012-05-13 11:34:33 +02:00
# OPENCV_MODULE_IS_PART_OF_WORLD - ON|OFF (default ON) - should the module be added to the opencv_world?
# BUILD_${the_module}_INIT - ON|OFF (default ON) - initial value for BUILD_${the_module}
2012-02-03 12:26:49 +01:00
# The verbose template for OpenCV module:
#
# ocv_add_module(modname <dependencies>)
2014-03-05 09:31:04 +01:00
# ocv_glob_module_sources(([EXCLUDE_CUDA] <extra sources&headers>)
# or glob them manually and ocv_set_module_sources(...)
2012-02-03 12:26:49 +01:00
# ocv_module_include_directories(<extra include directories>)
# ocv_create_module()
# <add extra link dependencies, compiler options, etc>
# ocv_add_precompiled_headers(${the_module})
# <add extra installation rules>
# ocv_add_accuracy_tests(<extra dependencies>)
# ocv_add_perf_tests(<extra dependencies>)
2013-09-04 16:41:19 +02:00
# ocv_add_samples(<extra dependencies>)
2012-02-03 12:26:49 +01:00
#
#
# If module have no "extra" then you can define it in one line:
#
# ocv_define_module(modname <dependencies>)
# clean flags for modules enabled on previous cmake run
# this is necessary to correctly handle modules removal
2012-05-13 11:34:33 +02:00
foreach ( mod ${ OPENCV_MODULES_BUILD } ${ OPENCV_MODULES_DISABLED_USER } ${ OPENCV_MODULES_DISABLED_AUTO } ${ OPENCV_MODULES_DISABLED_FORCE } )
2012-02-03 12:26:49 +01:00
if ( HAVE_ ${ mod } )
unset ( HAVE_ ${ mod } CACHE )
endif ( )
2015-09-02 17:15:05 +02:00
unset ( OPENCV_MODULE_ ${ mod } _DEPS CACHE )
unset ( OPENCV_MODULE_ ${ mod } _DEPS_EXT CACHE )
2012-05-13 11:34:33 +02:00
unset ( OPENCV_MODULE_ ${ mod } _REQ_DEPS CACHE )
unset ( OPENCV_MODULE_ ${ mod } _OPT_DEPS CACHE )
2013-08-07 10:53:48 +02:00
unset ( OPENCV_MODULE_ ${ mod } _PRIVATE_REQ_DEPS CACHE )
unset ( OPENCV_MODULE_ ${ mod } _PRIVATE_OPT_DEPS CACHE )
2012-02-03 12:26:49 +01:00
endforeach ( )
# clean modules info which needs to be recalculated
set ( OPENCV_MODULES_PUBLIC "" CACHE INTERNAL "List of OpenCV modules marked for export" )
set ( OPENCV_MODULES_BUILD "" CACHE INTERNAL "List of OpenCV modules included into the build" )
set ( OPENCV_MODULES_DISABLED_USER "" CACHE INTERNAL "List of OpenCV modules explicitly disabled by user" )
set ( OPENCV_MODULES_DISABLED_AUTO "" CACHE INTERNAL "List of OpenCV modules implicitly disabled due to dependencies" )
set ( OPENCV_MODULES_DISABLED_FORCE "" CACHE INTERNAL "List of OpenCV modules which can not be build in current configuration" )
# adds dependencies to OpenCV module
# Usage:
# add_dependencies(opencv_<name> [REQUIRED] [<list of dependencies>] [OPTIONAL <list of modules>])
# Notes:
# * <list of dependencies> - can include full names of modules or full pathes to shared/static libraries or cmake targets
macro ( ocv_add_dependencies full_modname )
#we don't clean the dependencies here to allow this macro several times for every module
2012-05-12 15:54:26 +02:00
foreach ( d "REQUIRED" ${ ARGN } )
if ( d STREQUAL "REQUIRED" )
2012-02-03 12:26:49 +01:00
set ( __depsvar OPENCV_MODULE_ ${ full_modname } _REQ_DEPS )
elseif ( d STREQUAL "OPTIONAL" )
set ( __depsvar OPENCV_MODULE_ ${ full_modname } _OPT_DEPS )
2013-08-07 10:53:48 +02:00
elseif ( d STREQUAL "PRIVATE_REQUIRED" )
set ( __depsvar OPENCV_MODULE_ ${ full_modname } _PRIVATE_REQ_DEPS )
elseif ( d STREQUAL "PRIVATE_OPTIONAL" )
set ( __depsvar OPENCV_MODULE_ ${ full_modname } _PRIVATE_OPT_DEPS )
2012-02-03 12:26:49 +01:00
else ( )
list ( APPEND ${ __depsvar } "${d}" )
endif ( )
endforeach ( )
2012-06-18 08:53:13 +02:00
unset ( __depsvar )
ocv_list_unique ( OPENCV_MODULE_ ${ full_modname } _REQ_DEPS )
ocv_list_unique ( OPENCV_MODULE_ ${ full_modname } _OPT_DEPS )
2013-08-07 10:53:48 +02:00
ocv_list_unique ( OPENCV_MODULE_ ${ full_modname } _PRIVATE_REQ_DEPS )
ocv_list_unique ( OPENCV_MODULE_ ${ full_modname } _PRIVATE_OPT_DEPS )
set ( OPENCV_MODULE_ ${ full_modname } _REQ_DEPS ${ OPENCV_MODULE_${full_modname } _REQ_DEPS}
C A C H E I N T E R N A L " R e q u i r e d d e p e n d e n c i e s o f $ { f u l l _ m o d n a m e } m o d u l e " )
set ( OPENCV_MODULE_ ${ full_modname } _OPT_DEPS ${ OPENCV_MODULE_${full_modname } _OPT_DEPS}
C A C H E I N T E R N A L " O p t i o n a l d e p e n d e n c i e s o f $ { f u l l _ m o d n a m e } m o d u l e " )
set ( OPENCV_MODULE_ ${ full_modname } _PRIVATE_REQ_DEPS ${ OPENCV_MODULE_${full_modname } _PRIVATE_REQ_DEPS}
C A C H E I N T E R N A L " R e q u i r e d p r i v a t e d e p e n d e n c i e s o f $ { f u l l _ m o d n a m e } m o d u l e " )
set ( OPENCV_MODULE_ ${ full_modname } _PRIVATE_OPT_DEPS ${ OPENCV_MODULE_${full_modname } _PRIVATE_OPT_DEPS}
C A C H E I N T E R N A L " O p t i o n a l p r i v a t e d e p e n d e n c i e s o f $ { f u l l _ m o d n a m e } m o d u l e " )
2012-01-25 10:04:49 +01:00
endmacro ( )
2012-02-03 12:26:49 +01:00
# declare new OpenCV module in current folder
# Usage:
2012-03-25 21:57:58 +02:00
# ocv_add_module(<name> [INTERNAL|BINDINGS] [REQUIRED] [<list of dependencies>] [OPTIONAL <list of optional dependencies>])
2012-02-03 12:26:49 +01:00
# Example:
2012-05-13 11:34:33 +02:00
# ocv_add_module(yaom INTERNAL opencv_core opencv_highgui opencv_flann OPTIONAL opencv_gpu)
2012-02-03 12:26:49 +01:00
macro ( ocv_add_module _name )
string ( TOLOWER "${_name}" name )
set ( the_module opencv_ ${ name } )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
# the first pass - collect modules info, the second pass - create targets
if ( OPENCV_INITIAL_PASS )
2012-03-15 10:20:16 +01:00
#guard agains redefinition
if ( ";${OPENCV_MODULES_BUILD};${OPENCV_MODULES_DISABLED_USER};" MATCHES ";${the_module};" )
message ( FATAL_ERROR " Redefinition of the ${ the_module } module.
a t : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R }
p r e v i o u s l y d e f i n e d a t : $ { O P E N C V _ M O D U L E _ $ { t h e _ m o d u l e } _ L O C A T I O N }
" )
endif ( )
2012-02-03 12:26:49 +01:00
if ( NOT DEFINED the_description )
set ( the_description "The ${name} OpenCV module" )
endif ( )
2012-03-25 21:57:58 +02:00
2012-05-13 11:34:33 +02:00
if ( NOT DEFINED BUILD_ ${ the_module } _INIT )
set ( BUILD_ ${ the_module } _INIT ON )
2012-05-12 15:54:26 +02:00
endif ( )
2012-06-18 08:53:13 +02:00
# create option to enable/disable this module
2012-05-13 11:34:33 +02:00
option ( BUILD_ ${ the_module } "Include ${the_module} module into the OpenCV build" ${ BUILD_${the_module } _INIT} )
2012-03-15 10:20:16 +01:00
2012-06-18 08:53:13 +02:00
# remember the module details
set ( OPENCV_MODULE_ ${ the_module } _DESCRIPTION "${the_description}" CACHE INTERNAL "Brief description of ${the_module} module" )
set ( OPENCV_MODULE_ ${ the_module } _LOCATION "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "Location of ${the_module} module sources" )
# parse list of dependencies
2012-03-15 10:20:16 +01:00
if ( "${ARGV1}" STREQUAL "INTERNAL" OR "${ARGV1}" STREQUAL "BINDINGS" )
2014-02-11 11:25:37 +01:00
set ( OPENCV_MODULE_ ${ the_module } _CLASS "${ARGV1}" CACHE INTERNAL "The category of the module" )
2012-03-15 10:20:16 +01:00
set ( __ocv_argn__ ${ ARGN } )
list ( REMOVE_AT __ocv_argn__ 0 )
ocv_add_dependencies ( ${ the_module } ${ __ocv_argn__ } )
unset ( __ocv_argn__ )
2011-07-24 21:22:58 +02:00
else ( )
2014-02-11 11:25:37 +01:00
set ( OPENCV_MODULE_ ${ the_module } _CLASS "PUBLIC" CACHE INTERNAL "The category of the module" )
2012-03-15 10:20:16 +01:00
ocv_add_dependencies ( ${ the_module } ${ ARGN } )
if ( BUILD_ ${ the_module } )
2012-02-03 12:26:49 +01:00
set ( OPENCV_MODULES_PUBLIC ${ OPENCV_MODULES_PUBLIC } "${the_module}" CACHE INTERNAL "List of OpenCV modules marked for export" )
endif ( )
2012-03-15 10:20:16 +01:00
endif ( )
2012-06-08 08:19:17 +02:00
2012-05-13 11:34:33 +02:00
# add self to the world dependencies
if ( NOT DEFINED OPENCV_MODULE_IS_PART_OF_WORLD AND NOT OPENCV_MODULE_ ${ the_module } _CLASS STREQUAL "BINDINGS" OR OPENCV_MODULE_IS_PART_OF_WORLD )
ocv_add_dependencies ( opencv_world OPTIONAL ${ the_module } )
endif ( )
2012-03-15 10:20:16 +01:00
if ( BUILD_ ${ the_module } )
2012-02-03 12:26:49 +01:00
set ( OPENCV_MODULES_BUILD ${ OPENCV_MODULES_BUILD } "${the_module}" CACHE INTERNAL "List of OpenCV modules included into the build" )
2012-03-15 10:20:16 +01:00
else ( )
set ( OPENCV_MODULES_DISABLED_USER ${ OPENCV_MODULES_DISABLED_USER } "${the_module}" CACHE INTERNAL "List of OpenCV modules explicitly disabled by user" )
2011-07-24 21:22:58 +02:00
endif ( )
2012-03-25 21:57:58 +02:00
2012-06-18 08:53:13 +02:00
# TODO: add submodules if any
2012-02-03 12:26:49 +01:00
2012-06-18 08:53:13 +02:00
# stop processing of current file
2012-02-03 12:26:49 +01:00
return ( )
else ( OPENCV_INITIAL_PASS )
if ( NOT BUILD_ ${ the_module } )
2012-06-18 08:53:13 +02:00
return ( ) # extra protection from redefinition
2011-07-24 21:22:58 +02:00
endif ( )
2012-02-03 12:26:49 +01:00
project ( ${ the_module } )
endif ( OPENCV_INITIAL_PASS )
2011-07-24 21:22:58 +02:00
endmacro ( )
2012-06-18 08:53:13 +02:00
# excludes module from current configuration
2012-02-03 12:26:49 +01:00
macro ( ocv_module_disable module )
set ( __modname ${ module } )
if ( NOT __modname MATCHES "^opencv_" )
set ( __modname opencv_ ${ module } )
endif ( )
list ( APPEND OPENCV_MODULES_DISABLED_FORCE "${__modname}" )
set ( HAVE_ ${ __modname } OFF CACHE INTERNAL "Module ${__modname} can not be built in current configuration" )
2012-03-15 10:20:16 +01:00
set ( OPENCV_MODULE_ ${ __modname } _LOCATION "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "Location of ${__modname} module sources" )
2012-02-03 12:26:49 +01:00
set ( OPENCV_MODULES_DISABLED_FORCE "${OPENCV_MODULES_DISABLED_FORCE}" CACHE INTERNAL "List of OpenCV modules which can not be build in current configuration" )
2013-01-10 16:05:39 +01:00
if ( BUILD_ ${ __modname } )
# touch variable controlling build of the module to suppress "unused variable" CMake warning
endif ( )
2012-02-03 12:26:49 +01:00
unset ( __modname )
2012-06-18 08:53:13 +02:00
return ( ) # leave the current folder
2012-02-03 12:26:49 +01:00
endmacro ( )
2011-09-06 17:30:28 +02:00
2012-02-03 12:26:49 +01:00
# collect modules from specified directories
# NB: must be called only once!
macro ( ocv_glob_modules )
2012-03-15 10:20:16 +01:00
if ( DEFINED OPENCV_INITIAL_PASS )
message ( FATAL_ERROR "OpenCV has already loaded its modules. Calling ocv_glob_modules second time is not allowed." )
endif ( )
set ( __directories_observed "" )
2012-06-18 08:53:13 +02:00
# collect modules
2012-02-03 12:26:49 +01:00
set ( OPENCV_INITIAL_PASS ON )
foreach ( __path ${ ARGN } )
2013-06-05 13:54:27 +02:00
get_filename_component ( __path "${__path}" ABSOLUTE )
2012-06-18 08:53:13 +02:00
2012-03-15 10:20:16 +01:00
list ( FIND __directories_observed "${__path}" __pathIdx )
if ( __pathIdx GREATER -1 )
message ( FATAL_ERROR "The directory ${__path} is observed for OpenCV modules second time." )
endif ( )
list ( APPEND __directories_observed "${__path}" )
2012-02-03 12:26:49 +01:00
file ( GLOB __ocvmodules RELATIVE "${__path}" "${__path}/*" )
if ( __ocvmodules )
list ( SORT __ocvmodules )
foreach ( mod ${ __ocvmodules } )
2013-06-05 13:54:27 +02:00
get_filename_component ( __modpath "${__path}/${mod}" ABSOLUTE )
2012-03-15 10:20:16 +01:00
if ( EXISTS "${__modpath}/CMakeLists.txt" )
2012-06-18 08:53:13 +02:00
2012-03-15 10:20:16 +01:00
list ( FIND __directories_observed "${__modpath}" __pathIdx )
if ( __pathIdx GREATER -1 )
message ( FATAL_ERROR "The module from ${__modpath} is already loaded." )
endif ( )
list ( APPEND __directories_observed "${__modpath}" )
2012-06-19 22:08:15 +02:00
if ( OCV_MODULE_RELOCATE_ON_INITIAL_PASS )
file ( MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" )
file ( COPY "${__modpath}/CMakeLists.txt" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" )
add_subdirectory ( "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" )
if ( "${OPENCV_MODULE_opencv_${mod}_LOCATION}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" )
set ( OPENCV_MODULE_opencv_ ${ mod } _LOCATION "${__modpath}" CACHE PATH "" FORCE )
endif ( )
else ( )
add_subdirectory ( "${__modpath}" "${CMAKE_CURRENT_BINARY_DIR}/${mod}/.${mod}" )
endif ( )
2011-09-06 17:30:28 +02:00
endif ( )
2012-02-03 12:26:49 +01:00
endforeach ( )
2012-01-03 14:48:12 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endforeach ( )
2012-06-18 08:53:13 +02:00
ocv_clear_vars ( __ocvmodules __directories_observed __path __modpath __pathIdx )
2012-02-03 12:26:49 +01:00
2012-06-18 08:53:13 +02:00
# resolve dependencies
2013-08-07 10:53:48 +02:00
__ocv_resolve_dependencies ( )
2012-03-25 21:57:58 +02:00
2012-06-18 08:53:13 +02:00
# create modules
2012-03-15 10:20:16 +01:00
set ( OPENCV_INITIAL_PASS OFF PARENT_SCOPE )
2012-02-03 12:26:49 +01:00
set ( OPENCV_INITIAL_PASS OFF )
2012-06-19 22:08:15 +02:00
foreach ( m ${ OPENCV_MODULES_BUILD } )
2012-02-03 19:52:00 +01:00
if ( m MATCHES "^opencv_" )
string ( REGEX REPLACE "^opencv_" "" __shortname "${m}" )
add_subdirectory ( "${OPENCV_MODULE_${m}_LOCATION}" "${CMAKE_CURRENT_BINARY_DIR}/${__shortname}" )
2013-08-07 10:53:48 +02:00
else ( )
message ( WARNING "Check module name: ${m}" )
add_subdirectory ( "${OPENCV_MODULE_${m}_LOCATION}" "${CMAKE_CURRENT_BINARY_DIR}/${m}" )
2012-02-03 19:52:00 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endforeach ( )
unset ( __shortname )
2011-09-06 17:30:28 +02:00
endmacro ( )
2013-08-07 10:53:48 +02:00
# disables OpenCV module with missing dependencies
function ( __ocv_module_turn_off the_module )
list ( REMOVE_ITEM OPENCV_MODULES_DISABLED_AUTO "${the_module}" )
list ( APPEND OPENCV_MODULES_DISABLED_AUTO "${the_module}" )
list ( REMOVE_ITEM OPENCV_MODULES_BUILD "${the_module}" )
list ( REMOVE_ITEM OPENCV_MODULES_PUBLIC "${the_module}" )
set ( HAVE_ ${ the_module } OFF CACHE INTERNAL "Module ${the_module} can not be built in current configuration" )
set ( OPENCV_MODULES_DISABLED_AUTO "${OPENCV_MODULES_DISABLED_AUTO}" CACHE INTERNAL "" )
set ( OPENCV_MODULES_BUILD "${OPENCV_MODULES_BUILD}" CACHE INTERNAL "" )
set ( OPENCV_MODULES_PUBLIC "${OPENCV_MODULES_PUBLIC}" CACHE INTERNAL "" )
endfunction ( )
# sort modules by dependencies
function ( __ocv_sort_modules_by_deps __lst )
ocv_list_sort ( ${ __lst } )
set ( ${ __lst } _ORDERED ${ ${__lst } } CACHE INTERNAL "" )
set ( __result "" )
foreach ( m ${ ${__lst } } )
list ( LENGTH __result __lastindex )
set ( __index ${ __lastindex } )
foreach ( __d ${ __result } )
set ( __deps "${OPENCV_MODULE_${__d}_DEPS}" )
if ( ";${__deps};" MATCHES ";${m};" )
list ( FIND __result "${__d}" __i )
if ( __i LESS "${__index}" )
set ( __index "${__i}" )
endif ( )
endif ( )
endforeach ( )
if ( __index STREQUAL __lastindex )
list ( APPEND __result "${m}" )
else ( )
list ( INSERT __result ${ __index } "${m}" )
endif ( )
endforeach ( )
set ( ${ __lst } "${__result}" PARENT_SCOPE )
endfunction ( )
# resolve dependensies
function ( __ocv_resolve_dependencies )
foreach ( m ${ OPENCV_MODULES_DISABLED_USER } )
set ( HAVE_ ${ m } OFF CACHE INTERNAL "Module ${m} will not be built in current configuration" )
endforeach ( )
foreach ( m ${ OPENCV_MODULES_BUILD } )
set ( HAVE_ ${ m } ON CACHE INTERNAL "Module ${m} will be built in current configuration" )
endforeach ( )
# disable MODULES with unresolved dependencies
set ( has_changes ON )
while ( has_changes )
set ( has_changes OFF )
foreach ( m ${ OPENCV_MODULES_BUILD } )
set ( __deps ${ OPENCV_MODULE_${m } _REQ_DEPS} ${ OPENCV_MODULE_${m } _PRIVATE_REQ_DEPS} )
while ( __deps )
ocv_list_pop_front ( __deps d )
2013-10-03 00:20:54 +02:00
string ( TOLOWER "${d}" upper_d )
if ( NOT ( HAVE_ ${ d } OR HAVE_ ${ upper_d } OR TARGET ${ d } OR EXISTS ${ d } ) )
if ( d MATCHES "^opencv_" ) # TODO Remove this condition in the future and use HAVE_ variables only
message ( STATUS "Module ${m} disabled because ${d} dependency can't be resolved!" )
__ocv_module_turn_off ( ${ m } )
set ( has_changes ON )
break ( )
else ( )
message ( STATUS "Assume that non-module dependency is available: ${d} (for module ${m})" )
endif ( )
2013-08-07 10:53:48 +02:00
endif ( )
endwhile ( )
endforeach ( )
endwhile ( )
# message(STATUS "List of active modules: ${OPENCV_MODULES_BUILD}")
foreach ( m ${ OPENCV_MODULES_BUILD } )
set ( deps_ ${ m } ${ OPENCV_MODULE_${m } _REQ_DEPS} )
foreach ( d ${ OPENCV_MODULE_${m } _OPT_DEPS} )
if ( NOT ( ";${deps_${m}};" MATCHES ";${d};" ) )
if ( HAVE_ ${ d } OR TARGET ${ d } )
list ( APPEND deps_ ${ m } ${ d } )
endif ( )
endif ( )
endforeach ( )
# message(STATUS "Initial deps of ${m} (w/o private deps): ${deps_${m}}")
endforeach ( )
# propagate dependencies
set ( has_changes ON )
while ( has_changes )
set ( has_changes OFF )
foreach ( m2 ${ OPENCV_MODULES_BUILD } ) # transfer deps of m2 to m
foreach ( m ${ OPENCV_MODULES_BUILD } )
if ( ( NOT m STREQUAL m2 ) AND ";${deps_${m}};" MATCHES ";${m2};" )
foreach ( d ${ deps_${m2 } } )
if ( NOT ( ";${deps_${m}};" MATCHES ";${d};" ) )
# message(STATUS " Transfer dependency ${d} from ${m2} to ${m}")
list ( APPEND deps_ ${ m } ${ d } )
set ( has_changes ON )
endif ( )
endforeach ( )
endif ( )
endforeach ( )
endforeach ( )
endwhile ( )
# process private deps
foreach ( m ${ OPENCV_MODULES_BUILD } )
foreach ( d ${ OPENCV_MODULE_${m } _PRIVATE_REQ_DEPS} )
if ( NOT ( ";${deps_${m}};" MATCHES ";${d};" ) )
list ( APPEND deps_ ${ m } ${ d } )
endif ( )
endforeach ( )
foreach ( d ${ OPENCV_MODULE_${m } _PRIVATE_OPT_DEPS} )
if ( NOT ( ";${deps_${m}};" MATCHES ";${d};" ) )
if ( HAVE_ ${ d } OR TARGET ${ d } )
list ( APPEND deps_ ${ m } ${ d } )
endif ( )
endif ( )
endforeach ( )
endforeach ( )
ocv_list_sort ( OPENCV_MODULES_BUILD )
foreach ( m ${ OPENCV_MODULES_BUILD } )
# message(STATUS "FULL deps of ${m}: ${deps_${m}}")
set ( OPENCV_MODULE_ ${ m } _DEPS ${ deps_${m } } )
set ( OPENCV_MODULE_ ${ m } _DEPS_EXT ${ deps_${m } } )
ocv_list_filterout ( OPENCV_MODULE_ ${ m } _DEPS_EXT "^opencv_[^ ]+$" )
if ( OPENCV_MODULE_ ${ m } _DEPS_EXT AND OPENCV_MODULE_ ${ m } _DEPS )
list ( REMOVE_ITEM OPENCV_MODULE_ ${ m } _DEPS ${ OPENCV_MODULE_${m } _DEPS_EXT} )
endif ( )
endforeach ( )
# reorder dependencies
foreach ( m ${ OPENCV_MODULES_BUILD } )
__ocv_sort_modules_by_deps ( OPENCV_MODULE_ ${ m } _DEPS )
ocv_list_sort ( OPENCV_MODULE_ ${ m } _DEPS_EXT )
set ( OPENCV_MODULE_ ${ m } _DEPS ${ OPENCV_MODULE_${m } _DEPS} CACHE INTERNAL "Flattened dependencies of ${m} module" )
set ( OPENCV_MODULE_ ${ m } _DEPS_EXT ${ OPENCV_MODULE_${m } _DEPS_EXT} CACHE INTERNAL "Extra dependencies of ${m} module" )
# message(STATUS " module deps: ${OPENCV_MODULE_${m}_DEPS}")
# message(STATUS " extra deps: ${OPENCV_MODULE_${m}_DEPS_EXT}")
endforeach ( )
__ocv_sort_modules_by_deps ( OPENCV_MODULES_BUILD )
set ( OPENCV_MODULES_PUBLIC ${ OPENCV_MODULES_PUBLIC } CACHE INTERNAL "List of OpenCV modules marked for export" )
set ( OPENCV_MODULES_BUILD ${ OPENCV_MODULES_BUILD } CACHE INTERNAL "List of OpenCV modules included into the build" )
set ( OPENCV_MODULES_DISABLED_AUTO ${ OPENCV_MODULES_DISABLED_AUTO } CACHE INTERNAL "List of OpenCV modules implicitly disabled due to dependencies" )
endfunction ( )
2012-02-03 12:26:49 +01:00
# setup include paths for the list of passed modules
macro ( ocv_include_modules )
foreach ( d ${ ARGN } )
if ( d MATCHES "^opencv_" AND HAVE_ ${ d } )
if ( EXISTS "${OPENCV_MODULE_${d}_LOCATION}/include" )
2012-03-03 16:49:23 +01:00
ocv_include_directories ( "${OPENCV_MODULE_${d}_LOCATION}/include" )
2012-02-03 12:26:49 +01:00
endif ( )
elseif ( EXISTS "${d}" )
2012-03-03 16:49:23 +01:00
ocv_include_directories ( "${d}" )
2012-02-03 12:26:49 +01:00
endif ( )
endforeach ( )
endmacro ( )
2012-01-03 14:48:12 +01:00
2012-03-27 18:05:52 +02:00
# setup include paths for the list of passed modules and recursively add dependent modules
macro ( ocv_include_modules_recurse )
foreach ( d ${ ARGN } )
if ( d MATCHES "^opencv_" AND HAVE_ ${ d } )
if ( EXISTS "${OPENCV_MODULE_${d}_LOCATION}/include" )
ocv_include_directories ( "${OPENCV_MODULE_${d}_LOCATION}/include" )
endif ( )
if ( OPENCV_MODULE_ ${ d } _DEPS )
2013-08-07 10:53:48 +02:00
ocv_include_modules ( ${ OPENCV_MODULE_${d } _DEPS} )
2012-03-27 18:05:52 +02:00
endif ( )
elseif ( EXISTS "${d}" )
ocv_include_directories ( "${d}" )
endif ( )
endforeach ( )
endmacro ( )
2012-02-03 12:26:49 +01:00
# setup include path for OpenCV headers for specified module
# ocv_module_include_directories(<extra include directories/extra include modules>)
macro ( ocv_module_include_directories )
2012-03-03 16:49:23 +01:00
ocv_include_directories ( "${OPENCV_MODULE_${the_module}_LOCATION}/include"
" $ { O P E N C V _ M O D U L E _ $ { t h e _ m o d u l e } _ L O C A T I O N } / s r c "
2012-06-18 08:53:13 +02:00
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } " # for precompiled headers
2012-03-03 16:49:23 +01:00
)
2012-02-03 12:26:49 +01:00
ocv_include_modules ( ${ OPENCV_MODULE_${the_module } _DEPS} ${ ARGN } )
endmacro ( )
2011-09-06 17:30:28 +02:00
2012-02-03 12:26:49 +01:00
# sets header and source files for the current module
# NB: all files specified as headers will be installed
# Usage:
# ocv_set_module_sources([HEADERS] <list of files> [SOURCES] <list of files>)
macro ( ocv_set_module_sources )
set ( OPENCV_MODULE_ ${ the_module } _HEADERS "" )
set ( OPENCV_MODULE_ ${ the_module } _SOURCES "" )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
foreach ( f "HEADERS" ${ ARGN } )
if ( f STREQUAL "HEADERS" OR f STREQUAL "SOURCES" )
set ( __filesvar "OPENCV_MODULE_${the_module}_${f}" )
else ( )
list ( APPEND ${ __filesvar } "${f}" )
endif ( )
endforeach ( )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
# the hacky way to embeed any files into the OpenCV without modification of its build system
if ( COMMAND ocv_get_module_external_sources )
ocv_get_module_external_sources ( )
endif ( )
2011-09-06 17:30:28 +02:00
2012-03-25 21:57:58 +02:00
# use full paths for module to be independent from the module location
2012-06-18 08:53:13 +02:00
ocv_convert_to_full_paths ( OPENCV_MODULE_ ${ the_module } _HEADERS )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
set ( OPENCV_MODULE_ ${ the_module } _HEADERS ${ OPENCV_MODULE_${the_module } _HEADERS} CACHE INTERNAL "List of header files for ${the_module}" )
set ( OPENCV_MODULE_ ${ the_module } _SOURCES ${ OPENCV_MODULE_${the_module } _SOURCES} CACHE INTERNAL "List of source files for ${the_module}" )
endmacro ( )
2011-09-06 17:30:28 +02:00
2012-02-03 12:26:49 +01:00
# finds and sets headers and sources for the standard OpenCV module
# Usage:
2014-03-05 09:31:04 +01:00
# ocv_glob_module_sources([EXCLUDE_CUDA] <extra sources&headers in the same format as used in ocv_set_module_sources>)
2012-02-03 12:26:49 +01:00
macro ( ocv_glob_module_sources )
2014-03-05 09:31:04 +01:00
set ( _argn ${ ARGN } )
list ( FIND _argn "EXCLUDE_CUDA" exclude_cuda )
if ( NOT exclude_cuda EQUAL -1 )
list ( REMOVE_AT _argn ${ exclude_cuda } )
endif ( )
2012-08-28 15:44:33 +02:00
file ( GLOB_RECURSE lib_srcs "src/*.cpp" )
file ( GLOB_RECURSE lib_int_hdrs "src/*.hpp" "src/*.h" )
2015-08-02 13:13:58 +02:00
file ( GLOB lib_hdrs "include/opencv2/*.hpp" "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h" )
2012-02-03 12:26:49 +01:00
file ( GLOB lib_hdrs_detail "include/opencv2/${name}/detail/*.hpp" "include/opencv2/${name}/detail/*.h" )
2014-03-12 13:21:36 +01:00
file ( GLOB_RECURSE lib_srcs_apple "src/*.mm" )
2014-02-08 16:31:24 +01:00
if ( APPLE )
list ( APPEND lib_srcs ${ lib_srcs_apple } )
endif ( )
2011-09-06 17:30:28 +02:00
2014-03-05 09:31:04 +01:00
if ( exclude_cuda EQUAL -1 )
2014-03-05 08:25:27 +01:00
file ( GLOB lib_cuda_srcs "src/cuda/*.cu" )
set ( cuda_objs "" )
set ( lib_cuda_hdrs "" )
if ( HAVE_CUDA )
ocv_include_directories ( ${ CUDA_INCLUDE_DIRS } )
file ( GLOB lib_cuda_hdrs "src/cuda/*.hpp" )
2013-04-10 10:20:54 +02:00
2014-03-05 08:25:27 +01:00
ocv_cuda_compile ( cuda_objs ${ lib_cuda_srcs } ${ lib_cuda_hdrs } )
source_group ( "Src\\Cuda" FILES ${ lib_cuda_srcs } ${ lib_cuda_hdrs } )
endif ( )
else ( )
set ( cuda_objs "" )
set ( lib_cuda_srcs "" )
set ( lib_cuda_hdrs "" )
2013-04-10 10:20:54 +02:00
endif ( )
2013-09-25 17:07:14 +02:00
source_group ( "Src" FILES ${ lib_srcs } ${ lib_int_hdrs } )
2013-04-10 10:20:54 +02:00
file ( GLOB cl_kernels "src/opencl/*.cl" )
2013-10-30 11:02:08 +01:00
if ( HAVE_opencv_ocl AND cl_kernels )
2013-03-15 20:56:31 +01:00
ocv_include_directories ( ${ OPENCL_INCLUDE_DIRS } )
add_custom_command (
2013-09-27 14:41:25 +02:00
O U T P U T " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / o p e n c l _ k e r n e l s . c p p " " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / o p e n c l _ k e r n e l s . h p p "
C O M M A N D $ { C M A K E _ C O M M A N D } - D C L _ D I R = " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / o p e n c l " - D O U T P U T = " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / o p e n c l _ k e r n e l s . c p p " - P " $ { O p e n C V _ S O U R C E _ D I R } / c m a k e / c l 2 c p p . c m a k e "
2013-03-15 20:56:31 +01:00
D E P E N D S $ { c l _ k e r n e l s } " $ { O p e n C V _ S O U R C E _ D I R } / c m a k e / c l 2 c p p . c m a k e " )
2013-09-27 14:41:25 +02:00
source_group ( "OpenCL" FILES ${ cl_kernels } "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp" )
list ( APPEND lib_srcs ${ cl_kernels } "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp" )
2013-03-15 20:56:31 +01:00
endif ( )
2014-07-10 01:55:39 +02:00
if ( ENABLE_AVX )
file ( GLOB avx_srcs "src/avx/*.cpp" )
foreach ( src ${ avx_srcs } )
2014-07-21 22:26:50 +02:00
if ( CMAKE_COMPILER_IS_GNUCXX )
set_source_files_properties ( ${ src } PROPERTIES COMPILE_FLAGS -mavx )
elseif ( MSVC AND NOT MSVC_VERSION LESS 1600 )
set_source_files_properties ( ${ src } PROPERTIES COMPILE_FLAGS /arch:AVX )
endif ( )
2014-07-10 01:55:39 +02:00
endforeach ( )
endif ( )
if ( ENABLE_AVX2 )
file ( GLOB avx2_srcs "src/avx2/*.cpp" )
foreach ( src ${ avx2_srcs } )
2014-07-21 22:26:50 +02:00
if ( CMAKE_COMPILER_IS_GNUCXX )
set_source_files_properties ( ${ src } PROPERTIES COMPILE_FLAGS -mavx2 )
elseif ( MSVC AND NOT MSVC_VERSION LESS 1800 )
set_source_files_properties ( ${ src } PROPERTIES COMPILE_FLAGS /arch:AVX2 )
endif ( )
2014-07-10 01:55:39 +02:00
endforeach ( )
endif ( )
2013-04-10 10:20:54 +02:00
source_group ( "Include" FILES ${ lib_hdrs } )
source_group ( "Include\\detail" FILES ${ lib_hdrs_detail } )
2014-03-05 09:31:04 +01:00
ocv_set_module_sources ( ${ _argn } HEADERS ${ lib_hdrs } ${ lib_hdrs_detail }
S O U R C E S $ { l i b _ s r c s } $ { l i b _ i n t _ h d r s } $ { c u d a _ o b j s } $ { l i b _ c u d a _ s r c s } $ { l i b _ c u d a _ h d r s } )
2011-09-06 17:30:28 +02:00
endmacro ( )
2012-02-03 12:26:49 +01:00
# creates OpenCV module in current folder
# creates new target, configures standard dependencies, compilers flags, install rules
# Usage:
2012-05-13 11:34:33 +02:00
# ocv_create_module(<extra link dependencies>)
# ocv_create_module(SKIP_LINK)
2012-02-03 12:26:49 +01:00
macro ( ocv_create_module )
2013-08-08 14:23:20 +02:00
# The condition we ought to be testing here is whether ocv_add_precompiled_headers will
# be called at some point in the future. We can't look into the future, though,
# so this will have to do.
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/precomp.hpp" )
get_native_precompiled_header ( ${ the_module } precomp.hpp )
endif ( )
2013-06-07 17:07:00 +02:00
add_library ( ${ the_module } ${ OPENCV_MODULE_TYPE } ${ OPENCV_MODULE_${the_module } _HEADERS} ${ OPENCV_MODULE_${the_module } _SOURCES}
2013-08-08 14:23:20 +02:00
" $ { O P E N C V _ C O N F I G _ F I L E _ I N C L U D E _ D I R } / c v c o n f i g . h " " $ { O P E N C V _ C O N F I G _ F I L E _ I N C L U D E _ D I R } / o p e n c v 2 / o p e n c v _ m o d u l e s . h p p "
$ { $ { t h e _ m o d u l e } _ p c h } )
2012-06-18 08:53:13 +02:00
2012-05-13 11:34:33 +02:00
if ( NOT "${ARGN}" STREQUAL "SKIP_LINK" )
2013-08-07 10:53:48 +02:00
target_link_libraries ( ${ the_module } ${ OPENCV_MODULE_${the_module } _DEPS} )
2013-10-25 11:54:55 +02:00
target_link_libraries ( ${ the_module } LINK_INTERFACE_LIBRARIES ${ OPENCV_MODULE_${the_module } _DEPS} )
target_link_libraries ( ${ the_module } ${ OPENCV_MODULE_${the_module } _DEPS_EXT} ${ OPENCV_LINKER_LIBS } ${ IPP_LIBS } ${ ARGN } )
2012-05-13 11:34:33 +02:00
endif ( )
2012-06-18 08:53:13 +02:00
2012-03-03 16:49:23 +01:00
add_dependencies ( opencv_modules ${ the_module } )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
if ( ENABLE_SOLUTION_FOLDERS )
set_target_properties ( ${ the_module } PROPERTIES FOLDER "modules" )
endif ( )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
set_target_properties ( ${ the_module } PROPERTIES
O U T P U T _ N A M E " $ { t h e _ m o d u l e } $ { O P E N C V _ D L L V E R S I O N } "
D E B U G _ P O S T F I X " $ { O P E N C V _ D E B U G _ P O S T F I X } "
A R C H I V E _ O U T P U T _ D I R E C T O R Y $ { L I B R A R Y _ O U T P U T _ P A T H }
2013-01-22 16:43:54 +01:00
L I B R A R Y _ O U T P U T _ D I R E C T O R Y $ { L I B R A R Y _ O U T P U T _ P A T H }
2012-02-03 12:26:49 +01:00
R U N T I M E _ O U T P U T _ D I R E C T O R Y $ { E X E C U T A B L E _ O U T P U T _ P A T H }
I N S T A L L _ N A M E _ D I R l i b
)
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
# For dynamic link numbering convenions
if ( NOT ANDROID )
# Android SDK build scripts can include only .so files into final .apk
# As result we should not set version properties for Android
set_target_properties ( ${ the_module } PROPERTIES
2013-01-18 11:57:55 +01:00
V E R S I O N $ { O P E N C V _ L I B V E R S I O N }
2012-02-03 12:26:49 +01:00
S O V E R S I O N $ { O P E N C V _ S O V E R S I O N }
)
endif ( )
2013-07-26 12:35:40 +02:00
if ( ( NOT DEFINED OPENCV_MODULE_TYPE AND BUILD_SHARED_LIBS )
OR ( DEFINED OPENCV_MODULE_TYPE AND OPENCV_MODULE_TYPE STREQUAL SHARED ) )
2013-09-21 19:12:39 +02:00
set_target_properties ( ${ the_module } PROPERTIES DEFINE_SYMBOL CVAPI_EXPORTS )
2012-02-03 12:26:49 +01:00
endif ( )
2011-06-03 14:01:55 +02:00
2012-02-03 12:26:49 +01:00
if ( MSVC )
if ( CMAKE_CROSSCOMPILING )
set_target_properties ( ${ the_module } PROPERTIES LINK_FLAGS "/NODEFAULTLIB:secchk" )
2012-01-03 14:48:12 +01:00
endif ( )
2012-06-18 08:53:13 +02:00
set_target_properties ( ${ the_module } PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libc /DEBUG" )
2012-02-03 12:26:49 +01:00
endif ( )
2012-01-03 14:48:12 +01:00
2013-08-07 10:53:48 +02:00
ocv_install_target ( ${ the_module } EXPORT OpenCVModules
2014-01-18 20:50:07 +01:00
R U N T I M E D E S T I N A T I O N $ { O P E N C V _ B I N _ I N S T A L L _ P A T H } C O M P O N E N T l i b s
2014-10-17 11:23:23 +02:00
L I B R A R Y D E S T I N A T I O N $ { O P E N C V _ L I B _ I N S T A L L _ P A T H } C O M P O N E N T l i b s N A M E L I N K _ S K I P
2014-01-17 13:30:31 +01:00
A R C H I V E D E S T I N A T I O N $ { O P E N C V _ L I B _ I N S T A L L _ P A T H } C O M P O N E N T d e v
2012-02-03 12:26:49 +01:00
)
2014-10-17 11:23:23 +02:00
get_target_property ( _target_type ${ the_module } TYPE )
if ( "${_target_type}" STREQUAL "SHARED_LIBRARY" )
install ( TARGETS ${ the_module }
L I B R A R Y D E S T I N A T I O N $ { O P E N C V _ L I B _ I N S T A L L _ P A T H } C O M P O N E N T d e v N A M E L I N K _ O N L Y )
endif ( )
2010-12-28 17:24:23 +01:00
2012-02-03 12:26:49 +01:00
# only "public" headers need to be installed
2012-06-18 08:53:13 +02:00
if ( OPENCV_MODULE_ ${ the_module } _HEADERS AND ";${OPENCV_MODULES_PUBLIC};" MATCHES ";${the_module};" )
2012-03-11 16:22:38 +01:00
foreach ( hdr ${ OPENCV_MODULE_${the_module } _HEADERS} )
2012-04-13 23:50:59 +02:00
string ( REGEX REPLACE "^.*opencv2/" "opencv2/" hdr2 "${hdr}" )
2015-08-02 13:13:58 +02:00
if ( hdr2 MATCHES "^(opencv2/?.*)/[^/]+.h(..)?$" )
2014-01-17 13:30:31 +01:00
install ( FILES ${ hdr } DESTINATION "${OPENCV_INCLUDE_INSTALL_PATH}/${CMAKE_MATCH_1}" COMPONENT dev )
2012-03-11 16:22:38 +01:00
endif ( )
endforeach ( )
2012-02-03 12:26:49 +01:00
endif ( )
endmacro ( )
# opencv precompiled headers macro (can add pch to modules and tests)
# this macro must be called after any "add_definitions" commands, otherwise precompiled headers will not work
# Usage:
# ocv_add_precompiled_headers(${the_module})
macro ( ocv_add_precompiled_headers the_target )
2012-06-18 08:53:13 +02:00
if ( "${the_target}" MATCHES "^opencv_test_.*$" )
SET ( pch_path "test/test_" )
elseif ( "${the_target}" MATCHES "^opencv_perf_.*$" )
SET ( pch_path "perf/perf_" )
else ( )
SET ( pch_path "src/" )
endif ( )
ocv_add_precompiled_header_to_target ( ${ the_target } "${CMAKE_CURRENT_SOURCE_DIR}/${pch_path}precomp.hpp" )
unset ( pch_path )
2012-02-03 12:26:49 +01:00
endmacro ( )
2010-12-28 17:24:23 +01:00
2012-02-03 12:26:49 +01:00
# short command for adding simple OpenCV module
# see ocv_add_module for argument details
# Usage:
2014-03-05 09:31:04 +01:00
# ocv_define_module(module_name [INTERNAL] [EXCLUDE_CUDA] [REQUIRED] [<list of dependencies>] [OPTIONAL <list of optional dependencies>])
2012-02-03 12:26:49 +01:00
macro ( ocv_define_module module_name )
2014-03-05 09:31:04 +01:00
set ( _argn ${ ARGN } )
set ( exclude_cuda "" )
foreach ( arg ${ _argn } )
if ( "${arg}" STREQUAL "EXCLUDE_CUDA" )
set ( exclude_cuda "${arg}" )
list ( REMOVE_ITEM _argn ${ arg } )
2014-03-05 08:25:27 +01:00
endif ( )
endforeach ( )
2014-03-05 09:31:04 +01:00
ocv_add_module ( ${ module_name } ${ _argn } )
2012-02-03 12:26:49 +01:00
ocv_module_include_directories ( )
2014-03-05 09:31:04 +01:00
ocv_glob_module_sources ( ${ exclude_cuda } )
2012-02-03 12:26:49 +01:00
ocv_create_module ( )
ocv_add_precompiled_headers ( ${ the_module } )
ocv_add_accuracy_tests ( )
ocv_add_perf_tests ( )
2013-09-04 16:41:19 +02:00
ocv_add_samples ( )
2012-02-03 12:26:49 +01:00
endmacro ( )
2010-12-28 17:24:23 +01:00
2012-02-03 12:26:49 +01:00
# ensures that all passed modules are available
# sets OCV_DEPENDENCIES_FOUND variable to TRUE/FALSE
macro ( ocv_check_dependencies )
set ( OCV_DEPENDENCIES_FOUND TRUE )
foreach ( d ${ ARGN } )
if ( d MATCHES "^opencv_[^ ]+$" AND NOT HAVE_ ${ d } )
set ( OCV_DEPENDENCIES_FOUND FALSE )
break ( )
2012-01-24 17:55:47 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endforeach ( )
2012-01-24 17:55:47 +01:00
endmacro ( )
2012-06-18 08:53:13 +02:00
# auxiliary macro to parse arguments of ocv_add_accuracy_tests and ocv_add_perf_tests commands
2012-02-03 12:26:49 +01:00
macro ( __ocv_parse_test_sources tests_type )
set ( OPENCV_ ${ tests_type } _ ${ the_module } _SOURCES "" )
set ( OPENCV_ ${ tests_type } _ ${ the_module } _DEPS "" )
set ( __file_group_name "" )
set ( __file_group_sources "" )
foreach ( arg "DEPENDS_ON" ${ ARGN } "FILES" )
if ( arg STREQUAL "FILES" )
set ( __currentvar "__file_group_sources" )
if ( __file_group_name AND __file_group_sources )
source_group ( "${__file_group_name}" FILES ${ __file_group_sources } )
list ( APPEND OPENCV_ ${ tests_type } _ ${ the_module } _SOURCES ${ __file_group_sources } )
endif ( )
set ( __file_group_name "" )
set ( __file_group_sources "" )
elseif ( arg STREQUAL "DEPENDS_ON" )
set ( __currentvar "OPENCV_TEST_${the_module}_DEPS" )
2014-12-21 15:59:50 +01:00
elseif ( " ${__currentvar}" STREQUAL " __file_group_sources" AND NOT __file_group_name ) # spaces to avoid CMP0054
2012-02-03 12:26:49 +01:00
set ( __file_group_name "${arg}" )
else ( )
list ( APPEND ${ __currentvar } "${arg}" )
endif ( )
endforeach ( )
unset ( __file_group_name )
unset ( __file_group_sources )
unset ( __currentvar )
endmacro ( )
2012-01-24 17:55:47 +01:00
2012-02-03 12:26:49 +01:00
# this is a command for adding OpenCV performance tests to the module
# ocv_add_perf_tests(<extra_dependencies>)
2012-06-18 08:53:13 +02:00
function ( ocv_add_perf_tests )
2012-02-03 12:26:49 +01:00
set ( perf_path "${CMAKE_CURRENT_SOURCE_DIR}/perf" )
if ( BUILD_PERF_TESTS AND EXISTS "${perf_path}" )
__ocv_parse_test_sources ( PERF ${ ARGN } )
2012-01-24 17:55:47 +01:00
2012-02-03 12:26:49 +01:00
# opencv_highgui is required for imread/imwrite
2012-10-09 16:37:26 +02:00
set ( perf_deps ${ the_module } opencv_ts opencv_highgui ${ OPENCV_PERF_${the_module } _DEPS} ${ OPENCV_MODULE_opencv_ts_DEPS } )
2012-02-03 12:26:49 +01:00
ocv_check_dependencies ( ${ perf_deps } )
2012-01-24 17:55:47 +01:00
2012-02-03 12:26:49 +01:00
if ( OCV_DEPENDENCIES_FOUND )
set ( the_target "opencv_perf_${name}" )
2012-06-18 08:53:13 +02:00
# project(${the_target})
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
ocv_module_include_directories ( ${ perf_deps } "${perf_path}" )
2012-01-24 17:55:47 +01:00
2012-02-03 12:26:49 +01:00
if ( NOT OPENCV_PERF_ ${ the_module } _SOURCES )
file ( GLOB perf_srcs "${perf_path}/*.cpp" )
file ( GLOB perf_hdrs "${perf_path}/*.hpp" "${perf_path}/*.h" )
source_group ( "Src" FILES ${ perf_srcs } )
source_group ( "Include" FILES ${ perf_hdrs } )
set ( OPENCV_PERF_ ${ the_module } _SOURCES ${ perf_srcs } ${ perf_hdrs } )
endif ( )
2011-07-24 21:22:58 +02:00
2013-08-20 10:51:33 +02:00
get_native_precompiled_header ( ${ the_target } perf_precomp.hpp )
2013-08-08 14:23:20 +02:00
add_executable ( ${ the_target } ${ OPENCV_PERF_${the_module } _SOURCES} ${ ${the_target } _pch} )
2012-02-16 21:29:35 +01:00
target_link_libraries ( ${ the_target } ${ OPENCV_MODULE_${the_module } _DEPS} ${ perf_deps } ${ OPENCV_LINKER_LIBS } )
2012-03-02 09:48:33 +01:00
add_dependencies ( opencv_perf_tests ${ the_target } )
2012-01-25 14:12:11 +01:00
2012-02-03 12:26:49 +01:00
# Additional target properties
set_target_properties ( ${ the_target } PROPERTIES
D E B U G _ P O S T F I X " $ { O P E N C V _ D E B U G _ P O S T F I X } "
R U N T I M E _ O U T P U T _ D I R E C T O R Y " $ { E X E C U T A B L E _ O U T P U T _ P A T H } "
)
if ( ENABLE_SOLUTION_FOLDERS )
set_target_properties ( ${ the_target } PROPERTIES FOLDER "tests performance" )
endif ( )
ocv_add_precompiled_headers ( ${ the_target } )
2014-10-21 16:50:38 +02:00
if ( CMAKE_VERSION VERSION_GREATER "2.8" AND OPENCV_TEST_DATA_PATH )
add_test ( NAME ${ the_target } COMMAND ${ the_target } --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity )
2014-10-21 16:51:02 +02:00
get_filename_component ( cur_modules_loc "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE )
get_filename_component ( default_modules_loc "${CMAKE_SOURCE_DIR}/modules" ABSOLUTE )
if ( "${cur_modules_loc}" STREQUAL "${default_modules_loc}" )
set ( test_category "Public" )
else ( )
set ( test_category "Extra" )
endif ( )
2014-10-21 16:50:38 +02:00
set_tests_properties ( ${ the_target } PROPERTIES
2014-10-21 16:51:02 +02:00
L A B E L S " $ { t e s t _ c a t e g o r y } ; S a n i t y "
2014-10-21 16:50:38 +02:00
E N V I R O N M E N T " O P E N C V _ T E S T _ D A T A _ P A T H = $ { O P E N C V _ T E S T _ D A T A _ P A T H } " )
endif ( )
2012-02-03 12:26:49 +01:00
else ( OCV_DEPENDENCIES_FOUND )
2012-06-18 08:53:13 +02:00
# TODO: warn about unsatisfied dependencies
2012-02-03 12:26:49 +01:00
endif ( OCV_DEPENDENCIES_FOUND )
2014-01-27 11:20:30 +01:00
if ( INSTALL_TESTS )
2014-01-29 09:01:06 +01:00
install ( TARGETS ${ the_target } RUNTIME DESTINATION ${ OPENCV_TEST_INSTALL_PATH } COMPONENT tests )
2014-01-27 11:20:30 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endif ( )
2012-06-18 08:53:13 +02:00
endfunction ( )
2012-02-02 15:06:13 +01:00
2012-02-03 12:26:49 +01:00
# this is a command for adding OpenCV accuracy/regression tests to the module
# ocv_add_accuracy_tests([FILES <source group name> <list of sources>] [DEPENDS_ON] <list of extra dependencies>)
2012-06-18 08:53:13 +02:00
function ( ocv_add_accuracy_tests )
2012-02-03 12:26:49 +01:00
set ( test_path "${CMAKE_CURRENT_SOURCE_DIR}/test" )
ocv_check_dependencies ( ${ test_deps } )
if ( BUILD_TESTS AND EXISTS "${test_path}" )
__ocv_parse_test_sources ( TEST ${ ARGN } )
# opencv_highgui is required for imread/imwrite
2012-10-09 16:37:26 +02:00
set ( test_deps ${ the_module } opencv_ts opencv_highgui ${ OPENCV_TEST_${the_module } _DEPS} ${ OPENCV_MODULE_opencv_ts_DEPS } )
2012-02-03 12:26:49 +01:00
ocv_check_dependencies ( ${ test_deps } )
if ( OCV_DEPENDENCIES_FOUND )
set ( the_target "opencv_test_${name}" )
2012-06-18 08:53:13 +02:00
# project(${the_target})
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
ocv_module_include_directories ( ${ test_deps } "${test_path}" )
2012-01-25 14:12:11 +01:00
2012-02-03 12:26:49 +01:00
if ( NOT OPENCV_TEST_ ${ the_module } _SOURCES )
file ( GLOB test_srcs "${test_path}/*.cpp" )
file ( GLOB test_hdrs "${test_path}/*.hpp" "${test_path}/*.h" )
source_group ( "Src" FILES ${ test_srcs } )
source_group ( "Include" FILES ${ test_hdrs } )
set ( OPENCV_TEST_ ${ the_module } _SOURCES ${ test_srcs } ${ test_hdrs } )
endif ( )
2012-03-25 21:57:58 +02:00
2013-08-08 14:23:20 +02:00
get_native_precompiled_header ( ${ the_target } test_precomp.hpp )
add_executable ( ${ the_target } ${ OPENCV_TEST_${the_module } _SOURCES} ${ ${the_target } _pch} )
2012-02-16 21:29:35 +01:00
target_link_libraries ( ${ the_target } ${ OPENCV_MODULE_${the_module } _DEPS} ${ test_deps } ${ OPENCV_LINKER_LIBS } )
2012-03-02 09:48:33 +01:00
add_dependencies ( opencv_tests ${ the_target } )
2012-01-24 17:55:47 +01:00
2012-02-03 12:26:49 +01:00
# Additional target properties
set_target_properties ( ${ the_target } PROPERTIES
D E B U G _ P O S T F I X " $ { O P E N C V _ D E B U G _ P O S T F I X } "
R U N T I M E _ O U T P U T _ D I R E C T O R Y " $ { E X E C U T A B L E _ O U T P U T _ P A T H } "
)
if ( ENABLE_SOLUTION_FOLDERS )
set_target_properties ( ${ the_target } PROPERTIES FOLDER "tests accuracy" )
endif ( )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
ocv_add_precompiled_headers ( ${ the_target } )
2014-10-21 16:48:46 +02:00
2014-10-21 16:49:53 +02:00
if ( CMAKE_VERSION VERSION_GREATER "2.8" AND OPENCV_TEST_DATA_PATH AND NOT "${the_target}" MATCHES "opencv_test_viz" )
2014-10-21 16:48:46 +02:00
add_test ( NAME ${ the_target } COMMAND ${ the_target } )
2014-10-21 16:51:02 +02:00
get_filename_component ( cur_modules_loc "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE )
get_filename_component ( default_modules_loc "${CMAKE_SOURCE_DIR}/modules" ABSOLUTE )
if ( "${cur_modules_loc}" STREQUAL "${default_modules_loc}" )
set ( test_category "Public" )
else ( )
set ( test_category "Extra" )
endif ( )
2014-10-21 16:48:46 +02:00
set_tests_properties ( ${ the_target } PROPERTIES
2014-10-21 16:51:02 +02:00
L A B E L S " $ { t e s t _ c a t e g o r y } ; A c c u r a c y "
2014-10-21 16:48:46 +02:00
E N V I R O N M E N T " O P E N C V _ T E S T _ D A T A _ P A T H = $ { O P E N C V _ T E S T _ D A T A _ P A T H } " )
endif ( )
2012-02-03 12:26:49 +01:00
else ( OCV_DEPENDENCIES_FOUND )
2012-06-18 08:53:13 +02:00
# TODO: warn about unsatisfied dependencies
2012-02-03 12:26:49 +01:00
endif ( OCV_DEPENDENCIES_FOUND )
2014-01-27 11:20:30 +01:00
if ( INSTALL_TESTS )
2014-01-29 09:01:06 +01:00
install ( TARGETS ${ the_target } RUNTIME DESTINATION ${ OPENCV_TEST_INSTALL_PATH } COMPONENT tests )
2014-01-27 11:20:30 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endif ( )
2012-06-18 08:53:13 +02:00
endfunction ( )
2012-01-25 14:12:11 +01:00
2013-09-04 16:41:19 +02:00
function ( ocv_add_samples )
set ( samples_path "${CMAKE_CURRENT_SOURCE_DIR}/samples" )
string ( REGEX REPLACE "^opencv_" "" module_id ${ the_module } )
if ( BUILD_EXAMPLES AND EXISTS "${samples_path}" )
set ( samples_deps ${ the_module } ${ OPENCV_MODULE_${the_module } _DEPS} opencv_highgui ${ ARGN } )
ocv_check_dependencies ( ${ samples_deps } )
if ( OCV_DEPENDENCIES_FOUND )
file ( GLOB sample_sources "${samples_path}/*.cpp" )
ocv_include_modules ( ${ OPENCV_MODULE_${the_module } _DEPS} )
foreach ( source ${ sample_sources } )
get_filename_component ( name "${source}" NAME_WE )
set ( the_target "example_${module_id}_${name}" )
add_executable ( ${ the_target } "${source}" )
target_link_libraries ( ${ the_target } ${ samples_deps } )
set_target_properties ( ${ the_target } PROPERTIES PROJECT_LABEL "(sample) ${name}" )
if ( ENABLE_SOLUTION_FOLDERS )
set_target_properties ( ${ the_target } PROPERTIES
O U T P U T _ N A M E " $ { m o d u l e _ i d } - e x a m p l e - $ { n a m e } "
F O L D E R " s a m p l e s / $ { m o d u l e _ i d } " )
endif ( )
if ( WIN32 )
2014-01-17 13:30:31 +01:00
install ( TARGETS ${ the_target } RUNTIME DESTINATION "samples/${module_id}" COMPONENT samples )
2013-09-04 16:41:19 +02:00
endif ( )
endforeach ( )
endif ( )
endif ( )
if ( INSTALL_C_EXAMPLES AND NOT WIN32 AND EXISTS "${samples_path}" )
file ( GLOB sample_files "${samples_path}/*" )
install ( FILES ${ sample_files }
2014-01-27 14:57:11 +01:00
D E S T I N A T I O N $ { O P E N C V _ S A M P L E S _ S R C _ I N S T A L L _ P A T H } / $ { m o d u l e _ i d }
2015-01-31 22:34:23 +01:00
P E R M I S S I O N S O W N E R _ W R I T E O W N E R _ R E A D G R O U P _ R E A D W O R L D _ R E A D C O M P O N E N T s a m p l e s )
2013-09-04 16:41:19 +02:00
endif ( )
endfunction ( )
2012-06-18 08:53:13 +02:00
# internal macro; finds all link dependencies of the module
2012-02-03 12:26:49 +01:00
# should be used at the end of CMake processing
macro ( __ocv_track_module_link_dependencies the_module optkind )
set ( ${ the_module } _MODULE_DEPS_ ${ optkind } "" )
set ( ${ the_module } _EXTRA_DEPS_ ${ optkind } "" )
get_target_property ( __module_type ${ the_module } TYPE )
if ( __module_type STREQUAL "STATIC_LIBRARY" )
#in case of static library we have to inherit its dependencies (in right order!!!)
if ( NOT DEFINED ${ the_module } _LIB_DEPENDS_ ${ optkind } )
ocv_split_libs_list ( ${ the_module } _LIB_DEPENDS ${ the_module } _LIB_DEPENDS_DBG ${ the_module } _LIB_DEPENDS_OPT )
endif ( )
2012-01-25 14:12:11 +01:00
2012-02-03 12:26:49 +01:00
set ( __resolved_deps "" )
set ( __mod_depends ${ ${the_module } _LIB_DEPENDS_ ${ optkind } } )
set ( __has_cycle FALSE )
while ( __mod_depends )
list ( GET __mod_depends 0 __dep )
list ( REMOVE_AT __mod_depends 0 )
if ( __dep STREQUAL the_module )
set ( __has_cycle TRUE )
2015-03-30 14:16:32 +02:00
else ( )
2012-02-03 12:26:49 +01:00
ocv_regex_escape ( __rdep "${__dep}" )
if ( __resolved_deps MATCHES "(^|;)${__rdep}(;|$)" )
#all dependencies of this module are already resolved
list ( APPEND ${ the_module } _MODULE_DEPS_ ${ optkind } "${__dep}" )
2014-12-21 15:59:50 +01:00
elseif ( TARGET ${ __dep } )
2015-03-30 14:16:32 +02:00
get_target_property ( __dep_imported ${ __dep } IMPORTED )
if ( __dep_imported )
list ( APPEND ${ the_module } _EXTRA_DEPS_ ${ optkind } "${__dep}" )
else ( )
get_target_property ( __module_type ${ __dep } TYPE )
if ( __module_type STREQUAL "STATIC_LIBRARY" )
if ( NOT DEFINED ${ __dep } _LIB_DEPENDS_ ${ optkind } )
ocv_split_libs_list ( ${ __dep } _LIB_DEPENDS ${ __dep } _LIB_DEPENDS_DBG ${ __dep } _LIB_DEPENDS_OPT )
endif ( )
list ( INSERT __mod_depends 0 ${ ${__dep } _LIB_DEPENDS_ ${ optkind } } ${ __dep } )
list ( APPEND __resolved_deps "${__dep}" )
2012-02-03 12:26:49 +01:00
endif ( )
endif ( )
2014-12-21 15:59:50 +01:00
else ( )
list ( APPEND ${ the_module } _EXTRA_DEPS_ ${ optkind } "${__dep}" )
2012-01-25 10:04:49 +01:00
endif ( )
2012-02-03 12:26:49 +01:00
endif ( )
endwhile ( )
2012-03-25 21:57:58 +02:00
2012-02-03 12:26:49 +01:00
ocv_list_unique ( ${ the_module } _MODULE_DEPS_ ${ optkind } )
#ocv_list_reverse(${the_module}_MODULE_DEPS_${optkind})
ocv_list_unique ( ${ the_module } _EXTRA_DEPS_ ${ optkind } )
#ocv_list_reverse(${the_module}_EXTRA_DEPS_${optkind})
if ( __has_cycle )
2012-06-18 08:53:13 +02:00
# not sure if it can work
2012-02-03 12:26:49 +01:00
list ( APPEND ${ the_module } _MODULE_DEPS_ ${ optkind } "${the_module}" )
2012-01-24 17:55:47 +01:00
endif ( )
2015-03-30 14:16:32 +02:00
unset ( __dep_imported )
2012-02-03 12:26:49 +01:00
unset ( __mod_depends )
unset ( __resolved_deps )
unset ( __has_cycle )
unset ( __rdep )
endif ( ) #STATIC_LIBRARY
unset ( __module_type )
2012-06-18 08:53:13 +02:00
#message("${the_module}_MODULE_DEPS_${optkind}")
#message(" ${${the_module}_MODULE_DEPS_${optkind}}")
#message(" ${OPENCV_MODULE_${the_module}_DEPS}")
#message("")
#message("${the_module}_EXTRA_DEPS_${optkind}")
#message(" ${${the_module}_EXTRA_DEPS_${optkind}}")
#message("")
2012-01-24 17:55:47 +01:00
endmacro ( )
2012-02-03 12:26:49 +01:00
# creates lists of build dependencies needed for external projects
macro ( ocv_track_build_dependencies )
foreach ( m ${ OPENCV_MODULES_BUILD } )
__ocv_track_module_link_dependencies ( "${m}" OPT )
__ocv_track_module_link_dependencies ( "${m}" DBG )
endforeach ( )
endmacro ( )