Commit 8d135e8e authored by Andrey Kamaev's avatar Andrey Kamaev

Shortened CMake script for opencv_world. Fixed opencv_world link with non-Visual…

Shortened CMake script for opencv_world. Fixed opencv_world link with non-Visual Studio generators on Windows.
parent 6dde56fa
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# #
# OPENCV_MODULE_${the_module}_LOCATION # OPENCV_MODULE_${the_module}_LOCATION
# OPENCV_MODULE_${the_module}_DESCRIPTION # OPENCV_MODULE_${the_module}_DESCRIPTION
# OPENCV_MODULE_${the_module}_CLASS - PUBLIC|INTERNAL|BINDINGS
# OPENCV_MODULE_${the_module}_HEADERS # OPENCV_MODULE_${the_module}_HEADERS
# OPENCV_MODULE_${the_module}_SOURCES # OPENCV_MODULE_${the_module}_SOURCES
# OPENCV_MODULE_${the_module}_DEPS - final flattened set of module dependencies # OPENCV_MODULE_${the_module}_DEPS - final flattened set of module dependencies
...@@ -18,6 +19,8 @@ ...@@ -18,6 +19,8 @@
# To control the setup of the module you could also set: # To control the setup of the module you could also set:
# the_description - text to be used as current module description # the_description - text to be used as current module description
# OPENCV_MODULE_TYPE - STATIC|SHARED - set to force override global settings for current module # 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}
# The verbose template for OpenCV module: # The verbose template for OpenCV module:
# #
...@@ -38,10 +41,12 @@ ...@@ -38,10 +41,12 @@
# clean flags for modules enabled on previous cmake run # clean flags for modules enabled on previous cmake run
# this is necessary to correctly handle modules removal # this is necessary to correctly handle modules removal
foreach(mod ${OPENCV_MODULES_BUILD}) foreach(mod ${OPENCV_MODULES_BUILD} ${OPENCV_MODULES_DISABLED_USER} ${OPENCV_MODULES_DISABLED_AUTO} ${OPENCV_MODULES_DISABLED_FORCE})
if(HAVE_${mod}) if(HAVE_${mod})
unset(HAVE_${mod} CACHE) unset(HAVE_${mod} CACHE)
endif() endif()
unset(OPENCV_MODULE_${mod}_REQ_DEPS CACHE)
unset(OPENCV_MODULE_${mod}_OPT_DEPS CACHE)
endforeach() endforeach()
# clean modules info which needs to be recalculated # clean modules info which needs to be recalculated
...@@ -84,7 +89,7 @@ endmacro() ...@@ -84,7 +89,7 @@ endmacro()
# Usage: # Usage:
# ocv_add_module(<name> [INTERNAL|BINDINGS] [REQUIRED] [<list of dependencies>] [OPTIONAL <list of optional dependencies>]) # ocv_add_module(<name> [INTERNAL|BINDINGS] [REQUIRED] [<list of dependencies>] [OPTIONAL <list of optional dependencies>])
# Example: # Example:
# ocv_add_module(yaom INTERNAL opencv_core opencv_highgui NOLINK opencv_flann OPTIONAL opencv_gpu) # ocv_add_module(yaom INTERNAL opencv_core opencv_highgui opencv_flann OPTIONAL opencv_gpu)
macro(ocv_add_module _name) macro(ocv_add_module _name)
string(TOLOWER "${_name}" name) string(TOLOWER "${_name}" name)
string(REGEX REPLACE "^opencv_" "" ${name} "${name}") string(REGEX REPLACE "^opencv_" "" ${name} "${name}")
...@@ -106,29 +111,31 @@ macro(ocv_add_module _name) ...@@ -106,29 +111,31 @@ macro(ocv_add_module _name)
endif() endif()
set(OPENCV_MODULE_${the_module}_DESCRIPTION "${the_description}" CACHE INTERNAL "Brief description of ${the_module} module") 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") set(OPENCV_MODULE_${the_module}_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "Location of ${the_module} module sources")
unset(OPENCV_MODULE_${the_module}_REQ_DEPS CACHE)
unset(OPENCV_MODULE_${the_module}_OPT_DEPS CACHE)
#create option to enable/disable this module #create option to enable/disable this module
if(the_module STREQUAL "opencv_world") if(NOT DEFINED BUILD_${the_module}_INIT)
set(build_the_module OFF) set(BUILD_${the_module}_INIT ON)
else()
set(build_the_module ON)
endif() endif()
option(BUILD_${the_module} "Include ${the_module} module into the OpenCV build" ${build_the_module}) option(BUILD_${the_module} "Include ${the_module} module into the OpenCV build" ${BUILD_${the_module}_INIT})
unset(build_the_module)
if("${ARGV1}" STREQUAL "INTERNAL" OR "${ARGV1}" STREQUAL "BINDINGS") if("${ARGV1}" STREQUAL "INTERNAL" OR "${ARGV1}" STREQUAL "BINDINGS")
set(OPENCV_MODULE_${the_module}_CLASS "${ARGV1}" CACHE INTERNAL "The cathegory of the module")
set(__ocv_argn__ ${ARGN}) set(__ocv_argn__ ${ARGN})
list(REMOVE_AT __ocv_argn__ 0) list(REMOVE_AT __ocv_argn__ 0)
ocv_add_dependencies(${the_module} ${__ocv_argn__}) ocv_add_dependencies(${the_module} ${__ocv_argn__})
unset(__ocv_argn__) unset(__ocv_argn__)
else() else()
set(OPENCV_MODULE_${the_module}_CLASS "PUBLIC" CACHE INTERNAL "The cathegory of the module")
ocv_add_dependencies(${the_module} ${ARGN}) ocv_add_dependencies(${the_module} ${ARGN})
if(BUILD_${the_module}) if(BUILD_${the_module})
set(OPENCV_MODULES_PUBLIC ${OPENCV_MODULES_PUBLIC} "${the_module}" CACHE INTERNAL "List of OpenCV modules marked for export") set(OPENCV_MODULES_PUBLIC ${OPENCV_MODULES_PUBLIC} "${the_module}" CACHE INTERNAL "List of OpenCV modules marked for export")
endif() endif()
endif() endif()
# 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()
if(BUILD_${the_module}) if(BUILD_${the_module})
set(OPENCV_MODULES_BUILD ${OPENCV_MODULES_BUILD} "${the_module}" CACHE INTERNAL "List of OpenCV modules included into the build") set(OPENCV_MODULES_BUILD ${OPENCV_MODULES_BUILD} "${the_module}" CACHE INTERNAL "List of OpenCV modules included into the build")
...@@ -435,10 +442,13 @@ endmacro() ...@@ -435,10 +442,13 @@ endmacro()
# creates OpenCV module in current folder # creates OpenCV module in current folder
# creates new target, configures standard dependencies, compilers flags, install rules # creates new target, configures standard dependencies, compilers flags, install rules
# Usage: # Usage:
# ocv_create_module(<extra link dependencies>) # ocv_create_module(<extra link dependencies>)
# ocv_create_module(SKIP_LINK)
macro(ocv_create_module) macro(ocv_create_module)
add_library(${the_module} ${OPENCV_MODULE_TYPE} ${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES}) add_library(${the_module} ${OPENCV_MODULE_TYPE} ${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES})
target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_MODULE_${the_module}_DEPS_EXT} ${OPENCV_LINKER_LIBS} ${IPP_LIBS} ${ARGN}) if(NOT "${ARGN}" STREQUAL "SKIP_LINK")
target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_MODULE_${the_module}_DEPS_EXT} ${OPENCV_LINKER_LIBS} ${IPP_LIBS} ${ARGN})
endif()
add_dependencies(opencv_modules ${the_module}) add_dependencies(opencv_modules ${the_module})
if(ENABLE_SOLUTION_FOLDERS) if(ENABLE_SOLUTION_FOLDERS)
......
...@@ -301,7 +301,3 @@ endif() ...@@ -301,7 +301,3 @@ endif()
ocv_add_accuracy_tests() ocv_add_accuracy_tests()
ocv_add_perf_tests() ocv_add_perf_tests()
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} PARENT_SCOPE)
set(GRFMT_LIBS ${GRFMT_LIBS} PARENT_SCOPE)
set(the_description "The ts module")
if(IOS) if(IOS)
ocv_module_disable(ts) ocv_module_disable(ts)
endif() endif()
...@@ -5,8 +7,9 @@ endif() ...@@ -5,8 +7,9 @@ endif()
if(MINGW) if(MINGW)
set(OPENCV_MODULE_TYPE STATIC) set(OPENCV_MODULE_TYPE STATIC)
endif() endif()
set(the_description "The ts module") set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
ocv_add_module(ts opencv_core) ocv_add_module(ts opencv_core)
ocv_glob_module_sources() ocv_glob_module_sources()
ocv_module_include_directories() ocv_module_include_directories()
......
project(opencv_world)
string(REPLACE "/INCREMENTAL:NO" "/INCREMENTAL:YES" CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
string(REPLACE "/INCREMENTAL:NO" "/INCREMENTAL:YES" CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE}")
string(REPLACE "/INCREMENTAL:NO" "/INCREMENTAL:YES" CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
set(the_description "All the selected OpenCV modules in a single binary") set(the_description "All the selected OpenCV modules in a single binary")
set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
set(BUILD_opencv_world_INIT OFF)
set(module_list ) ocv_add_module(world opencv_core)
ocv_add_module(world opencv_core OPTIONAL opencv_flann opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_photo opencv_objdetect opencv_legacy opencv_nonfree)
set(the_module opencv_world)
ocv_glob_module_sources()
ocv_module_include_directories()
add_library(${the_module} ${OPENCV_MODULE_TYPE} ${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES})
if(ENABLE_SOLUTION_FOLDERS)
set_target_properties(${the_module} PROPERTIES FOLDER "modules")
endif()
set_target_properties(${the_module} PROPERTIES
OUTPUT_NAME "${the_module}${OPENCV_DLLVERSION}"
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
INSTALL_NAME_DIR lib
)
# 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
VERSION ${OPENCV_VERSION}
SOVERSION ${OPENCV_SOVERSION}
)
endif()
if(BUILD_SHARED_LIBS)
if(MSVC)
set_target_properties(${the_module} PROPERTIES DEFINE_SYMBOL CVAPI_EXPORTS)
else()
add_definitions(-DCVAPI_EXPORTS)
endif()
endif()
if(MSVC) if(MSVC)
if(CMAKE_CROSSCOMPILING) foreach(_var CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_MODULE_LINKER_FLAGS_RELEASE CMAKE_SHARED_LINKER_FLAGS_RELEASE
set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:secchk") CMAKE_EXE_LINKER_FLAGS_DEBUG CMAKE_MODULE_LINKER_FLAGS_DEBUG CMAKE_SHARED_LINKER_FLAGS_DEBUG)
endif() string(REPLACE "/INCREMENTAL:NO" "/INCREMENTAL:YES" ${_var} "${${_var}}")
set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libc /DEBUG") endforeach()
endif() endif()
set(objpath0 "${OpenCV_BINARY_DIR}/modules/<MODULE_NAME>") ocv_glob_module_sources()
ocv_module_include_directories()
ocv_create_module(SKIP_LINK)
#TODO: try to use try_compile to find real object file extension/location
if(CMAKE_GENERATOR MATCHES "^Visual.*$") if(CMAKE_GENERATOR MATCHES "^Visual.*$")
set(have_cfg 1) set(have_cfg 1)
set(objpath0 "${objpath0}/opencv_<MODULE_NAME>.dir/<CONFIGURATION>/<SRC_NAME_WE>.obj") set(objpath0 "<MODULE_NAME>.dir/<CONFIGURATION>/<SRC_NAME_WE>.obj")
elseif (CMAKE_GENERATOR MATCHES Xcode) elseif (CMAKE_GENERATOR MATCHES Xcode)
set(have_cfg 1) set(have_cfg 1)
set(objpath0 "${objpath0}/OpenCV.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/opencv_<MODULE_NAME>.build/Objects-normal/$(CURRENT_ARCH)/<SRC_NAME_WE>.o") set(objpath0 "OpenCV.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/<MODULE_NAME>.build/Objects-normal/$(CURRENT_ARCH)/<SRC_NAME_WE>.o")
else() else()
set(have_cfg 0) set(have_cfg 0)
set(objpath0 "${objpath0}/CMakeFiles/opencv_<MODULE_NAME>.dir/src/<SRC_NAME>.o") set(objpath0 "CMakeFiles/<MODULE_NAME>.dir/<RELATIVE_SRC_NAME>.o")
if(MINGW OR MSVC)
set(objpath0 "${objpath0}bj")
endif()
endif() endif()
set(objlist) set(objlist "")
foreach(m ${OPENCV_MODULE_${the_module}_DEPS})
foreach(m ${OPENCV_MODULES_BUILD}) # build order dependencies
if(m STREQUAL ${the_module}) add_dependencies(${the_module} ${m})
elseif(m STREQUAL "opencv_python") # link dependencies
elseif(m STREQUAL "opencv_ts") string(REGEX REPLACE "(general|debug|optimized);opencv_[^;]*(;|$)" "" _link_deps "${${m}_LIB_DEPENDS}")
if(_link_deps)
target_link_libraries(${the_module} ${_link_deps})
endif()
string(REGEX REPLACE "<MODULE_NAME>" "${m}" objpath1 "${${m}_BINARY_DIR}/${objpath0}")
foreach(src ${OPENCV_MODULE_${m}_SOURCES})
if(IS_ABSOLUTE "${src}")
file(RELATIVE_PATH srcname "${OPENCV_MODULE_${m}_LOCATION}" "${src}")
else() else()
add_dependencies(${the_module} ${m}) set(srcname "${src}")
string(REGEX REPLACE "^opencv_" "" bare_m "${m}") endif()
string(REGEX REPLACE "<MODULE_NAME>" "${bare_m}" objpath1 "${objpath0}") string(REPLACE ".." "__" srcname "${srcname}")
if(m STREQUAL "opencv_highgui") if(srcname MATCHES "\\.(cpp|mm|c|cxx|cc)$")
target_link_libraries(${the_module} ${HIGHGUI_LIBRARIES} ${GRFMT_LIBS}) get_filename_component(srcname_we ${srcname} NAME_WE)
endif() string(REGEX REPLACE <SRC_NAME_WE> "${srcname_we}" objpath2 "${objpath1}")
foreach(d ${OPENCV_MODULE_${m}_DEPS_EXT}) string(REGEX REPLACE <RELATIVE_SRC_NAME> "${srcname}" objpath3 "${objpath2}")
target_link_libraries(${the_module} ${d}) file(RELATIVE_PATH objpath4 "${CMAKE_CURRENT_BINARY_DIR}" "${objpath3}")
endforeach() list(APPEND objlist "\"${objpath4}\"")
set(modobjlist)
foreach(src ${OPENCV_MODULE_${m}_SOURCES})
get_filename_component(srcname ${src} NAME)
if(srcname MATCHES ".*\\.[cm].*")
get_filename_component(srcname_we ${srcname} NAME_WE)
string(REGEX REPLACE <SRC_NAME_WE> "${srcname_we}" objpath2 "${objpath1}")
string(REGEX REPLACE <SRC_NAME> "${srcname}" objpath3 "${objpath2}")
set(modobjlist "${modobjlist} \"${objpath3}\"")
endif()
endforeach()
set(objlist "${objlist} ${modobjlist}")
endif() endif()
endforeach()
endforeach() endforeach()
string(REPLACE ";" " " objlist "${objlist}")
if(have_cfg) if(have_cfg)
string(REGEX REPLACE "<CONFIGURATION>" "Debug" objlist_dbg "${objlist}") string(REGEX REPLACE "<CONFIGURATION>" "Debug" objlist_dbg "${objlist}")
string(REGEX REPLACE "<CONFIGURATION>" "Release" objlist_rls "${objlist}") string(REGEX REPLACE "<CONFIGURATION>" "Release" objlist_rls "${objlist}")
set_target_properties(${the_module} PROPERTIES set_target_properties(${the_module} PROPERTIES
LINK_FLAGS_DEBUG ${objlist_dbg} LINK_FLAGS_DEBUG ${objlist_dbg}
LINK_FLAGS_RELEASE ${objlist_rls}) LINK_FLAGS_RELEASE ${objlist_rls})
else() else()
set_target_properties(${the_module} PROPERTIES file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/world_objects.list" "${objlist}")
LINK_FLAGS ${objlist}) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/world_objects.list" "${CMAKE_CURRENT_BINARY_DIR}/world_objects.rsp" OUTPUT_QUIET)
endif() set_target_properties(${the_module} PROPERTIES
LINK_FLAGS @world_objects.rsp)
install(TARGETS ${the_module}
RUNTIME DESTINATION bin COMPONENT main
LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main
ARCHIVE DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main
)
# 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(hdr2 MATCHES "^(opencv2/.*)/[^/]+.h(..)?$")
install(FILES ${hdr} DESTINATION "${OPENCV_INCLUDE_PREFIX}/${CMAKE_MATCH_1}" COMPONENT main)
endif()
endforeach()
endif() endif()
ocv_add_precompiled_headers(${the_module}) ocv_add_precompiled_headers(${the_module})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment