From 49f2493e14cd68ecc0e08ad2d9fc75739e419a3b Mon Sep 17 00:00:00 2001 From: Gil Date: Wed, 11 Jul 2018 19:32:24 -0700 Subject: Convert the gRPC external build to use an HTTP download (#1520) * Add a download-only boringssl ExternalProject Match boringssl version to grpc submodule version * Split grpc into separate download and build tasks This allows other external targets to download into the gRPC source tree before grpc is actually built. * Convert grpc to an http download --- cmake/ExternalProjectFlags.cmake | 71 ---------------------------------------- cmake/external/boringssl.cmake | 46 ++++++++++++++++++++++++++ cmake/external/grpc.cmake | 45 ++++++++++++++++--------- 3 files changed, 76 insertions(+), 86 deletions(-) delete mode 100644 cmake/ExternalProjectFlags.cmake create mode 100644 cmake/external/boringssl.cmake diff --git a/cmake/ExternalProjectFlags.cmake b/cmake/ExternalProjectFlags.cmake deleted file mode 100644 index ed4db2c..0000000 --- a/cmake/ExternalProjectFlags.cmake +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2018 Google -# -# Licensed 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. - -include(CMakeParseArguments) - -# Assemble the git-related arguments to an external project making use of the -# latest features where available but avoiding them when run under CMake -# versions that don't support them. -# -# The complete set of git-related arguments are stored as a list in the -# variable named by RESULT_VAR in the calling scope. -# -# Currently this handles: -# * GIT_SUBMODULES -- added on CMake 3.0 or later. Earlier CMakes will -# check out all submodules. -# * GIT_SHALLOW -- added by default on CMake 3.6 or later. Disable by passing -# GIT_SHALLOW OFF -# * GIT_PROGRESS -- added by default on CMake 3.8 or later. Disable by -# passing GIT_PROGRESS OFF -function(ExternalProject_GitSource RESULT_VAR) - # Parse arguments - set(options "") - set(single_value GIT_REPOSITORY GIT_TAG GIT_PROGRESS GIT_SHALLOW) - set(multi_value GIT_SUBMODULES) - cmake_parse_arguments(EP "${options}" "${single_value}" "${multi_value}" ${ARGN}) - - set( - result - GIT_REPOSITORY ${EP_GIT_REPOSITORY} - GIT_TAG ${EP_GIT_TAG} - ${EP_UNPARSED_ARGUMENTS} - ) - - # CMake 3.0 added support for constraining the set of submodules to clone - if(NOT (CMAKE_VERSION VERSION_LESS "3.0") AND EP_GIT_SUBMODULES) - list(APPEND result GIT_SUBMODULES ${EP_GIT_SUBMODULES}) - endif() - - # CMake 3.6 added support for shallow git clones. Use a shallow clone if - # available - if(NOT (CMAKE_VERSION VERSION_LESS "3.6")) - if(NOT EP_GIT_SHALLOW) - set(EP_GIT_SHALLOW ON) - endif() - - list(APPEND result GIT_SHALLOW ${EP_GIT_SHALLOW}) - endif() - - # CMake 3.8 added support for showing progress for large downloads - if(NOT (CMAKE_VERSION VERSION_LESS "3.8")) - if(NOT EP_GIT_PROGRESS) - set(EP_GIT_PROGRESS ON) - endif() - - list(APPEND result GIT_PROGRESS ${EP_GIT_PROGRESS}) - endif() - - set(${RESULT_VAR} ${result} PARENT_SCOPE) - -endfunction() diff --git a/cmake/external/boringssl.cmake b/cmake/external/boringssl.cmake new file mode 100644 index 0000000..4463ba8 --- /dev/null +++ b/cmake/external/boringssl.cmake @@ -0,0 +1,46 @@ +# Copyright 2018 Google +# +# Licensed 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. + +include(ExternalProject) + +if(TARGET boringssl) + return() +endif() + +# This ExternalProject unpacks itself inside the gRPC source tree. CMake clears +# the SOURCE_DIR when unpacking so this must come after grpc despite the fact +# that grpc logically depends upon this. + +# This matches grpc at v1.8.3: +# https://github.com/grpc/grpc/tree/v1.8.3/third_party +set(commit be2ee342d3781ddb954f91f8a7e660c6f59e87e5) + +ExternalProject_Add( + boringssl + DEPENDS + grpc-download + + DOWNLOAD_DIR ${FIREBASE_DOWNLOAD_DIR} + DOWNLOAD_NAME boringssl-${commit}.tar.gz + URL https://github.com/google/boringssl/archive/${commit}.tar.gz + URL_HASH SHA256=8b9f399b8948ab36d51b5b979b208fdf4197e244a516e08d3ed3a9fbb387d463 + + PREFIX ${PROJECT_BINARY_DIR} + SOURCE_DIR ${PROJECT_BINARY_DIR}/src/grpc/third_party/boringssl + + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index d35eb15..310d238 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -13,7 +13,6 @@ # limitations under the License. include(ExternalProject) -include(ExternalProjectFlags) include(external/c-ares) include(external/protobuf) include(external/zlib) @@ -29,15 +28,11 @@ if(GRPC_ROOT) return() endif() -set( - GIT_SUBMODULES - third_party/boringssl -) - set( CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DBUILD_SHARED_LIBS:BOOL=OFF + -DgRPC_INSTALL:BOOL=OFF -DgRPC_BUILD_TESTS:BOOL=OFF # TODO(rsgowman): We're currently building nanopb twice; once via grpc, and @@ -105,23 +100,43 @@ if(ZLIB_FOUND) endif() -ExternalProject_GitSource( - GRPC_GIT - GIT_REPOSITORY "https://github.com/grpc/grpc.git" - GIT_TAG "v1.8.3" - GIT_SUBMODULES ${GIT_SUBMODULES} -) - ExternalProject_Add( - grpc + grpc-download DEPENDS c-ares protobuf zlib - ${GRPC_GIT} + DOWNLOAD_DIR ${FIREBASE_DOWNLOAD_DIR} + DOWNLOAD_NAME grpc-1.8.3.tar.gz + URL https://github.com/grpc/grpc/archive/v1.8.3.tar.gz + URL_HASH SHA256=c14bceddc6475a09927a815811a8161cdfa7acb445262835da6bc24da9842c92 + + PREFIX ${PROJECT_BINARY_DIR} + SOURCE_DIR ${PROJECT_BINARY_DIR}/src/grpc + + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + TEST_COMMAND "" + INSTALL_COMMAND "" +) + +# gRPC depends upon these projects, so from an IWYU point of view should +# include these files. Unfortunately gRPC's build requires these to be +# subdirectories in its own source tree and CMake's ExternalProject download +# step clears the source tree so these must be declared to depend upon the grpc +# target. ExternalProject dependencies must already exist when declared so +# these must come after the ExternalProject_Add block above. +include(external/boringssl) + +ExternalProject_Add( + grpc + DEPENDS + boringssl + grpc-download PREFIX ${PROJECT_BINARY_DIR} + SOURCE_DIR ${PROJECT_BINARY_DIR}/src/grpc CMAKE_ARGS ${CMAKE_ARGS} -- cgit v1.2.3