# OPENCV_MODULE_${the_module}_PRIVATE_REQ_DEPS
# OPENCV_MODULE_${the_module}_PRIVATE_OPT_DEPS
# OPENCV_MODULE_${the_module}_IS_PART_OF_WORLD
+# OPENCV_MODULE_${the_module}_CUDA_OBJECTS - compiled CUDA objects list
+# OPENCV_MODULE_${the_module}_CHILDREN - list of submodules for compound modules
# HAVE_${the_module} - for fast check of module availability
# To control the setup of the module you could also set:
# OPENCV_MODULE_TYPE - STATIC|SHARED - set to force override global settings for current module
# 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}
+# OPENCV_MODULE_CHILDREN - list of submodules
# The verbose template for OpenCV module:
#
endif()
# add self to the world dependencies
- # add to world only extra modules (ON) or only main modules (OFF)
- set(__expected_extra 0)
- if (OPENCV_EXTRA_WORLD)
- set(__expected_extra 1)
- endif()
- if((NOT DEFINED OPENCV_MODULE_IS_PART_OF_WORLD AND NOT OPENCV_MODULE_${the_module}_CLASS STREQUAL "BINDINGS"
- AND __expected_extra EQUAL OPENCV_PROCESSING_EXTRA_MODULES)
+ if((NOT DEFINED OPENCV_MODULE_IS_PART_OF_WORLD
+ AND NOT OPENCV_MODULE_${the_module}_CLASS STREQUAL "BINDINGS"
+ AND NOT OPENCV_PROCESSING_EXTRA_MODULES)
OR OPENCV_MODULE_IS_PART_OF_WORLD
)
set(OPENCV_MODULE_${the_module}_IS_PART_OF_WORLD ON CACHE INTERNAL "")
set(OPENCV_MODULES_DISABLED_USER ${OPENCV_MODULES_DISABLED_USER} "${the_module}" CACHE INTERNAL "List of OpenCV modules explicitly disabled by user")
endif()
- # TODO: add submodules if any
+ # add submodules if any
+ set(OPENCV_MODULE_${the_module}_CHILDREN "${OPENCV_MODULE_CHILDREN}" CACHE INTERNAL "List of ${the_module} submodules")
# stop processing of current file
return()
# 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}")
+ set(input ${${__lst}})
+ set(result "")
+ while(input)
+ list(LENGTH input length_before)
+ foreach (m ${input})
+ # check if module is in the result already
+ if (NOT ";${result};" MATCHES ";${m};")
+ # scan through module dependencies...
+ set(unresolved_deps_found FALSE)
+ foreach (d ${OPENCV_MODULE_${m}_CHILDREN} ${OPENCV_MODULE_${m}_DEPS})
+ # ... which are not already in the result and are enabled
+ if ((NOT ";${result};" MATCHES ";${d};") AND HAVE_${d})
+ set(unresolved_deps_found TRUE)
+ break()
+ endif()
+ endforeach()
+ # chek if all dependencies for this module has been resolved
+ if (NOT unresolved_deps_found)
+ list(APPEND result ${m})
+ list(REMOVE_ITEM input ${m})
endif()
endif()
endforeach()
- if(__index STREQUAL __lastindex)
- list(APPEND __result "${m}")
- else()
- list(INSERT __result ${__index} "${m}")
+ list(LENGTH input length_after)
+ # check for infinite loop or unresolved dependencies
+ if (NOT length_after LESS length_before)
+ message(WARNING "Unresolved dependencies or loop in dependency graph (${length_after})\n"
+ "Processed ${__lst}: ${${__lst}}\n"
+ "Good modules: ${result}\n"
+ "Bad modules: ${input}"
+ )
+ list(APPEND result ${input})
+ break()
endif()
- endforeach()
- set(${__lst} "${__result}" PARENT_SCOPE)
+ endwhile()
+ set(${__lst} "${result}" PARENT_SCOPE)
endfunction()
# resolve dependensies
get_native_precompiled_header(${the_module} precomp.hpp)
endif()
+ set(sub_objs "")
+ set(sub_links "")
+ set(cuda_objs "")
+ if (DEFINED OPENCV_MODULE_${the_module}_CHILDREN)
+ status("Complex module ${the_module}")
+ foreach (m ${OPENCV_MODULE_${the_module}_CHILDREN})
+ if (BUILD_${m} AND TARGET ${m}_object) # ambigous?
+ get_target_property(_sub_links ${m} LINK_LIBRARIES)
+ list(APPEND sub_objs $<TARGET_OBJECTS:${m}_object>)
+ list(APPEND sub_links ${_sub_links})
+ status(" + ${m}")
+ else()
+ status(" - ${m}")
+ endif()
+ list(APPEND cuda_objs ${OPENCV_MODULE_${m}_CUDA_OBJECTS})
+ endforeach()
+ endif()
+
ocv_add_library(${the_module} ${OPENCV_MODULE_TYPE} ${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES}
"${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv2/opencv_modules.hpp"
- ${${the_module}_pch})
+ ${${the_module}_pch} ${sub_objs})
+
+ if (cuda_objs)
+ target_link_libraries(${the_module} ${cuda_objs})
+ endif()
+
+ # TODO: is it needed?
+ if (sub_links)
+ ocv_list_filterout(sub_links "^opencv_")
+ ocv_list_unique(sub_links)
+ target_link_libraries(${the_module} ${sub_links})
+ endif()
+
+ unset(sub_objs)
+ unset(sub_links)
+ unset(cuda_objs)
+
if(NOT the_module STREQUAL opencv_ts)
set_target_properties(${the_module} PROPERTIES COMPILE_DEFINITIONS OPENCV_NOSTL)
endif()
if((NOT DEFINED OPENCV_MODULE_TYPE AND BUILD_SHARED_LIBS)
OR (DEFINED OPENCV_MODULE_TYPE AND OPENCV_MODULE_TYPE STREQUAL SHARED))
+ set_target_properties(${the_module} PROPERTIES COMPILE_DEFINITIONS CVAPI_EXPORTS)
set_target_properties(${the_module} PROPERTIES DEFINE_SYMBOL CVAPI_EXPORTS)
endif()
set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libc /DEBUG")
endif()
- ocv_install_target(${the_module} EXPORT OpenCVModules
+ ocv_install_target(${the_module} EXPORT OpenCVModules OPTIONAL
RUNTIME DESTINATION ${OPENCV_BIN_INSTALL_PATH} COMPONENT libs
LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT libs
ARCHIVE DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT dev
)
- # only "public" headers need to be installed
- if(OPENCV_MODULE_${the_module}_HEADERS AND ";${OPENCV_MODULES_PUBLIC};" MATCHES ";${the_module};")
- foreach(hdr ${OPENCV_MODULE_${the_module}_HEADERS})
- string(REGEX REPLACE "^.*opencv2/" "opencv2/" hdr2 "${hdr}")
- if(NOT hdr2 MATCHES "opencv2/${the_module}/private.*" AND hdr2 MATCHES "^(opencv2/?.*)/[^/]+.h(..)?$" )
- install(FILES ${hdr} DESTINATION "${OPENCV_INCLUDE_INSTALL_PATH}/${CMAKE_MATCH_1}" COMPONENT dev)
- endif()
- endforeach()
- endif()
+ foreach(m ${OPENCV_MODULE_${the_module}_CHILDREN} ${the_module})
+ # only "public" headers need to be installed
+ if(OPENCV_MODULE_${m}_HEADERS AND ";${OPENCV_MODULES_PUBLIC};" MATCHES ";${m};")
+ foreach(hdr ${OPENCV_MODULE_${m}_HEADERS})
+ string(REGEX REPLACE "^.*opencv2/" "opencv2/" hdr2 "${hdr}")
+ if(NOT hdr2 MATCHES "opencv2/${m}/private.*" AND hdr2 MATCHES "^(opencv2/?.*)/[^/]+.h(..)?$" )
+ install(FILES ${hdr} OPTIONAL DESTINATION "${OPENCV_INCLUDE_INSTALL_PATH}/${CMAKE_MATCH_1}" COMPONENT dev)
+ endif()
+ endforeach()
+ endif()
+ endforeach()
+
_ocv_add_precompiled_headers(${the_module})
+
+ if (TARGET ${the_module}_object)
+ # copy COMPILE_DEFINITIONS
+ get_target_property(main_defs ${the_module} COMPILE_DEFINITIONS)
+ set_target_properties(${the_module}_object PROPERTIES COMPILE_DEFINITIONS ${main_defs})
+ # use same PCH
+ if (TARGET pch_Generate_${the_module})
+ add_dependencies(${the_module}_object pch_Generate_${the_module} )
+ endif()
+ endif()
endmacro()
# opencv precompiled headers macro (can add pch to modules and tests)
cmakeargs = ("-GXcode " +
"-DCMAKE_BUILD_TYPE=Release " +
"-DCMAKE_TOOLCHAIN_FILE=%s/platforms/ios/cmake/Toolchains/Toolchain-%s_Xcode.cmake " +
- "-DBUILD_opencv_world=ON " +
"-DCMAKE_C_FLAGS=\"-Wno-implicit-function-declaration\" " +
"-DCMAKE_INSTALL_PREFIX=install") % (srcroot, target)
cmakeargs += " -DENABLE_NEON=ON"
if opencv_contrib_path is not None:
- cmakeargs += " -DOPENCV_EXTRA_MODULES_PATH=%s -DOPENCV_EXTRA_WORLD=ON" % opencv_contrib_path
+ cmakeargs += " -DCMAKE_SKIP_INSTALL_ALL_DEPENDENCY=ON -DOPENCV_EXTRA_MODULES_PATH=%s -DBUILD_opencv_contrib_world=ON" % opencv_contrib_path
+ build_target = "opencv_contrib_world"
+ libname = "libopencv_contrib_world.a"
+ else:
+ cmakeargs += " -DBUILD_opencv_world=ON"
+ build_target = "ALL_BUILD"
+ libname = "libopencv_world.a"
# if cmake cache exists, just rerun cmake to update OpenCV.xcodeproj if necessary
if os.path.isfile(os.path.join(builddir, "CMakeCache.txt")):
else:
execute("cmake %s %s" % (cmakeargs, srcroot))
- for wlib in [builddir + "/modules/world/UninstalledProducts/libopencv_world.a",
- builddir + "/lib/Release/libopencv_world.a"]:
+ for wlib in [builddir + "/modules/world/UninstalledProducts/" + libname,
+ builddir + "/lib/Release/" + libname]:
if os.path.isfile(wlib):
os.remove(wlib)
- execute("xcodebuild IPHONEOS_DEPLOYMENT_TARGET=6.0 -parallelizeTargets ARCHS=%s -jobs 8 -sdk %s -configuration Release -target ALL_BUILD" % (arch, target.lower()))
+ execute("xcodebuild IPHONEOS_DEPLOYMENT_TARGET=6.0 -parallelizeTargets ARCHS=%s -jobs 8 -sdk %s -configuration Release -target %s" % (arch, target.lower(), build_target))
execute("xcodebuild IPHONEOS_DEPLOYMENT_TARGET=6.0 ARCHS=%s -sdk %s -configuration Release -target install install" % (arch, target.lower()))
os.chdir(currdir)
"constructs the framework directory after all the targets are built"
name = "opencv2" if opencv_contrib_path is None else "opencv2_contrib"
+ libname = "libopencv_world.a" if opencv_contrib_path is None else "libopencv_contrib_world.a"
# find the list of targets (basically, ["iPhoneOS", "iPhoneSimulator"])
targetlist = glob.glob(os.path.join(dstroot, "build", "*"))
shutil.copytree(tdir0 + "/install/include/opencv2", dstdir + "/Headers")
# make universal static lib
- wlist = " ".join(["../build/" + t + "/lib/Release/libopencv_world.a" for t in targetlist])
+ wlist = " ".join(["../build/" + t + "/lib/Release/" + libname for t in targetlist])
execute("lipo -create " + wlist + " -o " + dstdir + "/%s" % name)
# copy Info.plist