diff --git a/examples/cpp/helloworld/CMakeLists.txt b/examples/cpp/helloworld/CMakeLists.txt index f284a03d2fb..e1618bf13f7 100644 --- a/examples/cpp/helloworld/CMakeLists.txt +++ b/examples/cpp/helloworld/CMakeLists.txt @@ -48,7 +48,7 @@ if(GRPC_AS_SUBMODULE) # the same repository as gRPC sources, so we just look a few directories up) add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) message(STATUS "Using gRPC via add_subdirectory.") - + # After using add_subdirectory, we can now use the grpc targets directly from # this build. set(_PROTOBUF_LIBPROTOBUF libprotobuf) @@ -63,7 +63,32 @@ if(GRPC_AS_SUBMODULE) else() set(_GRPC_CPP_PLUGIN_EXECUTABLE $) endif() +elseif(GRPC_FETCHCONTENT) + # Another way is to use CMake's FetchContent module to clone gRPC at + # configure time. This makes gRPC's source code available to your project, + # similar to a git submodule. + message(STATUS "Using gRPC via add_subdirectory (FetchContent).") + include(FetchContent) + FetchContent_Declare( + grpc + GIT_REPOSITORY https://github.com/grpc/grpc.git + # when using gRPC, you will actually set this to an existing tag, such as + # v1.25.0, v1.26.0 etc.. + # For the purpose of testing, we override the tag used to the commit + # that's currently under test. + GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE) + FetchContent_MakeAvailable(grpc) + # Since FetchContent uses add_subdirectory under the hood, we can use + # the grpc targets directly from this build. + set(_PROTOBUF_LIBPROTOBUF libprotobuf) + set(_PROTOBUF_PROTOC $) + set(_GRPC_GRPCPP_UNSECURE grpc++_unsecure) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() else() # This branch assumes that gRPC and all its dependencies are already installed # on this system, so they can be located by find_package(). diff --git a/test/distrib/cpp/run_distrib_test_cmake_fetchcontent.sh b/test/distrib/cpp/run_distrib_test_cmake_fetchcontent.sh new file mode 100755 index 00000000000..ebf790bcb79 --- /dev/null +++ b/test/distrib/cpp/run_distrib_test_cmake_fetchcontent.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Copyright 2017 gRPC authors. +# +# 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. + +set -ex + +cd "$(dirname "$0")/../../.." +grpc_dir=$(pwd) + +echo "deb http://archive.debian.org/debian jessie-backports main" | tee /etc/apt/sources.list.d/jessie-backports.list +echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf +sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list +apt-get update +apt-get install -t jessie-backports -y libssl-dev wget + +# Install CMake 3.16 +wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.16.1/cmake-3.16.1-Linux-x86_64.sh +sh cmake-linux.sh -- --skip-license --prefix=/usr +rm cmake-linux.sh + +# Build helloworld example. +# This uses CMake's FetchContent module to download gRPC and its dependencies +# and add it to the helloworld project as a subdirectory. +mkdir -p "examples/cpp/helloworld/cmake/build" +pushd "examples/cpp/helloworld/cmake/build" +# We set FETCHCONTENT_SOURCE_DIR_GRPC to use the existing gRPC checkout +# rather than cloning a release. +cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DgRPC_BUILD_TESTS=OFF \ + -DgRPC_SSL_PROVIDER=package \ + -DGRPC_FETCHCONTENT=ON \ + -DFETCHCONTENT_SOURCE_DIR_GRPC="$grpc_dir" \ + ../.. +make -j4 +popd diff --git a/tools/run_tests/artifacts/distribtest_targets.py b/tools/run_tests/artifacts/distribtest_targets.py index 0a5e715a916..9ba474ae5c2 100644 --- a/tools/run_tests/artifacts/distribtest_targets.py +++ b/tools/run_tests/artifacts/distribtest_targets.py @@ -301,6 +301,7 @@ def targets(): CppDistribTest('linux', 'x64', 'jessie', 'cmake'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_as_externalproject'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_as_submodule'), + CppDistribTest('linux', 'x64', 'jessie', 'cmake_fetchcontent'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_module_install'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_pkgconfig'), CppDistribTest('linux', 'x64', 'jessie', 'raspberry_pi'),