From 50cbfab391f50efd2f2270f24c3ca2e48e039510 Mon Sep 17 00:00:00 2001 From: Gil Date: Tue, 10 Jul 2018 07:57:54 -0700 Subject: Reorganize cmake dependencies (#1508) * Add cmake dependencies where required ... instead of relying on a topological sort in the top-level CMakeLists.txt. * Add early exits to external project builds --- cmake/external/grpc.cmake | 199 ++++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 97 deletions(-) (limited to 'cmake/external/grpc.cmake') diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index a789838..e25afe6 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -14,117 +14,122 @@ include(ExternalProject) include(ExternalProjectFlags) +include(external/c-ares) +include(external/protobuf) +include(external/zlib) + +if(TARGET grpc) + return() +endif() if(GRPC_ROOT) # If the user has supplied a GRPC_ROOT then just use it. Add an empty custom # target so that the superbuild dependencies still work. add_custom_target(grpc) - -else() - set( - GIT_SUBMODULES - third_party/boringssl - ) - - set( - CMAKE_ARGS - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DBUILD_SHARED_LIBS:BOOL=OFF - -DgRPC_BUILD_TESTS:BOOL=OFF - - # TODO(rsgowman): We're currently building nanopb twice; once via grpc, and - # once via nanopb. The version from grpc is the one that actually ends up - # being used. We need to fix this such that either: - # a) we instruct grpc to use our nanopb - # b) we rely on grpc's nanopb instead of using our own. - # For now, we'll pass in the necessary nanopb cflags into grpc. (We require - # 16 bit fields. Without explicitly requesting this, nanopb uses 8 bit - # fields.) - -DCMAKE_C_FLAGS=-DPB_FIELD_16BIT - -DCMAKE_CXX_FLAGS=-DPB_FIELD_16BIT - ) - - - ## c-ares - if(NOT c-ares_DIR) - set(c-ares_DIR ${FIREBASE_INSTALL_DIR}/lib/cmake/c-ares) - endif() - - list( - APPEND CMAKE_ARGS - -DgRPC_CARES_PROVIDER:STRING=package - -Dc-ares_DIR:PATH=${c-ares_DIR} - ) - - - ## protobuf - - # Unlike other dependencies of gRPC, we control the protobuf version because we - # have checked-in protoc outputs that must match the runtime. - - # The location where protobuf-config.cmake will be installed varies by platform - if(NOT Protobuf_DIR) - if(WIN32) - set(Protobuf_DIR "${FIREBASE_INSTALL_DIR}/cmake") - else() - set(Protobuf_DIR "${FIREBASE_INSTALL_DIR}/lib/cmake/protobuf") - endif() + return() +endif() + +set( + GIT_SUBMODULES + third_party/boringssl +) + +set( + CMAKE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DBUILD_SHARED_LIBS:BOOL=OFF + -DgRPC_BUILD_TESTS:BOOL=OFF + + # TODO(rsgowman): We're currently building nanopb twice; once via grpc, and + # once via nanopb. The version from grpc is the one that actually ends up + # being used. We need to fix this such that either: + # a) we instruct grpc to use our nanopb + # b) we rely on grpc's nanopb instead of using our own. + # For now, we'll pass in the necessary nanopb cflags into grpc. (We require + # 16 bit fields. Without explicitly requesting this, nanopb uses 8 bit + # fields.) + -DCMAKE_C_FLAGS=-DPB_FIELD_16BIT + -DCMAKE_CXX_FLAGS=-DPB_FIELD_16BIT +) + + +## c-ares +if(NOT c-ares_DIR) + set(c-ares_DIR ${FIREBASE_INSTALL_DIR}/lib/cmake/c-ares) +endif() + +list( + APPEND CMAKE_ARGS + -DgRPC_CARES_PROVIDER:STRING=package + -Dc-ares_DIR:PATH=${c-ares_DIR} +) + + +## protobuf + +# Unlike other dependencies of gRPC, we control the protobuf version because we +# have checked-in protoc outputs that must match the runtime. + +# The location where protobuf-config.cmake will be installed varies by platform +if(NOT Protobuf_DIR) + if(WIN32) + set(Protobuf_DIR "${FIREBASE_INSTALL_DIR}/cmake") + else() + set(Protobuf_DIR "${FIREBASE_INSTALL_DIR}/lib/cmake/protobuf") endif() - - list( - APPEND CMAKE_ARGS - -DgRPC_PROTOBUF_PROVIDER:STRING=package - -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG - -DProtobuf_DIR:PATH=${Protobuf_DIR} - ) - - - ## zlib - - # cmake/external/zlib.cmake figures out whether or not to build zlib. Either - # way, from the gRPC build's point of view it's a package. +endif() + +list( + APPEND CMAKE_ARGS + -DgRPC_PROTOBUF_PROVIDER:STRING=package + -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG + -DProtobuf_DIR:PATH=${Protobuf_DIR} +) + + +## zlib + +# cmake/external/zlib.cmake figures out whether or not to build zlib. Either +# way, from the gRPC build's point of view it's a package. +list( + APPEND CMAKE_ARGS + -DgRPC_ZLIB_PROVIDER:STRING=package +) +if(ZLIB_FOUND) + # Propagate possible user configuration to FindZLIB.cmake in the sub-build. list( APPEND CMAKE_ARGS - -DgRPC_ZLIB_PROVIDER:STRING=package + -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} + -DZLIB_LIBRARY=${ZLIB_LIBRARY} ) - if(ZLIB_FOUND) - # Propagate possible user configuration to FindZLIB.cmake in the sub-build. - list( - APPEND CMAKE_ARGS - -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} - -DZLIB_LIBRARY=${ZLIB_LIBRARY} - ) - endif() +endif() - ExternalProject_GitSource( - GRPC_GIT - GIT_REPOSITORY "https://github.com/grpc/grpc.git" - GIT_TAG "v1.8.3" - GIT_SUBMODULES ${GIT_SUBMODULES} - ) +ExternalProject_GitSource( + GRPC_GIT + GIT_REPOSITORY "https://github.com/grpc/grpc.git" + GIT_TAG "v1.8.3" + GIT_SUBMODULES ${GIT_SUBMODULES} +) - ExternalProject_Add( - grpc - DEPENDS - c-ares - protobuf - zlib +ExternalProject_Add( + grpc + DEPENDS + c-ares + protobuf + zlib - ${GRPC_GIT} + ${GRPC_GIT} - PREFIX ${PROJECT_BINARY_DIR}/external/grpc + PREFIX ${PROJECT_BINARY_DIR}/external/grpc - CMAKE_ARGS - ${CMAKE_ARGS} - - BUILD_COMMAND - ${CMAKE_COMMAND} --build . --target grpc - - UPDATE_COMMAND "" - TEST_COMMAND "" - INSTALL_COMMAND "" - ) + CMAKE_ARGS + ${CMAKE_ARGS} -endif(GRPC_ROOT) + BUILD_COMMAND + ${CMAKE_COMMAND} --build . --target grpc + UPDATE_COMMAND "" + TEST_COMMAND "" + INSTALL_COMMAND "" +) -- cgit v1.2.3