blob: 9fbdf071a8d73f7329d0c0634ebef3d23b707fb2 [file] [log] [blame]
Jan Tattermusch2286c632018-03-27 09:45:47 +02001# Copyright 2018 gRPC authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15# cmake "superbuild" file for C++ helloworld example.
16# This build file demonstrates how to build the helloworld project
17# and all its dependencies in a single cmake build (hence "superbuild")
18# that is easy to build and maintain.
19# cmake's ExternalProject_Add() is used to import all the sub-projects,
20# including the "helloworld" project itself.
21# See https://blog.kitware.com/cmake-superbuilds-git-submodules/
22
23cmake_minimum_required(VERSION 2.8)
24
25# Project
26project(HelloWorld-SuperBuild C CXX)
27
28include(ExternalProject)
29
30# Builds c-ares project from the git submodule.
31# Note: For all external projects, instead of using checked-out code, one could
32# specify GIT_REPOSITORY and GIT_TAG to have cmake download the dependency directly,
33# without needing to add a submodule to your project.
34ExternalProject_Add(c-ares
35 PREFIX c-ares
36 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/cares/cares"
37 CMAKE_CACHE_ARGS
38 -DCARES_SHARED:BOOL=OFF
39 -DCARES_STATIC:BOOL=ON
40 -DCARES_STATIC_PIC:BOOL=ON
41 -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares
42)
43
44# Builds protobuf project from the git submodule.
45ExternalProject_Add(protobuf
46 PREFIX protobuf
47 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/protobuf/cmake"
48 CMAKE_CACHE_ARGS
49 -Dprotobuf_BUILD_TESTS:BOOL=OFF
50 -Dprotobuf_WITH_ZLIB:BOOL=OFF
51 -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
52 -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/protobuf
53)
54
55# Builds zlib project from the git submodule.
56ExternalProject_Add(zlib
57 PREFIX zlib
58 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/zlib"
59 CMAKE_CACHE_ARGS
60 -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/zlib
61)
62
63# the location where protobuf-config.cmake will be installed varies by platform
64if (WIN32)
65 set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/cmake")
66else()
67 set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/lib/cmake/protobuf")
68endif()
69
70# if OPENSSL_ROOT_DIR is set, propagate that hint path to the external projects with OpenSSL dependency.
71set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "")
72if (OPENSSL_ROOT_DIR)
73 set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "-DOPENSSL_ROOT_DIR:PATH=${OPENSSL_ROOT_DIR}")
74endif()
75
76# Builds gRPC based on locally checked-out sources and set arguments so that all the dependencies
77# are correctly located.
78ExternalProject_Add(grpc
79 PREFIX grpc
80 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../.."
81 CMAKE_CACHE_ARGS
82 -DgRPC_INSTALL:BOOL=ON
83 -DgRPC_BUILD_TESTS:BOOL=OFF
84 -DgRPC_PROTOBUF_PROVIDER:STRING=package
85 -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG
86 -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR}
87 -DgRPC_ZLIB_PROVIDER:STRING=package
88 -DZLIB_ROOT:STRING=${CMAKE_CURRENT_BINARY_DIR}/zlib
89 -DgRPC_CARES_PROVIDER:STRING=package
90 -Dc-ares_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares/lib/cmake/c-ares
91 -DgRPC_SSL_PROVIDER:STRING=package
92 ${_CMAKE_ARGS_OPENSSL_ROOT_DIR}
93 -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc
94 DEPENDS c-ares protobuf zlib
95)
96
97# Build the helloworld projects itself using a CMakeLists.txt that assumes all the dependencies
98# have already been installed.
99# Even though helloworld is not really an "external project" from perspective of this build,
100# we are still importing it using ExternalProject_Add because that allows us to use find_package()
101# to locate all the dependencies (if we were building helloworld directly in this build we,
102# we would have needed to manually import the libraries as opposed to reusing targets exported by
103# gRPC and protobuf).
104ExternalProject_Add(helloworld
105 PREFIX helloworld
106 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.."
107 BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/helloworld"
108 INSTALL_COMMAND ""
109 CMAKE_CACHE_ARGS
110 -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR}
111 -Dc-ares_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares/lib/cmake/c-ares
112 -DZLIB_ROOT:STRING=${CMAKE_CURRENT_BINARY_DIR}/zlib
113 ${_CMAKE_ARGS_OPENSSL_ROOT_DIR}
114 -DgRPC_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc/lib/cmake/grpc
115 DEPENDS protobuf grpc
116)