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