diff options
Diffstat (limited to 'templates/CMakeLists.txt.template')
-rw-r--r-- | templates/CMakeLists.txt.template | 154 |
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: |