aboutsummaryrefslogtreecommitdiffhomepage
path: root/templates/CMakeLists.txt.template
diff options
context:
space:
mode:
Diffstat (limited to 'templates/CMakeLists.txt.template')
-rw-r--r--templates/CMakeLists.txt.template154
1 files changed, 144 insertions, 10 deletions
diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template
index 028c1b8c32..a326f36fe9 100644
--- a/templates/CMakeLists.txt.template
+++ b/templates/CMakeLists.txt.template
@@ -40,6 +40,17 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<%!
+
+ import re
+
+ proto_re = re.compile('(.*)\\.proto')
+
+ def proto_replace_ext(filename, ext):
+ m = proto_re.match(filename)
+ if not m:
+ return filename
+ return '${_gRPC_PROTO_GENS_DIR}/' + m.group(1) + ext
+
def get_deps(target_dict):
deps = []
if target_dict.get('baselib', False):
@@ -54,6 +65,8 @@
deps.append("${_gRPC_ZLIB_LIBRARIES}")
for d in target_dict.get('deps', []):
deps.append(d)
+ if target_dict.build == 'test' and target_dict.language == 'c++':
+ deps.append("${_gRPC_GFLAGS_LIBRARIES}")
return deps
%>
@@ -65,6 +78,9 @@
set(PACKAGE_TARNAME "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
project(<%text>${PACKAGE_NAME}</%text> C CXX)
+
+ # Options
+ option(gRPC_BUILD_TESTS "Build tests" OFF)
if (NOT MSVC)
set(gRPC_INSTALL ON CACHE BOOL "Generate installation target")
@@ -80,7 +96,10 @@
set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
-
+
+ set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
+ set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
+
set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
if (MSVC)
@@ -140,6 +159,9 @@
if(TARGET libprotoc)
set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
endif()
+ if(TARGET protoc)
+ set(_gRPC_PROTOBUF_PROTOC protoc)
+ endif()
else()
message(WARNING "gRPC_PROTOBUF_PROVIDER is \"module\" but PROTOBUF_ROOT_DIR is wrong")
endif()
@@ -152,6 +174,9 @@
if(TARGET protobuf::libprotoc)
set(_gRPC_PROTOBUF_PROTOC_LIBRARIES protobuf::libprotoc)
endif()
+ if(TARGET protobuf::protoc)
+ set(_gRPC_PROTOBUF_PROTOC protobuf::protoc)
+ endif()
set(_gRPC_FIND_PROTOBUF "if(NOT protobuf_FOUND)\n find_package(protobuf CONFIG)\nendif()")
else()
find_package(Protobuf MODULE)
@@ -178,6 +203,26 @@
endif()
set(_gRPC_FIND_SSL "if(NOT OpenSSL_FOUND)\n find_package(OpenSSL)\nendif()")
endif()
+
+ if("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "module")
+ if(NOT GFLAGS_ROOT_DIR)
+ set(GFLAGS_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/gflags)
+ endif()
+ if(EXISTS "<%text>${GFLAGS_ROOT_DIR}</%text>/CMakeLists.txt")
+ add_subdirectory(<%text>${GFLAGS_ROOT_DIR}</%text> third_party/gflags)
+ if(TARGET gflags_static)
+ set(_gRPC_GFLAGS_LIBRARIES gflags_static)
+ endif()
+ else()
+ message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong")
+ endif()
+ elseif("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "package")
+ find_package(gflags)
+ if(TARGET gflags::gflags)
+ set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
+ endif()
+ set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n find_package(gflags)\nendif()")
+ endif()
if(NOT MSVC)
set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS}</%text> -std=c11")
@@ -192,32 +237,105 @@
if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR)
set(CMAKE_INSTALL_CMAKEDIR "<%text>${CMAKE_INSTALL_LIBDIR}</%text>/cmake/gRPC")
endif()
-
+
+ # Create directory for generated .proto files
+ set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
+ file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)
+
+ # protobuf_generate_grpc_cpp
+ # --------------------------
+ #
+ # Add custom commands to process ``.proto`` files to C++ using protoc and
+ # GRPC plugin::
+ #
+ # protobuf_generate_grpc_cpp [<ARGN>...]
+ #
+ # ``ARGN``
+ # ``.proto`` files
+ #
+ function(protobuf_generate_grpc_cpp)
+ if(NOT ARGN)
+ message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
+ return()
+ endif()
+
+ set(_protobuf_include_path -I .)
+ foreach(FIL <%text>${ARGN}</%text>)
+ get_filename_component(ABS_FIL <%text>${FIL}</%text> ABSOLUTE)
+ get_filename_component(FIL_WE <%text>${FIL}</%text> NAME_WE)
+ file(RELATIVE_PATH REL_FIL <%text>${CMAKE_SOURCE_DIR}</%text> <%text>${ABS_FIL}</%text>)
+ get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
+ set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")
+
+ add_custom_command(
+ OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
+ <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
+ <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
+ <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
+ COMMAND <%text>${_gRPC_PROTOBUF_PROTOC}</%text>
+ ARGS --grpc_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
+ --cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
+ --plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>
+ <%text>${_protobuf_include_path}</%text>
+ <%text>${REL_FIL}</%text>
+ DEPENDS <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> grpc_cpp_plugin
+ WORKING_DIRECTORY <%text>${CMAKE_SOURCE_DIR}</%text>
+ COMMENT "Running gRPC C++ protocol buffer compiler on <%text>${FIL}</%text>"
+ VERBATIM)
+
+ <%text>set_source_files_properties("${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" PROPERTIES GENERATED TRUE)</%text>
+ endforeach()
+ endfunction()
+
% for lib in libs:
- % if lib.build in ["all", "protoc", "tool"] and lib.language in ['c', 'c++']:
- ## TODO(jtattermusch): grpc++_reflection includes .proto files
- ## which is not yet supported and thus fails the entire build.
- ## Re-enable once fixed.
- % if lib.name != 'grpc++_reflection':
- ${cc_library(lib)}
- ${cc_install(lib)}
+ % if lib.build in ["all", "protoc", "tool", "test", "private"] and lib.language in ['c', 'c++']:
+ % if not lib.get('build_system', []) or 'cmake' in lib.get('build_system', []):
+ % if lib.build in ["test", "private"]:
+ if (gRPC_BUILD_TESTS)
+ ${cc_library(lib)}
+ endif (gRPC_BUILD_TESTS)
+ % else:
+ ${cc_library(lib)}
+ ${cc_install(lib)}
+ % endif
% endif
% endif
% endfor
% for tgt in targets:
- % if tgt.build in ["all", "protoc", "tool"] and tgt.language in ['c', 'c++']:
+ % if tgt.build in ["all", "protoc", "tool", "test", "private"] and tgt.language in ['c', 'c++']:
+ % if tgt.build in ["test", "private"]:
+ if (gRPC_BUILD_TESTS)
+ ${cc_binary(tgt)}
+ endif (gRPC_BUILD_TESTS)
+ % else:
${cc_binary(tgt)}
${cc_install(tgt)}
% endif
+ % endif
% endfor
<%def name="cc_library(lib)">
add_library(${lib.name}
% for src in lib.src:
+ % if not proto_re.match(src):
${src}
+ % else:
+ ${proto_replace_ext(src, '.pb.cc')}
+ ${proto_replace_ext(src, '.grpc.pb.cc')}
+ ${proto_replace_ext(src, '.pb.h')}
+ ${proto_replace_ext(src, '.grpc.pb.h')}
+ % endif
% endfor
)
+
+ % for src in lib.src:
+ % if proto_re.match(src):
+ protobuf_generate_grpc_cpp(
+ ${src}
+ )
+ % endif
+ % endfor
target_include_directories(${lib.name}
PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
@@ -226,6 +344,14 @@
PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
PRIVATE <%text>${ZLIB_INCLUDE_DIR}</%text>
PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
+ PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
+ % if lib.build in ['test', 'private'] and lib.language == 'c++':
+ PRIVATE third_party/googletest/include
+ PRIVATE third_party/googletest
+ % endif
+ % if any(proto_re.match(src) for src in lib.src):
+ PRIVATE <%text>${_gRPC_PROTO_GENS_DIR}</%text>
+ % endif
)
% if len(get_deps(lib)) > 0:
@@ -256,6 +382,9 @@
% for src in tgt.src:
${src}
% endfor
+ % if tgt.build == 'test' and tgt.language == 'c++':
+ third_party/googletest/src/gtest-all.cc
+ % endif
)
target_include_directories(${tgt.name}
@@ -265,6 +394,11 @@
PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
PRIVATE <%text>${ZLIB_ROOT_DIR}</%text>
PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
+ PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
+ % if tgt.build in ['test', 'private'] and tgt.language == 'c++':
+ PRIVATE third_party/googletest/include
+ PRIVATE third_party/googletest
+ % endif
)
% if len(get_deps(tgt)) > 0: