# Copyright 2018 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. # # cmake "superbuild" file for C++ helloworld example. # This build file demonstrates how to build the helloworld project # and all its dependencies in a single cmake build (hence "superbuild") # that is easy to build and maintain. # cmake's ExternalProject_Add() is used to import all the sub-projects, # including the "helloworld" project itself. # See https://blog.kitware.com/cmake-superbuilds-git-submodules/ cmake_minimum_required(VERSION 3.8) # Project project(HelloWorld-SuperBuild C CXX) include(ExternalProject) # Note: For all external projects, instead of using checked-out code, one could # specify GIT_REPOSITORY and GIT_TAG to have cmake download the dependency directly, # without needing to add a submodule to your project. # Builds absl project from the git submodule. ExternalProject_Add(absl PREFIX absl SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/abseil-cpp" CMAKE_CACHE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/absl ) # Builds absl project from the git submodule. ExternalProject_Add(utf8_range PREFIX utf8_range SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/utf8_range" CMAKE_CACHE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE -Dutf8_range_ENABLE_TESTS:BOOL=OFF -Dabsl_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/absl/lib/cmake/absl -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/utf8_range DEPENDS absl ) # Builds c-ares project from the git submodule. ExternalProject_Add(c-ares PREFIX c-ares SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/cares/cares" CMAKE_CACHE_ARGS -DCARES_SHARED:BOOL=OFF -DCARES_STATIC:BOOL=ON -DCARES_STATIC_PIC:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares ) # Builds protobuf project from the git submodule. ExternalProject_Add(protobuf PREFIX protobuf SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/protobuf" CMAKE_CACHE_ARGS -Dprotobuf_BUILD_TESTS:BOOL=OFF -Dprotobuf_WITH_ZLIB:BOOL=OFF -Dprotobuf_ABSL_PROVIDER:STRING=package -Dabsl_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/absl/lib/cmake/absl -Dutf8_range_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/utf8_range/lib/cmake/utf8_range -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/protobuf DEPENDS absl utf8_range ) # Builds re2 project from the git submodule. ExternalProject_Add(re2 PREFIX re2 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/re2" CMAKE_CACHE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/re2 ) # Builds zlib project from the git submodule. ExternalProject_Add(zlib PREFIX zlib SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/zlib" CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/zlib ) # the location where protobuf-config.cmake will be installed varies by platform if (WIN32) set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/cmake") else() set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/lib/cmake/protobuf") endif() # if OPENSSL_ROOT_DIR is set, propagate that hint path to the external projects with OpenSSL dependency. set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "") if (OPENSSL_ROOT_DIR) set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "-DOPENSSL_ROOT_DIR:PATH=${OPENSSL_ROOT_DIR}") endif() # Builds gRPC based on locally checked-out sources and set arguments so that all the dependencies # are correctly located. ExternalProject_Add(grpc PREFIX grpc SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../.." CMAKE_CACHE_ARGS -DgRPC_INSTALL:BOOL=ON -DgRPC_BUILD_TESTS:BOOL=OFF -DgRPC_BUILD_MSVC_MP_COUNT:STRING=-1 -Dutf8_range_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/utf8_range/lib/cmake/utf8_range -DgRPC_PROTOBUF_PROVIDER:STRING=package -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR} -DgRPC_RE2_PROVIDER:STRING=package -Dre2_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/re2/lib/cmake/re2 -DgRPC_ZLIB_PROVIDER:STRING=package -DZLIB_ROOT:STRING=${CMAKE_CURRENT_BINARY_DIR}/zlib -DgRPC_ABSL_PROVIDER:STRING=package -Dabsl_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/absl/lib/cmake/absl -DgRPC_CARES_PROVIDER:STRING=package -Dc-ares_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares/lib/cmake/c-ares -DgRPC_SSL_PROVIDER:STRING=package ${_CMAKE_ARGS_OPENSSL_ROOT_DIR} -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc DEPENDS c-ares protobuf re2 zlib absl ) # Build the helloworld projects itself using a CMakeLists.txt that assumes all the dependencies # have already been installed. # Even though helloworld is not really an "external project" from perspective of this build, # we are still importing it using ExternalProject_Add because that allows us to use find_package() # to locate all the dependencies (if we were building helloworld directly in this build we, # we would have needed to manually import the libraries as opposed to reusing targets exported by # gRPC and protobuf). ExternalProject_Add(helloworld PREFIX helloworld SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/helloworld" INSTALL_COMMAND "" CMAKE_CACHE_ARGS -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR} -Dc-ares_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares/lib/cmake/c-ares -Dre2_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/re2/lib/cmake/re2 -Dutf8_range_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/utf8_range/lib/cmake/utf8_range -DZLIB_ROOT:STRING=${CMAKE_CURRENT_BINARY_DIR}/zlib -Dabsl_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/absl/lib/cmake/absl ${_CMAKE_ARGS_OPENSSL_ROOT_DIR} -DgRPC_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc/lib/cmake/grpc DEPENDS protobuf grpc )