forked from apache/kudu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FindKRPC.cmake
117 lines (103 loc) · 4.56 KB
/
FindKRPC.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Kudu RPC generator support
#########
find_package(Protobuf REQUIRED)
#
# Generate the KRPC files for a given .proto file.
#
function(KRPC_GENERATE SRCS HDRS TGTS)
if(NOT ARGN)
message(SEND_ERROR "Error: KRPC_GENERATE() called without protobuf files")
return()
endif(NOT ARGN)
set(options)
set(one_value_args SOURCE_ROOT BINARY_ROOT)
set(multi_value_args EXTRA_PROTO_PATHS PROTO_FILES)
cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})
if(ARG_UNPARSED_ARGUMENTS)
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
endif()
set(${SRCS})
set(${HDRS})
set(${TGTS})
set(EXTRA_PROTO_PATH_ARGS)
foreach(PP ${ARG_EXTRA_PROTO_PATHS})
set(EXTRA_PROTO_PATH_ARGS ${EXTRA_PROTO_PATH_ARGS} --proto_path ${PP})
endforeach()
if("${ARG_SOURCE_ROOT}" STREQUAL "")
SET(ARG_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
endif()
GET_FILENAME_COMPONENT(ARG_SOURCE_ROOT ${ARG_SOURCE_ROOT} ABSOLUTE)
if("${ARG_BINARY_ROOT}" STREQUAL "")
SET(ARG_BINARY_ROOT "${CMAKE_CURRENT_BINARY_DIR}")
endif()
GET_FILENAME_COMPONENT(ARG_BINARY_ROOT ${ARG_BINARY_ROOT} ABSOLUTE)
foreach(FIL ${ARG_PROTO_FILES})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
# Ensure that the protobuf file is within the source root.
# This is a requirement of protoc.
FILE(RELATIVE_PATH PROTO_REL_TO_ROOT "${ARG_SOURCE_ROOT}" "${ABS_FIL}")
GET_FILENAME_COMPONENT(REL_DIR "${PROTO_REL_TO_ROOT}" PATH)
if(NOT REL_DIR STREQUAL "")
SET(REL_DIR "${REL_DIR}/")
endif()
set(PROTO_CC_OUT "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.pb.cc")
set(PROTO_H_OUT "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.pb.h")
set(SERVICE_CC "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.service.cc")
set(SERVICE_H "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.service.h")
set(PROXY_CC "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.proxy.cc")
set(PROXY_H "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.proxy.h")
list(APPEND ${SRCS} "${PROTO_CC_OUT}" "${SERVICE_CC}" "${PROXY_CC}")
list(APPEND ${HDRS} "${PROTO_H_OUT}" "${SERVICE_H}" "${PROXY_H}")
add_custom_command(
OUTPUT "${SERVICE_CC}" "${SERVICE_H}" "${PROXY_CC}" "${PROXY_H}"
"${PROTO_CC_OUT}" "${PROTO_H_OUT}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS --plugin $<TARGET_FILE:protoc-gen-krpc>
--plugin $<TARGET_FILE:protoc-gen-insertions>
--cpp_out ${ARG_BINARY_ROOT}
--krpc_out ${ARG_BINARY_ROOT}
--insertions_out ${ARG_BINARY_ROOT}
--proto_path ${ARG_SOURCE_ROOT}
# Used to find built-in .proto files (e.g. FileDescriptorProto)
--proto_path ${PROTOBUF_INCLUDE_DIR}
${EXTRA_PROTO_PATH_ARGS} ${ABS_FIL}
DEPENDS ${ABS_FIL} protoc-gen-krpc protoc-gen-insertions
COMMENT "Running C++ protocol buffer compiler with KRPC plugin on ${FIL}"
VERBATIM)
# This custom target enforces that there's just one invocation of protoc
# when there are multiple consumers of the generated files. The target name
# must be unique; adding parts of the filename helps ensure this.
set(TGT_NAME ${REL_DIR}${FIL})
string(REPLACE "/" "-" TGT_NAME ${TGT_NAME})
add_custom_target(${TGT_NAME}
DEPENDS "${SERVICE_CC}" "${SERVICE_H}"
"${PROXY_CC}" "${PROXY_H}"
"${PROTO_CC_OUT}" "${PROTO_H_OUT}")
list(APPEND ${TGTS} "${TGT_NAME}")
endforeach()
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
set(${SRCS} ${${SRCS}} PARENT_SCOPE)
set(${HDRS} ${${HDRS}} PARENT_SCOPE)
set(${TGTS} ${${TGTS}} PARENT_SCOPE)
# The 'krpc-gen' is a high-level target in $KUDU_ROOT/CMakeLists.txt to
# generate all KRPC proxy/service stub files.
add_dependencies(krpc-gen ${${TGTS}})
endfunction()