diff --git a/3rdparty/protobuf/CMakeLists.txt b/3rdparty/protobuf/CMakeLists.txt index dee7c0c403..a10e20bfd8 100644 --- a/3rdparty/protobuf/CMakeLists.txt +++ b/3rdparty/protobuf/CMakeLists.txt @@ -1,5 +1,4 @@ project(libprotobuf) - include(CheckIncludeFiles) if(HAVE_PTHREAD) @@ -136,8 +135,7 @@ append_if_exist(Protobuf_SRCS ) add_library(libprotobuf STATIC ${Protobuf_SRCS}) -ocv_include_directories(${PROTOBUF_ROOT}/src) - +target_include_directories(libprotobuf SYSTEM PUBLIC $) set_target_properties(libprotobuf PROPERTIES FOLDER "3rdparty" @@ -146,6 +144,9 @@ set_target_properties(libprotobuf ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) +get_protobuf_version(Protobuf_VERSION "${PROTOBUF_ROOT}/src") +set(Protobuf_VERSION ${Protobuf_VERSION} CACHE INTERNAL "" FORCE) + if(NOT BUILD_SHARED_LIBS) ocv_install_target(libprotobuf EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev) endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 77378a1b29..66f03de886 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,8 @@ ocv_clear_vars(OpenCVModules_TARGETS) include(cmake/OpenCVDownload.cmake) +set(BUILD_LIST "" CACHE STRING "Build only listed modules (comma-separated, e.g. 'videoio,dnn,ts')") + # ---------------------------------------------------------------------------- # Break in case of popular CMake configuration mistakes # ---------------------------------------------------------------------------- @@ -625,6 +627,7 @@ include(cmake/OpenCVFindLibsGUI.cmake) include(cmake/OpenCVFindLibsVideo.cmake) include(cmake/OpenCVFindLibsPerf.cmake) include(cmake/OpenCVFindLAPACK.cmake) +include(cmake/OpenCVFindProtobuf.cmake) # ---------------------------------------------------------------------------- # Detect other 3rd-party libraries/tools @@ -1359,6 +1362,10 @@ endif() status(" Custom HAL:" OpenCV_USED_HAL THEN "YES (${OpenCV_USED_HAL})" ELSE "NO") +foreach(s ${CUSTOM_STATUS}) + status(${CUSTOM_STATUS_${s}}) +endforeach() + if(WITH_CUDA OR HAVE_CUDA) ocv_build_features_string(cuda_features IF HAVE_CUFFT THEN "CUFFT" diff --git a/cmake/OpenCVFindLibProtobuf.cmake b/cmake/OpenCVFindLibProtobuf.cmake deleted file mode 100644 index f659490106..0000000000 --- a/cmake/OpenCVFindLibProtobuf.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# By default, we use protobuf sources from 3rdparty subdirectory and pre-generated .proto files -# Note: In case of .proto model updates these variables should be used: -# - PROTOBUF_PROTOC_EXECUTABLE (required) -# - Protobuf_INCLUDE_DIRS -# - Protobuf_LIBRARIES or Protobuf_LIBRARY / Protobuf_LIBRARY_DEBUG for find_package() -OCV_OPTION(BUILD_PROTOBUF "Force to build libprotobuf from sources" ON) -OCV_OPTION(PROTOBUF_UPDATE_FILES "Force to rebuild .proto files" OFF) - -if(PROTOBUF_UPDATE_FILES) - if(NOT COMMAND PROTOBUF_GENERATE_CPP) - find_package(Protobuf QUIET) - endif() - if(DEFINED PROTOBUF_PROTOC_EXECUTABLE AND EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) - message(STATUS "The protocol buffer compiler is found (${PROTOBUF_PROTOC_EXECUTABLE})") - else() - message(FATAL_ERROR "The protocol buffer compiler is not found (PROTOBUF_PROTOC_EXECUTABLE='${PROTOBUF_PROTOC_EXECUTABLE}')") - endif() -endif() - -if(NOT BUILD_PROTOBUF AND NOT (DEFINED Protobuf_INCLUDE_DIRS AND DEFINED Protobuf_LIBRARIES)) - find_package(Protobuf QUIET) -endif() - -if(Protobuf_FOUND AND NOT BUILD_PROTOBUF) - # nothing -else() - set(Protobuf_LIBRARIES libprotobuf) - set(Protobuf_INCLUDE_DIRS "${OpenCV_SOURCE_DIR}/3rdparty/protobuf/src") - if(NOT TARGET ${Protobuf_LIBRARIES}) - add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/protobuf" "${OpenCV_BINARY_DIR}/3rdparty/protobuf") - endif() - set(Protobuf_FOUND 1) -endif() diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake new file mode 100644 index 0000000000..5114affa1a --- /dev/null +++ b/cmake/OpenCVFindProtobuf.cmake @@ -0,0 +1,74 @@ +# If protobuf is found - libprotobuf target is available + +ocv_option(WITH_PROTOBUF "Enable libprotobuf" ON) +ocv_option(BUILD_PROTOBUF "Force to build libprotobuf from sources" ON) +ocv_option(PROTOBUF_UPDATE_FILES "Force rebuilding .proto files (protoc should be available)" OFF) + +set(HAVE_PROTOBUF FALSE) + +if(NOT WITH_PROTOBUF) + return() +endif() + +function(get_protobuf_version version include) + file(STRINGS "${include}/google/protobuf/stubs/common.h" ver REGEX "#define GOOGLE_PROTOBUF_VERSION [0-9]+") + string(REGEX MATCHALL "[0-9]+" ver ${ver}) + math(EXPR major "${ver} / 1000000") + math(EXPR minor "${ver} / 1000 % 1000") + math(EXPR patch "${ver} % 1000") + set(${version} "${major}.${minor}.${patch}" PARENT_SCOPE) +endfunction() + +if(BUILD_PROTOBUF) + add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/protobuf") + set(HAVE_PROTOBUF TRUE) +else() + unset(Protobuf_VERSION CACHE) + find_package(Protobuf QUIET) + + # Backwards compatibility + # Define camel case versions of input variables + foreach(UPPER + PROTOBUF_FOUND + PROTOBUF_LIBRARY + PROTOBUF_INCLUDE_DIR + PROTOBUF_VERSION + ) + if (DEFINED ${UPPER}) + string(REPLACE "PROTOBUF_" "Protobuf_" Camel ${UPPER}) + if (NOT DEFINED ${Camel}) + set(${Camel} ${${UPPER}}) + endif() + endif() + endforeach() + # end of compatibility block + + if(Protobuf_FOUND) + if(TARGET protobuf::libprotobuf) + add_library(libprotobuf INTERFACE) + target_link_libraries(libprotobuf INTERFACE protobuf::libprotobuf) + else() + add_library(libprotobuf UNKNOWN IMPORTED) + set_target_properties(libprotobuf PROPERTIES + IMPORTED_LOCATION "${Protobuf_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}" + ) + get_protobuf_version(Protobuf_VERSION "${Protobuf_INCLUDE_DIR}") + endif() + set(HAVE_PROTOBUF TRUE) + endif() +endif() + +if(HAVE_PROTOBUF AND PROTOBUF_UPDATE_FILES AND NOT COMMAND PROTOBUF_GENERATE_CPP) + find_package(Protobuf QUIET) + if(NOT COMMAND PROTOBUF_GENERATE_CPP) + message(FATAL_ERROR "PROTOBUF_GENERATE_CPP command is not available") + endif() +endif() + +if(HAVE_PROTOBUF) + list(APPEND CUSTOM_STATUS protobuf) + list(APPEND CUSTOM_STATUS_protobuf " Protobuf:" + BUILD_PROTOBUF THEN "build (${Protobuf_VERSION})" + ELSE "${Protobuf_LIBRARY} (${Protobuf_VERSION})") +endif() diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index a73ccbd6bc..6eeba3029d 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -653,7 +653,14 @@ macro(ocv_module_include_directories) "${OPENCV_MODULE_${the_module}_LOCATION}/src" "${CMAKE_CURRENT_BINARY_DIR}" # for precompiled headers ) - ocv_target_include_modules(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${ARGN}) + foreach(arg ${ARGN}) + if(IS_ABSOLUTE "${arg}") + list(APPEND incs "${arg}") + else() + list(APPEND incs "${OPENCV_MODULE_${the_module}_LOCATION}/${arg}") + endif() + endforeach() + ocv_target_include_modules(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${incs}) endmacro() diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt index 985a63ba31..00e0adfc91 100644 --- a/modules/dnn/CMakeLists.txt +++ b/modules/dnn/CMakeLists.txt @@ -2,12 +2,7 @@ if(WINRT) ocv_module_disable(dnn) endif() -if(DEFINED BUILD_opencv_dnn AND NOT BUILD_opencv_dnn) - return() -endif() - -include(${OpenCV_SOURCE_DIR}/cmake/OpenCVFindLibProtobuf.cmake) -if(NOT Protobuf_FOUND) +if(NOT HAVE_PROTOBUF) ocv_module_disable(opencv_dnn) endif() @@ -21,8 +16,6 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-shadow -Wno-parentheses -Wmaybe-uninit ) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4701 /wd4100) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/ocl4dnn/include ${OPENCL_INCLUDE_DIRS}) - if(MSVC) add_definitions( -D_CRT_SECURE_NO_WARNINGS=1 ) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 @@ -45,8 +38,9 @@ if(ANDROID) add_definitions(-DDISABLE_POSIX_MEMALIGN -DTH_DISABLE_HEAP_TRACKING) endif() -#supress warnings in autogenerated caffe.pb.* files add_definitions(-DHAVE_PROTOBUF=1) + +#supress warnings in autogenerated caffe.pb.* files ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-parameter -Wundef -Wignored-qualifiers -Wno-enum-compare -Wdeprecated-declarations @@ -59,26 +53,18 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS ) if(PROTOBUF_UPDATE_FILES) - file(GLOB proto_files ${CMAKE_CURRENT_SOURCE_DIR}/src/tensorflow/*.proto) - list(APPEND proto_files ${CMAKE_CURRENT_SOURCE_DIR}/src/caffe/opencv-caffe.proto) + file(GLOB proto_files "${CMAKE_CURRENT_SOURCE_DIR}/src/tensorflow/*.proto" "${CMAKE_CURRENT_SOURCE_DIR}/src/caffe/opencv-caffe.proto") set(PROTOBUF_GENERATE_CPP_APPEND_PATH ON) # required for tensorflow - PROTOBUF_GENERATE_CPP(Protobuf_HDRS Protobuf_SRCS ${proto_files}) + protobuf_generate_cpp(fw_srcs fw_hdrs ${proto_files}) else() - file(GLOB fw_srcs ${CMAKE_CURRENT_SOURCE_DIR}/misc/tensorflow/*.cc) - file(GLOB fw_hdrs ${CMAKE_CURRENT_SOURCE_DIR}/misc/tensorflow/*.h) - list(APPEND fw_srcs ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/opencv-caffe.pb.cc) - list(APPEND fw_hdrs ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/opencv-caffe.pb.h) - list(APPEND Protobuf_SRCS ${fw_srcs}) - list(APPEND Protobuf_HDRS ${fw_hdrs}) - list(APPEND Protobuf_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe) - list(APPEND Protobuf_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/misc/tensorflow) + file(GLOB fw_srcs "${CMAKE_CURRENT_SOURCE_DIR}/misc/tensorflow/*.cc" "${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/opencv-caffe.pb.cc") + file(GLOB fw_hdrs "${CMAKE_CURRENT_SOURCE_DIR}/misc/tensorflow/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/opencv-caffe.pb.h") + set(fw_inc "misc/caffe" "misc/tensorflow") endif() -ocv_source_group("Src\\protobuf" FILES ${Protobuf_SRCS} ${Protobuf_HDRS}) -ocv_module_include_directories(include ${Protobuf_INCLUDE_DIRS}) - -ocv_glob_module_sources(${Protobuf_SRCS} ${Protobuf_HDRS} ${CBLAS_H_PROXY_PATH}) -ocv_create_module(${Protobuf_LIBRARIES} ${LAPACK_LIBRARIES}) +ocv_module_include_directories(${fw_inc} src/ocl4dnn/include ${OPENCL_INCLUDE_DIRS}) +ocv_glob_module_sources(SOURCES ${fw_srcs}) +ocv_create_module(libprotobuf ${LAPACK_LIBRARIES}) ocv_add_samples() ocv_add_accuracy_tests() ocv_add_perf_tests() diff --git a/modules/dnn/src/caffe/caffe_shrinker.cpp b/modules/dnn/src/caffe/caffe_shrinker.cpp index 98df108c0e..9dc6f9f862 100644 --- a/modules/dnn/src/caffe/caffe_shrinker.cpp +++ b/modules/dnn/src/caffe/caffe_shrinker.cpp @@ -54,7 +54,11 @@ void shrinkCaffeModel(const String& src, const String& dst, const std::vectorset_raw_data_type(caffe::FLOAT16); } } +#if GOOGLE_PROTOBUF_VERSION < 3005000 + size_t msgSize = saturate_cast(net.ByteSize()); +#else size_t msgSize = net.ByteSizeLong(); +#endif std::vector output(msgSize); net.SerializeWithCachedSizesToArray(&output[0]); diff --git a/modules/world/CMakeLists.txt b/modules/world/CMakeLists.txt index 943a27ea19..269beb7bc3 100644 --- a/modules/world/CMakeLists.txt +++ b/modules/world/CMakeLists.txt @@ -38,20 +38,20 @@ endif() ocv_add_module(world opencv_core) -set(headers_list "HEADERS") -set(sources_list "SOURCES") +set(headers_list) +set(sources_list) set(link_deps "") foreach(m ${OPENCV_MODULE_${the_module}_DEPS} opencv_world) if(OPENCV_MODULE_${m}_IS_PART_OF_WORLD) - set(headers_list "${headers_list};${OPENCV_MODULE_${m}_HEADERS}") - set(sources_list "${sources_list};${OPENCV_MODULE_${m}_SOURCES}") + list(APPEND headers_list ${OPENCV_MODULE_${m}_HEADERS}) + list(APPEND sources_list ${OPENCV_MODULE_${m}_SOURCES}) endif() if(NOT " ${OPENCV_MODULE_${m}_LINK_DEPS}" STREQUAL " ") list(APPEND link_deps ${OPENCV_MODULE_${m}_LINK_DEPS}) endif() endforeach() -ocv_glob_module_sources(${headers_list} ${sources_list}) +ocv_glob_module_sources(HEADERS ${headers_list} SOURCES ${sources_list}) ocv_module_include_directories()