|
|
@ -7,120 +7,75 @@ |
|
|
|
# gRPC::grpc++ - gRPC C++ library |
|
|
|
# gRPC::grpc++_reflection - gRPC C++ reflection library |
|
|
|
# gRPC::grpc_cpp_plugin - C++ generator plugin for Protocol Buffers |
|
|
|
# |
|
|
|
|
|
|
|
# |
|
|
|
# Generates C++ sources from the .proto files |
|
|
|
# |
|
|
|
# grpc_generate_cpp (<SRCS> <HDRS> <DEST> [<ARGN>...]) |
|
|
|
# |
|
|
|
# SRCS - variable to define with autogenerated source files |
|
|
|
# HDRS - variable to define with autogenerated header files |
|
|
|
# grpc_generate_cpp (<SLIB> <HDRS> <DEST> [<ARGN>...]) |
|
|
|
# PLIB - Proto Static Library generated by .proto file |
|
|
|
# HDRS - variable to define with autogenerated source files and header files |
|
|
|
# DEST - directory where the source files will be created |
|
|
|
# ARGN - .proto files |
|
|
|
# |
|
|
|
function(GRPC_GENERATE_CPP SRCS HDRS DEST) |
|
|
|
if(NOT ARGN) |
|
|
|
message(SEND_ERROR "Error: GRPC_GENERATE_CPP() called without any proto files") |
|
|
|
return() |
|
|
|
endif() |
|
|
|
|
|
|
|
if(GRPC_GENERATE_CPP_APPEND_PATH) |
|
|
|
# Create an include path for each file specified |
|
|
|
foreach(FIL ${ARGN}) |
|
|
|
get_filename_component(ABS_FIL ${FIL} ABSOLUTE) |
|
|
|
get_filename_component(ABS_PATH ${ABS_FIL} PATH) |
|
|
|
list(FIND _protobuf_include_path ${ABS_PATH} _contains_already) |
|
|
|
if(${_contains_already} EQUAL -1) |
|
|
|
list(APPEND _protobuf_include_path -I ${ABS_PATH}) |
|
|
|
endif() |
|
|
|
endforeach() |
|
|
|
else() |
|
|
|
set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR}) |
|
|
|
endif() |
|
|
|
|
|
|
|
if(DEFINED PROTOBUF_IMPORT_DIRS) |
|
|
|
foreach(DIR ${PROTOBUF_IMPORT_DIRS}) |
|
|
|
get_filename_component(ABS_PATH ${DIR} ABSOLUTE) |
|
|
|
list(FIND _protobuf_include_path ${ABS_PATH} _contains_already) |
|
|
|
if(${_contains_already} EQUAL -1) |
|
|
|
list(APPEND _protobuf_include_path -I ${ABS_PATH}) |
|
|
|
endif() |
|
|
|
endforeach() |
|
|
|
endif() |
|
|
|
function(GRPC_GENERATE_CPP PLIB HDRS DEST) |
|
|
|
add_custom_command( |
|
|
|
OUTPUT ${DEST}/${HDRS}.pb.cc |
|
|
|
${DEST}/${HDRS}.pb.h |
|
|
|
${DEST}/${HDRS}.grpc.pb.cc |
|
|
|
${DEST}/${HDRS}.grpc.pb.h |
|
|
|
COMMAND ${GRPC_BINARY_DIR}/protoc |
|
|
|
ARGS --grpc_out "${DEST}" |
|
|
|
--cpp_out "${DEST}" |
|
|
|
-I "${DEST}" |
|
|
|
--plugin=protoc-gen-grpc=${GRPC_BINARY_DIR}/grpc_cpp_plugin |
|
|
|
${ARGN}) |
|
|
|
|
|
|
|
set(${SRCS}) |
|
|
|
set(${HDRS}) |
|
|
|
foreach(FIL ${ARGN}) |
|
|
|
get_filename_component(ABS_FIL ${FIL} ABSOLUTE) |
|
|
|
get_filename_component(FIL_WE ${FIL} NAME_WE) |
|
|
|
|
|
|
|
list(APPEND ${SRCS} "${DEST}/${FIL_WE}.grpc.pb.cc") |
|
|
|
list(APPEND ${HDRS} "${DEST}/${FIL_WE}.grpc.pb.h") |
|
|
|
|
|
|
|
add_custom_command( |
|
|
|
OUTPUT "${DEST}/${FIL_WE}.grpc.pb.cc" |
|
|
|
"${DEST}/${FIL_WE}.grpc.pb.h" |
|
|
|
COMMAND protobuf::protoc |
|
|
|
ARGS --grpc_out ${DEST} ${_protobuf_include_path} --plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN} ${ABS_FIL} |
|
|
|
DEPENDS ${ABS_FIL} protobuf::protoc gRPC::grpc_cpp_plugin |
|
|
|
COMMENT "Running C++ gRPC compiler on ${FIL}" |
|
|
|
VERBATIM ) |
|
|
|
endforeach() |
|
|
|
|
|
|
|
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) |
|
|
|
set(${SRCS} ${${SRCS}} PARENT_SCOPE) |
|
|
|
set(${HDRS} ${${HDRS}} PARENT_SCOPE) |
|
|
|
add_library(${PLIB} |
|
|
|
${DEST}/${HDRS}.pb.cc |
|
|
|
${DEST}/${HDRS}.pb.h |
|
|
|
${DEST}/${HDRS}.grpc.pb.cc |
|
|
|
${DEST}/${HDRS}.grpc.pb.h) |
|
|
|
set_target_properties(${PLIB} PROPERTIES |
|
|
|
ARCHIVE_OUTPUT_DIRECTORY ${DEST}) |
|
|
|
target_link_libraries(${PLIB} |
|
|
|
${GRPC_CLIENT_LIBS}) |
|
|
|
if (EXISTS ${DEST}/${PLIB}) |
|
|
|
message("${BoldGreen} Added ${PLIB} files at ${DEST} successfully!${ColourReset}") |
|
|
|
else () |
|
|
|
message(FATAL_ERROR "Add ${PLIB} code failed!") |
|
|
|
endif () |
|
|
|
endfunction() |
|
|
|
|
|
|
|
# By default have GRPC_GENERATE_CPP macro pass -I to protoc |
|
|
|
# for each directory where a proto file is referenced. |
|
|
|
if(NOT DEFINED GRPC_GENERATE_CPP_APPEND_PATH) |
|
|
|
set(GRPC_GENERATE_CPP_APPEND_PATH TRUE) |
|
|
|
endif() |
|
|
|
|
|
|
|
# Find gRPC include directory |
|
|
|
find_path(GRPC_INCLUDE_DIR grpc/grpc.h) |
|
|
|
mark_as_advanced(GRPC_INCLUDE_DIR) |
|
|
|
|
|
|
|
# Find gRPC library |
|
|
|
find_library(GRPC_LIBRARY NAMES grpc) |
|
|
|
mark_as_advanced(GRPC_LIBRARY) |
|
|
|
add_library(gRPC::grpc UNKNOWN IMPORTED) |
|
|
|
set_target_properties(gRPC::grpc PROPERTIES |
|
|
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR} |
|
|
|
INTERFACE_LINK_LIBRARIES "-lpthread;-ldl" |
|
|
|
IMPORTED_LOCATION ${GRPC_LIBRARY} |
|
|
|
) |
|
|
|
if(NOT DEFINED GRPC_ROOT) |
|
|
|
message(FATAL_ERROR "GRPC_ROOT not set in FindgRPC.cmake") |
|
|
|
else() |
|
|
|
set (_GRPC_LIBS_DIR ${GRPC_ROOT}/lib) |
|
|
|
set (_GRPC_INCLUDE_DIR ${GRPC_ROOT}/include) |
|
|
|
set(gRPC_VERSION "1.37.1") |
|
|
|
# Find gRPC library |
|
|
|
find_path(PROTOBUF_INCLUDE_DIR google/protobuf/service.h PATHS ${_GRPC_INCLUDE_DIR} ) |
|
|
|
# Find gRPC include directory |
|
|
|
find_path(GRPC_INCLUDE_DIR grpc/grpc.h PATHS ${_GRPC_INCLUDE_DIR} ) |
|
|
|
mark_as_advanced(GRPC_INCLUDE_DIR) |
|
|
|
message("${BoldGreen}GRPC_INCLUDE_DIR is ${GRPC_INCLUDE_DIR}${ColourReset}") |
|
|
|
set(GRPC_BINARY_DIR ${GRPC_ROOT}/bin) |
|
|
|
set(GRPC_LIBRARY_DIR ${GRPC_ROOT}/lib) |
|
|
|
endif () |
|
|
|
# set libs dependencies for my repo |
|
|
|
set (_GRPC_CLIENT_ORDERED_DEPS libgrpc++_reflection.a libgrpc++.a libgrpc_unsecure.a libgpr.a libaddress_sorting.a libprotobuf.a libupb.a libcares.a libz.a |
|
|
|
libabsl_synchronization.a libabsl_statusor.a libabsl_status.a |
|
|
|
libabsl_raw_logging_internal.a libabsl_str_format_internal.a libabsl_strings.a libabsl_strings_internal.a |
|
|
|
libabsl_graphcycles_internal.a libabsl_spinlock_wait.a libabsl_malloc_internal.a libabsl_cord.a libabsl_time.a |
|
|
|
libabsl_time_zone.a libabsl_stacktrace.a libabsl_base.a libabsl_throw_delegate.a libabsl_int128.a libabsl_symbolize.a |
|
|
|
libabsl_debugging_internal.a libabsl_demangle_internal.a ) |
|
|
|
|
|
|
|
# Find gRPC C++ library |
|
|
|
find_library(GRPC_GRPC++_LIBRARY NAMES grpc++) |
|
|
|
mark_as_advanced(GRPC_GRPC++_LIBRARY) |
|
|
|
add_library(gRPC::grpc++ UNKNOWN IMPORTED) |
|
|
|
set_target_properties(gRPC::grpc++ PROPERTIES |
|
|
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR} |
|
|
|
INTERFACE_LINK_LIBRARIES gRPC::grpc |
|
|
|
IMPORTED_LOCATION ${GRPC_GRPC++_LIBRARY} |
|
|
|
) |
|
|
|
|
|
|
|
# Find gRPC C++ reflection library |
|
|
|
find_library(GRPC_GRPC++_REFLECTION_LIBRARY NAMES grpc++_reflection) |
|
|
|
mark_as_advanced(GRPC_GRPC++_REFLECTION_LIBRARY) |
|
|
|
add_library(gRPC::grpc++_reflection UNKNOWN IMPORTED) |
|
|
|
set_target_properties(gRPC::grpc++_reflection PROPERTIES |
|
|
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR} |
|
|
|
INTERFACE_LINK_LIBRARIES gRPC::grpc++ |
|
|
|
IMPORTED_LOCATION ${GRPC_GRPC++_REFLECTION_LIBRARY} |
|
|
|
) |
|
|
|
|
|
|
|
# Find gRPC CPP generator |
|
|
|
find_program(GRPC_CPP_PLUGIN NAMES grpc_cpp_plugin) |
|
|
|
mark_as_advanced(GRPC_CPP_PLUGIN) |
|
|
|
add_executable(gRPC::grpc_cpp_plugin IMPORTED) |
|
|
|
set_target_properties(gRPC::grpc_cpp_plugin PROPERTIES |
|
|
|
IMPORTED_LOCATION ${GRPC_CPP_PLUGIN} |
|
|
|
) |
|
|
|
set (GRPC_CLIENT_LIBS) |
|
|
|
foreach (DEP ${_GRPC_CLIENT_ORDERED_DEPS}) |
|
|
|
if (EXISTS ${_GRPC_LIBS_DIR}/${DEP}) |
|
|
|
list (APPEND GRPC_CLIENT_LIBS ${_GRPC_LIBS_DIR}/${DEP} ) |
|
|
|
else() |
|
|
|
message(SEND_ERROR "Missing gRPC dependency ${DEP} " ) |
|
|
|
endif() |
|
|
|
endforeach() |
|
|
|
|
|
|
|
include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) |
|
|
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(gRPC DEFAULT_MSG |
|
|
|
GRPC_LIBRARY GRPC_INCLUDE_DIR GRPC_GRPC++_REFLECTION_LIBRARY GRPC_CPP_PLUGIN) |
|
|
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Protobuf DEFAULT_MSG |
|
|
|
${GRPC_CLIENT_LIBS}) |