# If protobuf is found - libprotobuf target is available
set ( HAVE_PROTOBUF FALSE )
if ( NOT WITH_PROTOBUF )
return ( )
endif ( )
ocv_option ( BUILD_PROTOBUF "Force to build libprotobuf runtime from sources" ON )
ocv_option ( PROTOBUF_UPDATE_FILES "Force rebuilding .proto files (protoc should be available)" OFF )
# BUILD_PROTOBUF=OFF: Custom manual protobuf configuration (see find_package(Protobuf) for details):
# - Protobuf_INCLUDE_DIR
# - Protobuf_LIBRARY
# - Protobuf_PROTOC_EXECUTABLE
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 )
ocv_assert ( NOT PROTOBUF_UPDATE_FILES )
add_subdirectory ( "${OpenCV_SOURCE_DIR}/3rdparty/protobuf" )
set ( Protobuf_LIBRARIES "libprotobuf" )
set ( HAVE_PROTOBUF TRUE )
else ( )
# we still need this for command PROTOBUF_GENERATE_CPP.
set ( protobuf_MODULE_COMPATIBLE ON )
unset ( Protobuf_VERSION CACHE )
find_package ( Protobuf QUIET CONFIG )
if ( NOT Protobuf_FOUND )
find_package ( Protobuf QUIET )
endif ( )
# Backwards compatibility
# Define camel case versions of input variables
foreach ( UPPER
P R O T O B U F _ F O U N D
P R O T O B U F _ L I B R A R Y
P R O T O B U F _ I N C L U D E _ D I R
P R O T O B U F _ V E R S I O N
)
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 )
set ( Protobuf_LIBRARIES "protobuf::libprotobuf" )
else ( )
add_library ( libprotobuf UNKNOWN IMPORTED )
set_target_properties ( libprotobuf PROPERTIES
I M P O R T E D _ L O C A T I O N " $ { P r o t o b u f _ L I B R A R Y } "
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S " $ { P r o t o b u f _ I N C L U D E _ D I R } "
I N T E R F A C E _ S Y S T E M _ I N C L U D E _ D I R E C T O R I E S " $ { P r o t o b u f _ I N C L U D E _ D I R } "
)
get_protobuf_version ( Protobuf_VERSION "${Protobuf_INCLUDE_DIR}" )
set ( Protobuf_LIBRARIES "libprotobuf" )
endif ( )
set ( HAVE_PROTOBUF TRUE )
endif ( )
endif ( )
# See https://github.com/opencv/opencv/issues/24369
# In Protocol Buffers v22.0 and later drops C++11 support and depends abseil-cpp.
# Details: https://protobuf.dev/news/2022-08-03/
# And if std::text_view is in abseil-cpp requests C++17 and later.
if ( HAVE_PROTOBUF )
if ( NOT ( Protobuf_VERSION VERSION_LESS 22 ) )
if ( ( CMAKE_CXX_STANDARD EQUAL 98 ) OR ( CMAKE_CXX_STANDARD LESS 17 ) )
message ( STATUS "CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} is too old to support protobuf(${Protobuf_VERSION}) and/or abseil-cpp. Use C++17 or later. Turning HAVE_PROTOBUF off" )
set ( HAVE_PROTOBUF FALSE )
endif ( )
endif ( )
endif ( )
if ( HAVE_PROTOBUF AND PROTOBUF_UPDATE_FILES AND NOT COMMAND PROTOBUF_GENERATE_CPP )
message ( FATAL_ERROR "Can't configure protobuf dependency (BUILD_PROTOBUF=${BUILD_PROTOBUF} PROTOBUF_UPDATE_FILES=${PROTOBUF_UPDATE_FILES})" )
endif ( )
if ( HAVE_PROTOBUF )
list ( APPEND CUSTOM_STATUS protobuf )
if ( NOT BUILD_PROTOBUF )
unset ( __location )
if ( TARGET "${Protobuf_LIBRARIES}" )
get_target_property ( __location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION_RELEASE )
if ( NOT __location )
get_target_property ( __location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION )
endif ( )
endif ( )
if ( NOT __location )
if ( Protobuf_LIBRARY )
set ( __location "${Protobuf_LIBRARY}" )
else ( )
set ( __location "${Protobuf_LIBRARIES}" )
endif ( )
endif ( )
endif ( )
list ( APPEND CUSTOM_STATUS_protobuf " Protobuf:"
B U I L D _ P R O T O B U F T H E N " build ( ${ Protobuf_VERSION } ) "
E L S E " $ { _ _ l o c a t i o n } ( $ { P r o t o b u f _ V E R S I O N } ) " )
endif ( )