blob: 1c2ef0a9c16748c3af3b136098207090114f6483 [file] [log] [blame]
Tamas Berghammerd798a7d2016-06-21 13:58:18 +01001%YAML 1.2
2--- |
3 # GRPC global cmake file
4 # This currently builds C and C++ code.
5 # This file has been automatically generated from a template file.
6 # Please look at the templates directory instead.
7 # This file can be regenerated from the template by running
8 # tools/buildgen/generate_projects.sh
Nicolas "Pixel" Nobleb360c8a2016-07-02 00:54:28 +02009 #
10 # Additionally, this is currently very experimental, and unsupported.
11 # Further work will happen on that file.
12 #
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010013 # Copyright 2015, Google Inc.
14 # All rights reserved.
15 #
16 # Redistribution and use in source and binary forms, with or without
17 # modification, are permitted provided that the following conditions are
18 # met:
19 #
20 # * Redistributions of source code must retain the above copyright
21 # notice, this list of conditions and the following disclaimer.
22 # * Redistributions in binary form must reproduce the above
23 # copyright notice, this list of conditions and the following disclaimer
24 # in the documentation and/or other materials provided with the
25 # distribution.
26 # * Neither the name of Google Inc. nor the names of its
27 # contributors may be used to endorse or promote products derived from
28 # this software without specific prior written permission.
29 #
30 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
34 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
36 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
40 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41
42 <%!
Jan Tattermuschcc641682017-01-17 11:59:31 +010043
44 import re
45
46 proto_re = re.compile('(.*)\\.proto')
47
48 def proto_replace_ext(filename, ext):
49 m = proto_re.match(filename)
50 if not m:
51 return filename
52 return '${_gRPC_PROTO_GENS_DIR}/' + m.group(1) + ext
53
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010054 def get_deps(target_dict):
55 deps = []
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +030056 if target_dict.get('baselib', False):
57 deps.append("${_gRPC_BASELIB_LIBRARIES}")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010058 if target_dict.get('build', None) in ['protoc']:
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +030059 deps.append("${_gRPC_PROTOBUF_PROTOC_LIBRARIES}")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010060 if target_dict.get('secure', False):
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +030061 deps.append("${_gRPC_SSL_LIBRARIES}")
Jan Tattermusch438c0b52017-01-23 11:24:53 +010062 if target_dict.language == 'c++':
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +030063 deps.append("${_gRPC_PROTOBUF_LIBRARIES}")
Jan Tattermusch438c0b52017-01-23 11:24:53 +010064 if target_dict['name'] in ['grpc']:
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +030065 deps.append("${_gRPC_ZLIB_LIBRARIES}")
Jan Tattermusch438c0b52017-01-23 11:24:53 +010066 deps.append("${_gRPC_ALLTARGETS_LIBRARIES}")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010067 for d in target_dict.get('deps', []):
68 deps.append(d)
Jan Tattermusch0a1701f2017-01-17 19:44:08 +010069 if target_dict.build == 'test' and target_dict.language == 'c++':
70 deps.append("${_gRPC_GFLAGS_LIBRARIES}")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010071 return deps
Jan Tattermusch438c0b52017-01-23 11:24:53 +010072
73 def get_platforms_condition_begin(platforms):
74 if all(platform in platforms for platform in ['linux', 'mac', 'posix', 'windows']):
75 return ''
76 cond = ' OR '.join(['_gRPC_PLATFORM_%s' % platform.upper() for platform in platforms])
77 return 'if(%s)\n' % cond
78
79 def get_platforms_condition_end(platforms):
80 if not get_platforms_condition_begin(platforms):
81 return ''
82 return 'endif()\n'
Tamas Berghammerd798a7d2016-06-21 13:58:18 +010083 %>
84
85 cmake_minimum_required(VERSION 2.8)
86
Tamas Berghammerdf6a44c2016-06-22 13:38:55 +010087 set(PACKAGE_NAME "grpc")
Craig Tiller83c47892016-09-13 11:14:43 -070088 set(PACKAGE_VERSION "${settings.cpp_version}")
Tamas Berghammerdf6a44c2016-06-22 13:38:55 +010089 set(PACKAGE_STRING "<%text>${PACKAGE_NAME} ${PACKAGE_VERSION}</%text>")
90 set(PACKAGE_TARNAME "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
91 set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
92 project(<%text>${PACKAGE_NAME}</%text> C CXX)
Jan Tattermusch0a1701f2017-01-17 19:44:08 +010093
94 # Options
95 option(gRPC_BUILD_TESTS "Build tests" OFF)
Tamas Berghammerdf6a44c2016-06-22 13:38:55 +010096
Arkadiy Shapkin40beb372016-08-17 14:42:36 +030097 if (NOT MSVC)
98 set(gRPC_INSTALL ON CACHE BOOL "Generate installation target")
99 else()
100 set(gRPC_INSTALL OFF CACHE BOOL "Generate installation target")
101 endif()
102
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300103 set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library")
104 set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100105
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300106 set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library")
107 set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package")
Tamas Berghammera72712e2016-07-06 10:30:25 +0100108
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300109 set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
110 set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100111
112 set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
113 set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
114
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100115 set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
116 set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
117
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300118 set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100119
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100120 if(UNIX)
121 if(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Linux")
122 set(_gRPC_PLATFORM_LINUX ON)
123 elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Darwin")
124 set(_gRPC_PLATFORM_MAC ON)
125 else()
126 set(_gRPC_PLATFORM_POSIX ON)
127 endif()
128 endif()
129 if(WIN32)
130 set(_gRPC_PLATFORM_WINDOWS ON)
131 endif()
Jan Tattermuschc09656c2017-01-27 13:36:24 +0100132
133 ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF
134 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100135
Arkadiy Shapkin40beb372016-08-17 14:42:36 +0300136 if (MSVC)
Jan Tattermusch51407912017-02-02 20:44:22 +0100137 include(cmake/msvc_static_runtime.cmake)
Jan Tattermusch3aab96f2017-01-11 16:12:46 +0100138 add_definitions(-D_WIN32_WINNT=0x600 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
Jan Tattermusch3aab96f2017-01-11 16:12:46 +0100139 # needed to compile protobuf
140 add_definitions(/wd4065 /wd4506)
141 # TODO(jtattermusch): revisit C4267 occurrences throughout the code
142 add_definitions(/wd4267)
Arkadiy Shapkin40beb372016-08-17 14:42:36 +0300143 endif()
144
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300145 if (gRPC_USE_PROTO_LITE)
146 set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf-lite")
Tamas Berghammer23911562016-07-27 15:24:05 +0100147 add_definitions("-DGRPC_USE_PROTO_LITE")
148 else()
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300149 set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf")
150 endif()
151
152 if("<%text>${gRPC_ZLIB_PROVIDER}</%text>" STREQUAL "module")
153 if(NOT ZLIB_ROOT_DIR)
154 set(ZLIB_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/zlib)
155 endif()
156 set(ZLIB_INCLUDE_DIR "<%text>${ZLIB_ROOT_DIR}</%text>")
157 if(EXISTS "<%text>${ZLIB_ROOT_DIR}</%text>/CMakeLists.txt")
158 add_subdirectory(<%text>${ZLIB_ROOT_DIR}</%text> third_party/zlib)
159 if(TARGET zlibstatic)
160 set(_gRPC_ZLIB_LIBRARIES zlibstatic)
161 endif()
162 else()
163 message(WARNING "gRPC_ZLIB_PROVIDER is \"module\" but ZLIB_ROOT_DIR is wrong")
164 endif()
165 elseif("<%text>${gRPC_ZLIB_PROVIDER}</%text>" STREQUAL "package")
166 find_package(ZLIB)
167 if(TARGET ZLIB::ZLIB)
168 set(_gRPC_ZLIB_LIBRARIES ZLIB::ZLIB)
169 endif()
Konstantin Podsvirovdd331482016-07-28 00:00:25 +0300170 set(_gRPC_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300171 endif()
172
173 if("<%text>${gRPC_PROTOBUF_PROVIDER}</%text>" STREQUAL "module")
174 # Building the protobuf tests require gmock what is not part of a standard protobuf checkout.
175 # Disable them unless they are explicitly requested from the cmake command line (when we assume
176 # gmock is downloaded to the right location inside protobuf).
177 if(NOT protobuf_BUILD_TESTS)
178 set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests")
179 endif()
180 if(NOT PROTOBUF_ROOT_DIR)
181 set(PROTOBUF_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/protobuf)
182 endif()
183 if(EXISTS "<%text>${PROTOBUF_ROOT_DIR}</%text>/cmake/CMakeLists.txt")
Arkadiy Shapkin40beb372016-08-17 14:42:36 +0300184 set(protobuf_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300185 add_subdirectory(<%text>${PROTOBUF_ROOT_DIR}</%text>/cmake third_party/protobuf)
186 if(TARGET <%text>${_gRPC_PROTOBUF_LIBRARY_NAME}</%text>)
187 set(_gRPC_PROTOBUF_LIBRARIES <%text>${_gRPC_PROTOBUF_LIBRARY_NAME}</%text>)
188 endif()
189 if(TARGET libprotoc)
190 set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
191 endif()
Jan Tattermuschcc641682017-01-17 11:59:31 +0100192 if(TARGET protoc)
193 set(_gRPC_PROTOBUF_PROTOC protoc)
194 endif()
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300195 else()
196 message(WARNING "gRPC_PROTOBUF_PROVIDER is \"module\" but PROTOBUF_ROOT_DIR is wrong")
197 endif()
198 elseif("<%text>${gRPC_PROTOBUF_PROVIDER}</%text>" STREQUAL "package")
199 find_package(protobuf CONFIG)
200 if(protobuf_FOUND)
201 if(TARGET protobuf::<%text>${_gRPC_PROTOBUF_LIBRARY_NAME}</%text>)
202 set(_gRPC_PROTOBUF_LIBRARIES protobuf::<%text>${_gRPC_PROTOBUF_LIBRARY_NAME}</%text>)
203 endif()
204 if(TARGET protobuf::libprotoc)
205 set(_gRPC_PROTOBUF_PROTOC_LIBRARIES protobuf::libprotoc)
206 endif()
Jan Tattermuschcc641682017-01-17 11:59:31 +0100207 if(TARGET protobuf::protoc)
208 set(_gRPC_PROTOBUF_PROTOC protobuf::protoc)
209 endif()
Konstantin Podsvirovdd331482016-07-28 00:00:25 +0300210 set(_gRPC_FIND_PROTOBUF "if(NOT protobuf_FOUND)\n find_package(protobuf CONFIG)\nendif()")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300211 else()
212 find_package(Protobuf MODULE)
Konstantin Podsvirovdd331482016-07-28 00:00:25 +0300213 set(_gRPC_FIND_PROTOBUF "if(NOT Protobuf_FOUND)\n find_package(Protobuf)\nendif()")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300214 endif()
215 endif()
216
217 if("<%text>${gRPC_SSL_PROVIDER}</%text>" STREQUAL "module")
218 if(NOT BORINGSSL_ROOT_DIR)
219 set(BORINGSSL_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/boringssl)
220 endif()
221 if(EXISTS "<%text>${BORINGSSL_ROOT_DIR}</%text>/CMakeLists.txt")
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100222 set(OPENSSL_NO_ASM ON) # make boringssl buildable with Visual Studio
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300223 add_subdirectory(<%text>${BORINGSSL_ROOT_DIR}</%text> third_party/boringssl)
224 if(TARGET ssl)
225 set(_gRPC_SSL_LIBRARIES ssl)
226 endif()
227 else()
228 message(WARNING "gRPC_SSL_PROVIDER is \"module\" but BORINGSSL_ROOT_DIR is wrong")
229 endif()
230 elseif("<%text>${gRPC_SSL_PROVIDER}</%text>" STREQUAL "package")
231 find_package(OpenSSL)
232 if(TARGET OpenSSL::SSL)
233 set(_gRPC_SSL_LIBRARIES OpenSSL::SSL)
234 endif()
Konstantin Podsvirovdd331482016-07-28 00:00:25 +0300235 set(_gRPC_FIND_SSL "if(NOT OpenSSL_FOUND)\n find_package(OpenSSL)\nendif()")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300236 endif()
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100237
238 if("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "module")
239 if(NOT GFLAGS_ROOT_DIR)
240 set(GFLAGS_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/gflags)
241 endif()
242 if(EXISTS "<%text>${GFLAGS_ROOT_DIR}</%text>/CMakeLists.txt")
243 add_subdirectory(<%text>${GFLAGS_ROOT_DIR}</%text> third_party/gflags)
Jan Tattermusch87a5d652017-01-18 16:22:40 +0100244 if(TARGET gflags_static)
245 set(_gRPC_GFLAGS_LIBRARIES gflags_static)
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100246 endif()
247 else()
248 message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong")
249 endif()
250 elseif("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "package")
251 find_package(gflags)
252 if(TARGET gflags::gflags)
253 set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
254 endif()
255 set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n find_package(gflags)\nendif()")
256 endif()
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100257
258 if("<%text>${gRPC_BENCHMARK_PROVIDER}</%text>" STREQUAL "module")
259 if(NOT BENCHMARK_ROOT_DIR)
260 set(BENCHMARK_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/benchmark)
261 endif()
262 if(EXISTS "<%text>${BENCHMARK_ROOT_DIR}</%text>/CMakeLists.txt")
263 add_subdirectory(<%text>${BENCHMARK_ROOT_DIR}</%text> third_party/benchmark)
264 if(TARGET benchmark)
265 set(_gRPC_BENCHMARK_LIBRARIES benchmark)
266 endif()
267 else()
268 message(WARNING "gRPC_BENCHMARK_PROVIDER is \"module\" but BENCHMARK_ROOT_DIR is wrong")
269 endif()
270 elseif("<%text>${gRPC_BENCHMARK_PROVIDER}</%text>" STREQUAL "package")
271 find_package(benchmark)
272 if(TARGET benchmark::benchmark)
273 set(_gRPC_BENCHMARK_LIBRARIES benchmark::benchmark)
274 endif()
275 set(_gRPC_FIND_BENCHMARK "if(NOT benchmark_FOUND)\n find_package(benchmark)\nendif()")
276 endif()
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300277
278 if(NOT MSVC)
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100279 set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS}</%text> -std=c99")
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300280 set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS}</%text> -std=c++11")
281 endif()
282
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100283 if(UNIX)
284 set(_gRPC_ALLTARGETS_LIBRARIES dl rt m pthread)
285 endif()
286
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300287 if(WIN32 AND MSVC)
288 set(_gRPC_BASELIB_LIBRARIES wsock32 ws2_32)
Tamas Berghammer23911562016-07-27 15:24:05 +0100289 endif()
290
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300291 include(GNUInstallDirs)
292 if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR)
293 set(CMAKE_INSTALL_CMAKEDIR "<%text>${CMAKE_INSTALL_LIBDIR}</%text>/cmake/gRPC")
294 endif()
Jan Tattermuschcc641682017-01-17 11:59:31 +0100295
296 # Create directory for generated .proto files
297 set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
298 file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)
299
300 # protobuf_generate_grpc_cpp
301 # --------------------------
302 #
303 # Add custom commands to process ``.proto`` files to C++ using protoc and
304 # GRPC plugin::
305 #
306 # protobuf_generate_grpc_cpp [<ARGN>...]
307 #
308 # ``ARGN``
309 # ``.proto`` files
310 #
311 function(protobuf_generate_grpc_cpp)
312 if(NOT ARGN)
313 message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
314 return()
315 endif()
316
317 set(_protobuf_include_path -I .)
318 foreach(FIL <%text>${ARGN}</%text>)
319 get_filename_component(ABS_FIL <%text>${FIL}</%text> ABSOLUTE)
320 get_filename_component(FIL_WE <%text>${FIL}</%text> NAME_WE)
321 file(RELATIVE_PATH REL_FIL <%text>${CMAKE_SOURCE_DIR}</%text> <%text>${ABS_FIL}</%text>)
322 get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
323 set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")
324
325 add_custom_command(
326 OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
327 <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
328 <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
329 <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
330 COMMAND <%text>${_gRPC_PROTOBUF_PROTOC}</%text>
331 ARGS --grpc_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
332 --cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
333 --plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>
334 <%text>${_protobuf_include_path}</%text>
335 <%text>${REL_FIL}</%text>
336 DEPENDS <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> grpc_cpp_plugin
337 WORKING_DIRECTORY <%text>${CMAKE_SOURCE_DIR}</%text>
338 COMMENT "Running gRPC C++ protocol buffer compiler on <%text>${FIL}</%text>"
339 VERBATIM)
340
341 <%text>set_source_files_properties("${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" PROPERTIES GENERATED TRUE)</%text>
342 endforeach()
343 endfunction()
344
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100345 add_custom_target(plugins
346 DEPENDS
347 % for tgt in targets:
348 % if tgt.build == 'protoc':
349 ${tgt.name}
350 % endif
351 % endfor
352 )
353
354 add_custom_target(tools_c
355 DEPENDS
356 % for tgt in targets:
357 % if tgt.build == 'tool' and not tgt.language == 'c++':
358 ${tgt.name}
359 % endif
360 % endfor
361 )
362
363 add_custom_target(tools_cxx
364 DEPENDS
365 % for tgt in targets:
366 % if tgt.build == 'tool' and tgt.language == 'c++':
367 ${tgt.name}
368 % endif
369 % endfor
370 )
371
372 add_custom_target(tools
373 DEPENDS tools_c tools_cxx)
374
375 if (gRPC_BUILD_TESTS)
376 add_custom_target(buildtests_c)
377 % for tgt in targets:
378 % if tgt.build == 'test' and not tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
379 ${get_platforms_condition_begin(tgt.platforms)}\
380 add_dependencies(buildtests_c ${tgt.name})
381 ${get_platforms_condition_end(tgt.platforms)}\
382 % endif
383 % endfor
384
385 add_custom_target(buildtests_cxx)
386 % for tgt in targets:
387 % if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
388 ${get_platforms_condition_begin(tgt.platforms)}\
389 add_dependencies(buildtests_cxx ${tgt.name})
390 ${get_platforms_condition_end(tgt.platforms)}\
391 % endif
392 % endfor
393
394 add_custom_target(buildtests
395 DEPENDS buildtests_c buildtests_cxx)
396 endif (gRPC_BUILD_TESTS)
397
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100398 % for lib in libs:
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100399 % if lib.build in ["all", "protoc", "tool", "test", "private"] and not lib.boringssl:
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100400 % if not lib.get('build_system', []) or 'cmake' in lib.get('build_system', []):
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100401 % if not lib.name in ['benchmark', 'z']: # we build these using CMake instead
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100402 % if lib.build in ["test", "private"]:
403 if (gRPC_BUILD_TESTS)
404 ${cc_library(lib)}
405 endif (gRPC_BUILD_TESTS)
406 % else:
Jan Tattermuschcc641682017-01-17 11:59:31 +0100407 ${cc_library(lib)}
408 ${cc_install(lib)}
Jan Tattermuschaf7b87f2017-01-12 09:41:03 +0100409 % endif
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100410 % endif
411 % endif
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100412 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100413 % endfor
414
415 % for tgt in targets:
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100416 % if tgt.build in ["all", "protoc", "tool", "test", "private"] and not tgt.boringssl:
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100417 % if tgt.build in ["test", "private"]:
418 if (gRPC_BUILD_TESTS)
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100419 ${get_platforms_condition_begin(tgt.platforms)}\
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100420 ${cc_binary(tgt)}
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100421 ${get_platforms_condition_end(tgt.platforms)}\
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100422 endif (gRPC_BUILD_TESTS)
423 % else:
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100424 ${get_platforms_condition_begin(tgt.platforms)}\
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100425 ${cc_binary(tgt)}
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300426 ${cc_install(tgt)}
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100427 ${get_platforms_condition_end(tgt.platforms)}\
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100428 % endif
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100429 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100430 % endfor
431
432 <%def name="cc_library(lib)">
Jan Tattermuschc09656c2017-01-27 13:36:24 +0100433 add_library(${lib.name}${' SHARED' if lib.get('dll', None) == 'only' else ''}
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100434 % for src in lib.src:
Jan Tattermuschcc641682017-01-17 11:59:31 +0100435 % if not proto_re.match(src):
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100436 ${src}
Jan Tattermuschcc641682017-01-17 11:59:31 +0100437 % else:
438 ${proto_replace_ext(src, '.pb.cc')}
439 ${proto_replace_ext(src, '.grpc.pb.cc')}
440 ${proto_replace_ext(src, '.pb.h')}
441 ${proto_replace_ext(src, '.grpc.pb.h')}
442 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100443 % endfor
444 )
Piotr Pietraszkiewicz9a618102017-02-06 19:30:09 +0100445
446 if(WIN32 AND MSVC)
447 set_target_properties(${lib.name} PROPERTIES COMPILE_PDB_NAME "${lib.name}"
448 COMPILE_PDB_OUTPUT_DIRECTORY <%text>"${CMAKE_BINARY_DIR}</%text>"
449 )
450 if (gRPC_INSTALL)
451 install(FILES <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>${lib.name}.pdb
452 DESTINATION <%text>${CMAKE_INSTALL_LIBDIR}</%text> OPTIONAL
453 )
454 endif()
455 endif()
456
Jan Tattermuschcc641682017-01-17 11:59:31 +0100457 % for src in lib.src:
458 % if proto_re.match(src):
459 protobuf_generate_grpc_cpp(
460 ${src}
461 )
462 % endif
463 % endfor
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100464
465 target_include_directories(${lib.name}
466 PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
467 PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/include
468 PRIVATE <%text>${BORINGSSL_ROOT_DIR}</%text>/include
469 PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
Konstantin Podsvirov5baf7252016-07-27 16:25:37 +0300470 PRIVATE <%text>${ZLIB_INCLUDE_DIR}</%text>
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100471 PRIVATE <%text>${BENCHMARK}</%text>/include
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100472 PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100473 PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
474 % if lib.build in ['test', 'private'] and lib.language == 'c++':
475 PRIVATE third_party/googletest/include
476 PRIVATE third_party/googletest
477 % endif
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100478 % if lib.language == 'c++':
Jan Tattermuschcc641682017-01-17 11:59:31 +0100479 PRIVATE <%text>${_gRPC_PROTO_GENS_DIR}</%text>
480 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100481 )
482
483 % if len(get_deps(lib)) > 0:
484 target_link_libraries(${lib.name}
485 % for dep in get_deps(lib):
486 ${dep}
487 % endfor
488 )
489 % endif
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300490
491 % if len(lib.get('public_headers', [])) > 0:
492 foreach(_hdr
493 % for hdr in lib.get('public_headers', []):
494 ${hdr}
495 % endfor
496 )
497 string(REPLACE "include/" "" _path <%text>${_hdr}</%text>)
498 get_filename_component(_path <%text>${_path}</%text> PATH)
499 install(FILES <%text>${_hdr}</%text>
500 DESTINATION "<%text>${CMAKE_INSTALL_INCLUDEDIR}/${_path}</%text>"
501 )
502 endforeach()
503 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100504 </%def>
505
506 <%def name="cc_binary(tgt)">
507 add_executable(${tgt.name}
508 % for src in tgt.src:
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100509 % if not proto_re.match(src):
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100510 ${src}
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100511 % else:
512 ${proto_replace_ext(src, '.pb.cc')}
513 ${proto_replace_ext(src, '.grpc.pb.cc')}
514 ${proto_replace_ext(src, '.pb.h')}
515 ${proto_replace_ext(src, '.grpc.pb.h')}
516 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100517 % endfor
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100518 % if tgt.build == 'test' and tgt.language == 'c++':
519 third_party/googletest/src/gtest-all.cc
520 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100521 )
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100522
523 % for src in tgt.src:
524 % if proto_re.match(src):
525 protobuf_generate_grpc_cpp(
526 ${src}
527 )
528 % endif
529 % endfor
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100530
531 target_include_directories(${tgt.name}
532 PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
533 PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/include
534 PRIVATE <%text>${BORINGSSL_ROOT_DIR}</%text>/include
535 PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100536 PRIVATE <%text>${BENCHMARK_ROOT_DIR}</%text>/include
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100537 PRIVATE <%text>${ZLIB_ROOT_DIR}</%text>
538 PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
Jan Tattermusch0a1701f2017-01-17 19:44:08 +0100539 PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
540 % if tgt.build in ['test', 'private'] and tgt.language == 'c++':
541 PRIVATE third_party/googletest/include
542 PRIVATE third_party/googletest
543 % endif
Jan Tattermusch438c0b52017-01-23 11:24:53 +0100544 % if tgt.language == 'c++':
545 PRIVATE <%text>${_gRPC_PROTO_GENS_DIR}</%text>
546 % endif
Tamas Berghammerd798a7d2016-06-21 13:58:18 +0100547 )
548
549 % if len(get_deps(tgt)) > 0:
550 target_link_libraries(${tgt.name}
551 % for dep in get_deps(tgt):
552 ${dep}
553 % endfor
554 )
555 % endif
556 </%def>
557
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300558 <%def name="cc_install(tgt)">
Arkadiy Shapkin40beb372016-08-17 14:42:36 +0300559 if (gRPC_INSTALL)
560 install(TARGETS ${tgt.name} EXPORT gRPCTargets
561 RUNTIME DESTINATION <%text>${CMAKE_INSTALL_BINDIR}</%text>
562 LIBRARY DESTINATION <%text>${CMAKE_INSTALL_LIBDIR}</%text>
563 ARCHIVE DESTINATION <%text>${CMAKE_INSTALL_LIBDIR}</%text>
564 )
565 endif()
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300566 </%def>
567
Konstantin Podsvirovd2b88302016-07-27 23:43:47 +0300568 foreach(_config gRPCConfig gRPCConfigVersion)
569 configure_file(tools/cmake/<%text>${_config}</%text>.cmake.in
570 <%text>${_config}</%text>.cmake @ONLY)
571 install(FILES <%text>${CMAKE_CURRENT_BINARY_DIR}/${_config}</%text>.cmake
572 DESTINATION <%text>${CMAKE_INSTALL_CMAKEDIR}</%text>
573 )
574 endforeach()