1# ========== grpc proto prebuilts ================= 2 3if (NOT trout_HOST_PROGRAM_PATH) 4 set(trout_HOST_PROGRAM_PATH ${trout_SRC_ROOT}/out/host_build/bin) 5endif() 6 7# find Android prebuilt programs first 8find_program(trout_PROTOC aprotoc) 9find_program(trout_GRPC_CPP_PLUGIN protoc-gen-grpc-cpp-plugin) 10 11# If not found in Android prebuilts, then find in the host program path 12find_program(trout_PROTOC protoc 13 PATHS ${trout_HOST_PROGRAM_PATH} 14 NO_DEFAULT_PATH) 15find_program(trout_GRPC_CPP_PLUGIN grpc_cpp_plugin 16 PATHS ${trout_HOST_PROGRAM_PATH} 17 NO_DEFAULT_PATH) 18 19if (NOT trout_GENS_DIR) 20 set(trout_GENS_DIR ${PROJECT_BINARY_DIR}/gens) 21endif() 22 23if(NOT _trout_PROTOBUF_WELLKNOWN_INCLUDE_DIR) 24 message(FATAL_ERROR "_trout_PROTOBUF_WELLKNOWN_INCLUDE_DIR not set") 25endif() 26 27 28function(trout_generate_grpc_cpp_from_proto) 29 cmake_parse_arguments( 30 PARSED_ARGS 31 "" # no boolean args 32 "" # no single value args 33 "INCLUDES;SRCS" # multi value args 34 ${ARGN} 35 ) 36 37 if(NOT PARSED_ARGS_SRCS) 38 message(SEND_ERROR "Error: trout_generate_grpc_cpp_from_proto() called without any proto files") 39 return() 40 endif() 41 42 if(PARSED_ARGS_UNPARSED_ARGUMENTS) 43 message(SEND_ERROR "Unknown arguments: ${PARSED_ARGS_UNPARSED_ARGUMENTS}") 44 return() 45 endif() 46 47 set(_protobuf_include_path -I . -I ${_trout_PROTOBUF_WELLKNOWN_INCLUDE_DIR}) 48 foreach(INCLUDE_PATH ${PARSED_ARGS_INCLUDES}) 49 list(APPEND _protobuf_include_path -I ${INCLUDE_PATH}) 50 endforeach() 51 52 foreach(FIL ${PARSED_ARGS_SRCS}) 53 get_filename_component(ABS_FIL ${FIL} ABSOLUTE) 54 get_filename_component(ABS_DIR ${ABS_FIL} DIRECTORY) 55 get_filename_component(FIL_NAME ${FIL} NAME) 56 get_filename_component(FIL_WE ${FIL} NAME_WE) 57 58 add_custom_command( 59 OUTPUT "${trout_GENS_DIR}/${FIL_WE}.grpc.pb.cc" 60 "${trout_GENS_DIR}/${FIL_WE}.grpc.pb.h" 61 "${trout_GENS_DIR}/${FIL_WE}.pb.cc" 62 "${trout_GENS_DIR}/${FIL_WE}.pb.h" 63 COMMAND ${trout_PROTOC} 64 ARGS --grpc_out=generate_mock_code=true:${trout_GENS_DIR} 65 --cpp_out=${trout_GENS_DIR} 66 --plugin=protoc-gen-grpc=${trout_GRPC_CPP_PLUGIN} 67 ${_protobuf_include_path} 68 ${FIL_NAME} 69 DEPENDS ${ABS_FIL} ${trout_PROTOC} ${trout_GRPC_CPP_PLUGIN} 70 WORKING_DIRECTORY ${ABS_DIR} 71 COMMENT "Running gRPC C++ protocol buffer compiler on ${FIL}" 72 VERBATIM) 73 74 set_source_files_properties("${trout_GENS_DIR}/${FIL_WE}.grpc.pb.cc" "${trout_GENS_DIR}/${FIL_WE}.grpc.pb.h" "${trout_GENS_DIR}/${FIL_WE}.pb.cc" "${trout_GENS_DIR}/${FIL_WE}.pb.h" PROPERTIES GENERATED TRUE) 75 endforeach() 76endfunction() 77 78 79