From 57d63db9c37e32106502c5ae58f1bcf6be095f93 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 22 Nov 2016 02:04:39 +0300 Subject: [PATCH] 3rdparty: libprotobuf v3.1.0 --- modules/dnn/3rdparty/protobuf/CMakeLists.txt | 195 +++++++----------- modules/dnn/CMakeLists.txt | 6 +- modules/dnn/cmake/OpenCVFindLibProtobuf.cmake | 66 +++--- modules/dnn/cmake/download_protobuf.cmake | 51 +++++ 4 files changed, 172 insertions(+), 146 deletions(-) create mode 100644 modules/dnn/cmake/download_protobuf.cmake diff --git a/modules/dnn/3rdparty/protobuf/CMakeLists.txt b/modules/dnn/3rdparty/protobuf/CMakeLists.txt index db6cbd29e..54d549117 100644 --- a/modules/dnn/3rdparty/protobuf/CMakeLists.txt +++ b/modules/dnn/3rdparty/protobuf/CMakeLists.txt @@ -1,106 +1,25 @@ project(libprotobuf) include(CheckIncludeFiles) -include(cmake/CheckCxxHashset.cmake) -include(cmake/CheckCxxHashmap.cmake) -check_include_files("pthread.h" HAVE_PTHREAD) - -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - include(CheckIncludeFileCXX) - set(CMAKE_REQUIRED_FLAGS "-std=c++11") - check_include_file_cxx("unordered_map" HAVE_UNORDERED_MAP) - check_include_file_cxx("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP) - set(CMAKE_REQUIRED_FLAGS ) - - if(HAVE_UNORDERED_MAP) - add_definitions("-std=c++11") # For unordered_map - set(HASH_MAP_H "") - set(HASH_MAP_CLASS "unordered_map") - set(HASH_NAMESPACE "std") - set(HAVE_HASH_MAP 1) - elseif(HAVE_TR1_UNORDERED_MAP) - add_definitions("-std=c++11") # For unordered_map - set(HASH_MAP_H "") - set(HASH_MAP_CLASS "unordered_map") - set(HASH_NAMESPACE "std::tr1") - set(HAVE_HASH_MAP 1) - else() - CHECK_HASHMAP() - if(HAVE_GNU_EXT_HASH_MAP) - set(HASH_MAP_H "") - set(HASH_NAMESPACE "__gnu_cxx") - set(HASH_MAP_CLASS "hash_map") - set(HAVE_HASH_MAP 1) - elseif(HAVE_STD_EXT_HASH_MAP) - set(HASH_MAP_H "") - set(HASH_NAMESPACE "std") - set(HASH_MAP_CLASS "hash_map") - set(HAVE_HASH_MAP 1) - elseif(HAVE_GLOBAL_HASH_MAP) - set(HASH_MAP_H "") - set(HASH_NAMESPACE "") - set(HASH_MAP_CLASS "hash_map") - set(HAVE_HASH_MAP 1) - else() - set(HAVE_HASH_MAP 0) - endif() - endif() - - set(CMAKE_REQUIRED_FLAGS "-std=c++11") - check_include_file_cxx("unordered_set" HAVE_UNORDERED_SET) - check_include_file_cxx("tr1/unordered_set" HAVE_TR1_UNORDERED_SET) - set(CMAKE_REQUIRED_FLAGS ) - - if(HAVE_UNORDERED_SET) - set(HASH_SET_H "") - set(HASH_SET_CLASS "unordered_set") - set(HAVE_HASH_SET 1) - elseif(HAVE_TR1_UNORDERED_SET) - add_definitions("-std=c++11") - set(HASH_SET_H "") - set(HASH_SET_CLASS "unordered_set") - set(HAVE_HASH_SET 1) - else() - CHECK_HASHSET() - if(HAVE_GNU_EXT_HASH_SET) - set(HASH_SET_H "") - set(HASH_NAMESPACE "__gnu_cxx") - set(HASH_SET_CLASS "hash_set") - set(HAVE_HASH_SET 1) - elseif(HAVE_STD_EXT_HASH_SET) - set(HASH_SET_H "") - set(HASH_NAMESPACE "std") - set(HASH_SET_CLASS "hash_set") - set(HAVE_HASH_SET 1) - elseif(HAVE_GLOBAL_HASH_SET) - set(HASH_SET_H "") - set(HASH_NAMESPACE "") - set(HASH_SET_CLASS "hash_set") - set(HAVE_HASH_SET 1) - else() - set(HAVE_HASH_SET 0) - endif() +if(NOT MSVC) + check_include_files("pthread.h" HAVE_PTHREAD) + if(HAVE_PTHREAD) + add_definitions(-DHAVE_PTHREAD=1) endif() endif() -if(WIN32 AND BUILD_SHARED_LIBS AND MSVC) - add_definitions(-DPROTOBUF_USE_DLLS) - add_definitions(-DLIBPROTOBUF_EXPORTS) -endif() - -#add_definitions( -DGOOGLE_PROTOBUF_NO_THREAD_SAFETY ) #we don't need thread safety -add_definitions( -D_GNU_SOURCE=1 ) #it's maybe useful -add_definitions( -DHAVE_CONFIG_H ) #we will use config.h -configure_file("cmake/config.h.in" "config.h") - if(MSVC) add_definitions( -D_CRT_SECURE_NO_WARNINGS=1 ) - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305 /wd4127 /wd4100 /wd4512 /wd4125 /wd4389 /wd4510 /wd4610 /wd4702) - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4456) # VS 2015 + ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 + /wd4305 /wd4127 /wd4100 /wd4512 /wd4125 /wd4389 /wd4510 /wd4610 + /wd4702 /wd4456 /wd4457 /wd4065 /wd4310 /wd4661 /wd4506 + ) else() - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-deprecated -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wunused-parameter -Wunused-local-typedefs -Wsign-compare -Wsign-promo -Wundef) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wtautological-undefined-compare) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-deprecated -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wunused-parameter -Wunused-local-typedefs -Wsign-compare -Wsign-promo -Wundef + -Wtautological-undefined-compare + -Wignored-qualifiers -Wextra -Wunused-function -Wunused-const-variable + ) endif() # Easier to support different versions of protobufs @@ -116,7 +35,7 @@ function(append_if_exist OUTPUT_LIST) set(${OUTPUT_LIST} ${${OUTPUT_LIST}} PARENT_SCOPE) endfunction() -set(PROTOBUF_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) +set(PROTOBUF_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/sources/protobuf-3.1.0) if(MSVC) set(ATOMICOPS_INTERNALS ${PROTOBUF_ROOT}/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc) @@ -124,61 +43,103 @@ else() set(ATOMICOPS_INTERNALS ${PROTOBUF_ROOT}/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc) endif() + append_if_exist(PROTOBUF_SRCS - ${PROTOBUF_ROOT}/src/google/protobuf/compiler/importer.cc - ${PROTOBUF_ROOT}/src/google/protobuf/compiler/parser.cc - ${PROTOBUF_ROOT}/src/google/protobuf/descriptor.cc - ${PROTOBUF_ROOT}/src/google/protobuf/descriptor.pb.cc - ${PROTOBUF_ROOT}/src/google/protobuf/descriptor_database.cc - ${PROTOBUF_ROOT}/src/google/protobuf/dynamic_message.cc +# libprotobuf-lite + ${PROTOBUF_ROOT}/src/google/protobuf/arena.cc + ${PROTOBUF_ROOT}/src/google/protobuf/arenastring.cc ${PROTOBUF_ROOT}/src/google/protobuf/extension_set.cc - ${PROTOBUF_ROOT}/src/google/protobuf/extension_set_heavy.cc - ${PROTOBUF_ROOT}/src/google/protobuf/generated_message_reflection.cc ${PROTOBUF_ROOT}/src/google/protobuf/generated_message_util.cc ${PROTOBUF_ROOT}/src/google/protobuf/io/coded_stream.cc - ${PROTOBUF_ROOT}/src/google/protobuf/io/gzip_stream.cc - ${PROTOBUF_ROOT}/src/google/protobuf/io/printer.cc - ${PROTOBUF_ROOT}/src/google/protobuf/io/tokenizer.cc ${PROTOBUF_ROOT}/src/google/protobuf/io/zero_copy_stream.cc - ${PROTOBUF_ROOT}/src/google/protobuf/io/zero_copy_stream_impl.cc ${PROTOBUF_ROOT}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc - ${PROTOBUF_ROOT}/src/google/protobuf/message.cc ${PROTOBUF_ROOT}/src/google/protobuf/message_lite.cc - ${PROTOBUF_ROOT}/src/google/protobuf/reflection_ops.cc ${PROTOBUF_ROOT}/src/google/protobuf/repeated_field.cc - ${PROTOBUF_ROOT}/src/google/protobuf/service.cc ${ATOMICOPS_INTERNALS} + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/bytestream.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/common.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/int128.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/once.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/status.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/statusor.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/stringpiece.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/stringprintf.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/structurally_valid.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/strutil.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/time.cc + ${PROTOBUF_ROOT}/src/google/protobuf/wire_format_lite.cc +# libprotobuf + ${PROTOBUF_ROOT}/src/google/protobuf/any.cc + ${PROTOBUF_ROOT}/src/google/protobuf/any.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/api.pb.cc +# ${PROTOBUF_ROOT}/src/google/protobuf/compiler/importer.cc +# ${PROTOBUF_ROOT}/src/google/protobuf/compiler/parser.cc + ${PROTOBUF_ROOT}/src/google/protobuf/descriptor.cc + ${PROTOBUF_ROOT}/src/google/protobuf/descriptor.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/descriptor_database.cc + ${PROTOBUF_ROOT}/src/google/protobuf/duration.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/dynamic_message.cc + ${PROTOBUF_ROOT}/src/google/protobuf/empty.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/extension_set_heavy.cc + ${PROTOBUF_ROOT}/src/google/protobuf/field_mask.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/generated_message_reflection.cc + ${PROTOBUF_ROOT}/src/google/protobuf/io/gzip_stream.cc + ${PROTOBUF_ROOT}/src/google/protobuf/io/printer.cc + ${PROTOBUF_ROOT}/src/google/protobuf/io/strtod.cc + ${PROTOBUF_ROOT}/src/google/protobuf/io/tokenizer.cc + ${PROTOBUF_ROOT}/src/google/protobuf/io/zero_copy_stream_impl.cc + ${PROTOBUF_ROOT}/src/google/protobuf/map_field.cc + ${PROTOBUF_ROOT}/src/google/protobuf/message.cc + ${PROTOBUF_ROOT}/src/google/protobuf/reflection_ops.cc + ${PROTOBUF_ROOT}/src/google/protobuf/service.cc + ${PROTOBUF_ROOT}/src/google/protobuf/source_context.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/struct.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/stubs/mathlimits.cc ${PROTOBUF_ROOT}/src/google/protobuf/stubs/substitute.cc ${PROTOBUF_ROOT}/src/google/protobuf/text_format.cc + ${PROTOBUF_ROOT}/src/google/protobuf/timestamp.pb.cc + ${PROTOBUF_ROOT}/src/google/protobuf/type.pb.cc ${PROTOBUF_ROOT}/src/google/protobuf/unknown_field_set.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/field_comparator.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/field_mask_util.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/datapiece.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/default_value_objectwriter.cc +# ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/error_listener.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/field_mask_utility.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/json_escaping.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/json_objectwriter.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/json_stream_parser.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/object_writer.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/proto_writer.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/protostream_objectsource.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/protostream_objectwriter.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/type_info.cc +# ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/type_info_test_helper.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/internal/utility.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/json_util.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/message_differencer.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/time_util.cc + ${PROTOBUF_ROOT}/src/google/protobuf/util/type_resolver_util.cc ${PROTOBUF_ROOT}/src/google/protobuf/wire_format.cc - ${PROTOBUF_ROOT}/src/google/protobuf/wire_format_lite.cc - #${PROTOBUF_ROOT}/src/google/protobuf/stubs/hash.cc + ${PROTOBUF_ROOT}/src/google/protobuf/wrappers.pb.cc ) -if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)) +if(CMAKE_VERSION VERSION_LESS 2.8.9 AND UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") endif() add_library(libprotobuf STATIC ${PROTOBUF_SRCS}) -include_directories(${PROTOBUF_ROOT}/src ${CMAKE_CURRENT_BINARY_DIR}) +include_directories(${PROTOBUF_ROOT}/src) set_target_properties(libprotobuf PROPERTIES + FOLDER "3rdparty" + POSITION_INDEPENDENT_CODE 1 # CMake 2.8.9+ OUTPUT_NAME libprotobuf DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) -if(ENABLE_SOLUTION_FOLDERS) - set_target_properties(libprotobuf PROPERTIES FOLDER "3rdparty") -endif() - if(NOT BUILD_SHARED_LIBS) ocv_install_target(libprotobuf EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev) endif() diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt index 0dd5f379e..c61c97b79 100644 --- a/modules/dnn/CMakeLists.txt +++ b/modules/dnn/CMakeLists.txt @@ -10,8 +10,10 @@ set(the_description "Deep neural network module. It allows to load models from d set(OPENCV_MODULE_IS_PART_OF_WORLD OFF) ocv_add_module(dnn opencv_core opencv_imgproc WRAP python matlab) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-shadow -Wno-parentheses -Wmaybe-uninitialized -Wsign-promo -Wmissing-declarations -Wmissing-prototypes) -ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4701) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-shadow -Wno-parentheses -Wmaybe-uninitialized -Wsign-promo + -Wmissing-declarations -Wmissing-prototypes +) +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4701 /wd4100) # ---------------------------------------------------------------------------- # Resolve libprotobuf dependency diff --git a/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake b/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake index a28dc5768..02d521eb5 100644 --- a/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake +++ b/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake @@ -1,34 +1,46 @@ -OCV_OPTION(BUILD_LIBPROTOBUF_FROM_SOURCES "Force to build libprotobuf from sources (don't try to find it in system)" OFF) +# By default, we use built-in protobuf sources and pre-generated .proto files +# Note: In case of .proto model updates these variables should be used: +# - PROTOBUF_PROTOC_EXECUTABLE (required) +# - PROTOBUF_INCLUDE_DIR +# - PROTOBUF_LIBRARIES or PROTOBUF_LIBRARY / PROTOBUF_LIBRARY_DEBUG for find_package() +OCV_OPTION(BUILD_PROTOBUF "Force to build libprotobuf from sources" ON) +OCV_OPTION(UPDATE_PROTO_FILES "Force to rebuild .proto files" OFF) -if(NOT BUILD_LIBPROTOBUF_FROM_SOURCES) - find_package(Protobuf) -endif() - -if(NOT BUILD_LIBPROTOBUF_FROM_SOURCES AND PROTOBUF_FOUND AND EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) - message(STATUS "The protocol buffer compiler and libprotobuf were found") - PROTOBUF_GENERATE_CPP(PROTOBUF_HDRS PROTOBUF_SRCS src/caffe/caffe.proto) - add_definitions(-DHAVE_PROTOBUF=1) -else() - message(STATUS "Build libprotobuf from sources:") - if(NOT PROTOBUF_FOUND) - message(STATUS " libprotobuf not found into system") +if(UPDATE_PROTO_FILES) + if(NOT DEFINED PROTOBUF_PROTOC_EXECUTABLE) + find_package(Protobuf QUIET) endif() - if(NOT EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) - message(STATUS " The protocol buffer compiler not found") + if(DEFINED PROTOBUF_PROTOC_EXECUTABLE AND EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) + message(STATUS "The protocol buffer compiler is found (${PROTOBUF_PROTOC_EXECUTABLE})") + PROTOBUF_GENERATE_CPP(PROTOBUF_HDRS PROTOBUF_SRCS + src/caffe/caffe.proto + ) + else() + message(FATAL_ERROR "The protocol buffer compiler is not found (PROTOBUF_PROTOC_EXECUTABLE='${PROTOBUF_PROTOC_EXECUTABLE}')") endif() +endif() - #take into account OpenCV two-pass module addition scheme - if(NOT OPENCV_INITIAL_PASS) #TODO: it looks like a hack - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/protobuf) - endif() +if(NOT BUILD_PROTOBUF AND NOT (DEFINED PROTOBUF_INCLUDE_DIR AND DEFINED PROTOBUF_LIBRARIES)) + find_package(Protobuf QUIET) +endif() +if(PROTOBUF_FOUND) + # nothing +else() + include(${CMAKE_CURRENT_LIST_DIR}/download_protobuf.cmake) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/protobuf) set(PROTOBUF_LIBRARIES libprotobuf) - set(PROTOBUF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/protobuf/src ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe) - set(PROTOBUF_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/caffe.pb.cc) - set(PROTOBUF_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/caffe.pb.h) - add_definitions(-DHAVE_PROTOBUF=1) + set(PROTOBUF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/protobuf/sources/protobuf-3.1.0/src) +endif() + +if(NOT UPDATE_PROTO_FILES) + list(APPEND PROTOBUF_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/caffe.pb.cc) + list(APPEND PROTOBUF_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe/caffe.pb.h) + list(APPEND PROTOBUF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/misc/caffe) +endif() + +add_definitions(-DHAVE_PROTOBUF=1) - #supress warnings in autogenerated caffe.pb.* files - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-parameter) - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4125 /wd4267 /wd4127 /wd4244 /wd4512 /wd4702) -endif() \ No newline at end of file +#supress warnings in autogenerated caffe.pb.* files +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-parameter -Wundef) +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4125 /wd4267 /wd4127 /wd4244 /wd4512 /wd4702) diff --git a/modules/dnn/cmake/download_protobuf.cmake b/modules/dnn/cmake/download_protobuf.cmake new file mode 100644 index 000000000..b365a464a --- /dev/null +++ b/modules/dnn/cmake/download_protobuf.cmake @@ -0,0 +1,51 @@ +set(PROTOBUF_CPP_NAME "libprotobuf") +set(PROTOBUF_CPP_DOWNLOAD_HASH "bd5e3eed635a8d32e2b99658633815ef") +set(PROTOBUF_CPP_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/protobuf/sources") # /protobuf-3.1.0 subdirectory + +set(OPENCV_PROTOBUF_CPP_DOWNLOAD_URL ${OPENCV_PROTOBUF_URL};$ENV{OPENCV_PROTOBUF_URL};https://github.com/google/protobuf/releases/download/) + +function(ocv_protobuf_download file ID) + if(DEFINED ${ID}_DOWNLOADED_HASH + AND ${ID}_DOWNLOADED_HASH STREQUAL ${ID}_DOWNLOAD_HASH + AND EXISTS ${${ID}_PATH}) + # Files have been downloaded and checked by the previous CMake run + return() + else() + if(EXISTS ${${ID}_PATH}) + message(STATUS "${${ID}_NAME}: Removing previous unpacked files: ${${ID}_PATH}") + file(REMOVE_RECURSE ${${ID}_PATH}) + endif() + endif() + unset(${ID}_DOWNLOADED_HASH CACHE) + + file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.download) + file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/.download/.gitignore" "*\n") + ocv_download(PACKAGE ${file} + HASH ${${ID}_DOWNLOAD_HASH} + URL ${OPENCV_${ID}_DOWNLOAD_URL} + DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.download) + set(${ID}_ARCHIVE "${DOWNLOAD_PACKAGE_LOCATION}") + + ocv_assert(EXISTS "${${ID}_ARCHIVE}") + ocv_assert(NOT EXISTS "${${ID}_PATH}") + file(MAKE_DIRECTORY ${${ID}_PATH}) + ocv_assert(EXISTS "${${ID}_PATH}") + file(WRITE "${${ID}_PATH}/.gitignore" "*\n") + + message(STATUS "${${ID}_NAME}: Unpacking ${file} to ${${ID}_PATH}...") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xz "${${ID}_ARCHIVE}" + WORKING_DIRECTORY "${${ID}_PATH}" + RESULT_VARIABLE __result) + + if(NOT __result EQUAL 0) + message(FATAL_ERROR "${${ID}_NAME}: Failed to unpack ${ID} archive from ${${ID}_ARCHIVE} to ${${ID}_PATH} with error ${__result}") + endif() + + ocv_assert(EXISTS "${${ID}_PATH}") + + set(${ID}_DOWNLOADED_HASH "${${ID}_DOWNLOAD_HASH}" CACHE INTERNAL "${ID} hash") + + #message(STATUS "${${ID}_NAME}: Successfully downloaded") +endfunction() + +ocv_protobuf_download(v3.1.0/protobuf-cpp-3.1.0.tar.gz PROTOBUF_CPP)