-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt.template
785 lines (704 loc) · 26.7 KB
/
CMakeLists.txt.template
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
%YAML 1.2
--- |
# GRPC global cmake file
# This currently builds C and C++ code.
# This file has been automatically generated from a template file.
# Please look at the templates directory instead.
# This file can be regenerated from the template by running
# tools/buildgen/generate_projects.sh
#
# Copyright 2015 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.
<%
import re
proto_re = re.compile('(.*)\\.proto')
lib_map = {lib.name: lib for lib in libs}
def proto_replace_ext(filename, ext):
m = proto_re.match(filename)
if not m:
return filename
return '${_gRPC_PROTO_GENS_DIR}/' + m.group(1) + ext
def is_absl_lib(lib_name):
return lib_name.startswith("absl/");
def get_absl_dep(lib_name):
return lib_map[lib_name].cmake_target
def list_absl_lib_files_for(lib_name):
ret = []
lib = lib_map[lib_name]
for dep in lib.transitive_deps:
if is_absl_lib(dep) and len(lib_map[dep].src) > 0:
ret.append(get_absl_dep(dep).replace("::", "_"))
return ret
def is_shared_only_lib(lib_name):
"""Returns True if only shared library should be generated."""
# grpc_csharp_ext is loaded by C# runtime and it
# only makes sense as a shared lib.
return lib_name in ['grpc_csharp_ext']
def get_deps(target_dict):
deps = []
if target_dict.get('baselib', False) or target_dict['name'] == 'address_sorting':
deps.append("${_gRPC_BASELIB_LIBRARIES}")
if target_dict.get('build', None) in ['protoc']:
deps.append("${_gRPC_PROTOBUF_PROTOC_LIBRARIES}")
if target_dict.language == 'c++':
deps.append("${_gRPC_PROTOBUF_LIBRARIES}")
if target_dict['name'] in ['grpc', 'grpc_cronet', 'grpc_unsecure']:
deps.append("${_gRPC_ZLIB_LIBRARIES}")
deps.append("${_gRPC_CARES_LIBRARIES}")
deps.append("${_gRPC_ADDRESS_SORTING_LIBRARIES}")
deps.append("${_gRPC_RE2_LIBRARIES}")
deps.append("${_gRPC_UPB_LIBRARIES}")
deps.append("${_gRPC_ALLTARGETS_LIBRARIES}")
for d in target_dict.get('deps', []):
if d == 'benchmark':
deps.append("${_gRPC_BENCHMARK_LIBRARIES}")
elif d == 'libssl':
deps.append("${_gRPC_SSL_LIBRARIES}")
elif is_absl_lib(d):
deps.append(get_absl_dep(d))
else:
deps.append(d)
return deps
def get_platforms_condition_begin(platforms):
if all(platform in platforms for platform in ['linux', 'mac', 'posix', 'windows']):
return ''
cond = ' OR '.join(['_gRPC_PLATFORM_%s' % platform.upper() for platform in platforms])
return 'if(%s)' % cond
def get_platforms_condition_end(platforms):
if not get_platforms_condition_begin(platforms):
return ''
return 'endif()'
def platforms_condition_block(platforms):
def _func(text):
lines = text.split('\n')
cond = get_platforms_condition_begin(platforms)
if cond:
# Remove empty line following <%block>
del lines[0]
# Indent each line after
for i, line in enumerate(lines[:-1]):
if line:
lines[i] = ' ' + line
# Add the condition block
lines.insert(0, cond)
# Add endif() to the last line
lines[-1] += 'endif()'
else:
# Remove empty line following <%block>
del lines[0]
# Strip leading whitespace from first line
lines[0] = lines[0].lstrip(' ')
# Remove empty line before </%block>
del lines[-1]
return '\n'.join(lines)
return _func
%>
<%
# These files are added to a set so that they are not duplicated if multiple
# targets use them. Generating the same file multiple times with
# add_custom_command() is not allowed in CMake.
protobuf_gen_files = set()
for tgt in targets:
for src in tgt.src:
if proto_re.match(src):
protobuf_gen_files.add(src)
for lib in libs:
for src in lib.src:
if proto_re.match(src):
protobuf_gen_files.add(src)
%>
cmake_minimum_required(VERSION 3.5.1)
set(PACKAGE_NAME "grpc")
set(PACKAGE_VERSION "${settings.cpp_version}")
set(gRPC_CORE_VERSION "${settings.core_version}")
set(gRPC_CORE_SOVERSION "${settings.core_version.major}")
set(gRPC_CPP_VERSION "${settings.cpp_version}")
set(gRPC_CPP_SOVERSION "${settings.cpp_version.major}.${settings.cpp_version.minor}")
set(gRPC_CSHARP_VERSION "${settings.csharp_version}")
set(gRPC_CSHARP_SOVERSION "${settings.csharp_version.major}.${settings.csharp_version.minor}")
set(PACKAGE_STRING "<%text>${PACKAGE_NAME} ${PACKAGE_VERSION}</%text>")
set(PACKAGE_TARNAME "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
project(<%text>${PACKAGE_NAME}</%text> LANGUAGES C CXX)
set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables")
set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries")
set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
set(gRPC_INSTALL_CMAKEDIR "lib/cmake/<%text>${PACKAGE_NAME}</%text>" CACHE STRING "Installation directory for cmake config files")
set(gRPC_INSTALL_SHAREDIR "share/grpc" CACHE STRING "Installation directory for root certificates")
# Options
option(gRPC_BUILD_TESTS "Build tests" OFF)
option(gRPC_BUILD_CODEGEN "Build codegen" ON)
option(gRPC_BUILD_CSHARP_EXT "Build C# extensions" ON)
option(gRPC_BACKWARDS_COMPATIBILITY_MODE "Build libraries that are binary compatible across a larger number of OS and libc versions" OFF)
set(gRPC_INSTALL_default ON)
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
# Disable gRPC_INSTALL by default if building as a submodule
set(gRPC_INSTALL_default OFF)
endif()
set(gRPC_INSTALL <%text>${gRPC_INSTALL_default}</%text> CACHE BOOL
"Generate installation target")
# We can install dependencies from submodules if we're running
# CMake v3.13 or newer.
if(CMAKE_VERSION VERSION_LESS 3.13)
set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE OFF)
else()
set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE ON)
endif()
# Providers for third-party dependencies (gRPC_*_PROVIDER properties):
# "module": build the dependency using sources from git submodule (under third_party)
# "package": use cmake's find_package functionality to locate a pre-installed dependency
set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library")
set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package")
set(gRPC_CARES_PROVIDER "module" CACHE STRING "Provider of c-ares library")
set_property(CACHE gRPC_CARES_PROVIDER PROPERTY STRINGS "module" "package")
set(gRPC_RE2_PROVIDER "module" CACHE STRING "Provider of re2 library")
set_property(CACHE gRPC_RE2_PROVIDER PROPERTY STRINGS "module" "package")
set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library")
set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package")
set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
set(gRPC_PROTOBUF_PACKAGE_TYPE "" CACHE STRING "Algorithm for searching protobuf package")
set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE")
if(gRPC_BUILD_TESTS)
set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
else()
set(gRPC_BENCHMARK_PROVIDER "none")
endif()
set(gRPC_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library")
set_property(CACHE gRPC_ABSL_PROVIDER PROPERTY STRINGS "module" "package")
<%
# Collect all abseil rules used by gpr, grpc, so on.
used_abseil_rules = set()
for lib in libs:
if lib.get("baselib"):
for dep in lib.transitive_deps:
if is_absl_lib(dep):
used_abseil_rules.add(lib_map[dep].cmake_target.replace("::", "_"))
%>
set(gRPC_ABSL_USED_TARGETS
% for rule in sorted(used_abseil_rules):
${rule}
% endfor
absl_meta
)
set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
if(UNIX)
if(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Linux")
set(_gRPC_PLATFORM_LINUX ON)
elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Darwin")
set(_gRPC_PLATFORM_MAC ON)
elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "iOS")
set(_gRPC_PLATFORM_IOS ON)
elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Android")
set(_gRPC_PLATFORM_ANDROID ON)
else()
set(_gRPC_PLATFORM_POSIX ON)
endif()
endif()
if(WIN32)
set(_gRPC_PLATFORM_WINDOWS ON)
endif()
# Use C99 standard
if (NOT DEFINED CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Add c++11 flags
if (NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
else()
if (CMAKE_CXX_STANDARD LESS 11)
message(FATAL_ERROR "CMAKE_CXX_STANDARD is less than 11, please specify at least SET(CMAKE_CXX_STANDARD 11)")
endif()
endif()
if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
if (NOT DEFINED CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF
if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
endif()
list(APPEND CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules")
if(MSVC)
include(cmake/msvc_static_runtime.cmake)
add_definitions(-D_WIN32_WINNT=0x600 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
# needed to compile protobuf
set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4065 /wd4506")
# TODO(jtattermusch): revisit warnings that were silenced as part of upgrade to protobuf3.6.0
set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4200 /wd4291 /wd4244")
# TODO(jtattermusch): revisit C4267 occurrences throughout the code
set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4267")
# TODO(jtattermusch): needed to build boringssl with VS2017, revisit later
set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4987 /wd4774 /wd4819 /wd4996 /wd4619")
endif()
if (MINGW)
add_definitions(-D_WIN32_WINNT=0x600)
endif()
set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")
set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")
if(gRPC_USE_PROTO_LITE)
set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf-lite")
add_definitions("-DGRPC_USE_PROTO_LITE")
else()
set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf")
endif()
if(gRPC_BACKWARDS_COMPATIBILITY_MODE)
add_definitions(-DGPR_BACKWARDS_COMPATIBILITY_MODE)
if(_gRPC_PLATFORM_MAC)
# some C++11 constructs not supported before OS X 10.10
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10)
endif()
endif()
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS)
set(_gRPC_CORE_NOSTDCXX_FLAGS -fno-exceptions -fno-rtti)
else()
set(_gRPC_CORE_NOSTDCXX_FLAGS "")
endif()
include(cmake/abseil-cpp.cmake)
include(cmake/address_sorting.cmake)
include(cmake/benchmark.cmake)
include(cmake/cares.cmake)
include(cmake/protobuf.cmake)
include(cmake/re2.cmake)
include(cmake/ssl.cmake)
include(cmake/upb.cmake)
include(cmake/xxhash.cmake)
include(cmake/zlib.cmake)
if(_gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS)
set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS}</%text> m pthread)
elseif(_gRPC_PLATFORM_ANDROID)
set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS}</%text> m)
elseif(UNIX)
set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS}</%text> rt m pthread)
endif()
if(WIN32)
set(_gRPC_BASELIB_LIBRARIES wsock32 ws2_32 crypt32)
endif()
# Create directory for generated .proto files
set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)
# protobuf_generate_grpc_cpp
# --------------------------
#
# Add custom commands to process ``.proto`` files to C++ using protoc and
# GRPC plugin::
#
# protobuf_generate_grpc_cpp [<ARGN>...]
#
# ``ARGN``
# ``.proto`` files
#
function(protobuf_generate_grpc_cpp)
if(NOT ARGN)
message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
return()
endif()
set(_protobuf_include_path -I . -I <%text>${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}</%text>)
foreach(FIL <%text>${ARGN}</%text>)
get_filename_component(ABS_FIL <%text>${FIL}</%text> ABSOLUTE)
get_filename_component(FIL_WE <%text>${FIL}</%text> NAME_WE)
file(RELATIVE_PATH REL_FIL <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text> <%text>${ABS_FIL}</%text>)
get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")
#if cross-compiling, find host plugin
if(CMAKE_CROSSCOMPILING)
find_program(_gRPC_CPP_PLUGIN grpc_cpp_plugin)
else()
set(_gRPC_CPP_PLUGIN $<TARGET_FILE:grpc_cpp_plugin>)
endif()
add_custom_command(
OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
<%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
<%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h"</%text>
<%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
<%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
COMMAND <%text>${_gRPC_PROTOBUF_PROTOC_EXECUTABLE}</%text>
ARGS --grpc_out=<%text>generate_mock_code=true:${_gRPC_PROTO_GENS_DIR}</%text>
--cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
--plugin=protoc-gen-grpc=<%text>${_gRPC_CPP_PLUGIN}</%text>
<%text>${_protobuf_include_path}</%text>
<%text>${REL_FIL}</%text>
DEPENDS <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> grpc_cpp_plugin
WORKING_DIRECTORY <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
COMMENT "Running gRPC C++ protocol buffer compiler on <%text>${FIL}</%text>"
VERBATIM)
endforeach()
endfunction()
# These options allow users to enable or disable the building of the various
# protoc plugins. For example, running CMake with
# -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF will disable building the C# plugin.
set(_gRPC_PLUGIN_LIST)
% for tgt in targets:
% if tgt.build == 'protoc':
option(gRPC_BUILD_${tgt.name.upper()} "Build ${tgt.name}" ON)
if (gRPC_BUILD_${tgt.name.upper()})
list(APPEND _gRPC_PLUGIN_LIST ${tgt.name})
endif ()
% endif
% endfor
add_custom_target(plugins
DEPENDS <%text>${_gRPC_PLUGIN_LIST}</%text>
)
add_custom_target(tools_c
DEPENDS
% for tgt in targets:
% if tgt.build == 'tool' and not tgt.language == 'c++':
${tgt.name}
% endif
% endfor
)
add_custom_target(tools_cxx
DEPENDS
% for tgt in targets:
% if tgt.build == 'tool' and tgt.language == 'c++':
${tgt.name}
% endif
% endfor
)
add_custom_target(tools
DEPENDS tools_c tools_cxx)
% for src in sorted(protobuf_gen_files):
protobuf_generate_grpc_cpp(
${src}
)
% endfor
if(gRPC_BUILD_TESTS)
add_custom_target(buildtests_c)
% for tgt in targets:
% if tgt.build == 'test' and not tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
<%block filter='platforms_condition_block(tgt.platforms)'>
add_dependencies(buildtests_c ${tgt.name})
</%block>
% endif
% endfor
add_custom_target(buildtests_cxx)
% for tgt in targets:
% if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
<%block filter='platforms_condition_block(tgt.platforms)'>
add_dependencies(buildtests_cxx ${tgt.name})
</%block>
% endif
% endfor
add_custom_target(buildtests
DEPENDS buildtests_c buildtests_cxx)
endif()
<%
cmake_libs = []
for lib in libs:
if lib.build not in ["all", "protoc", "tool", "test", "private"] or lib.boringssl: continue
if lib.get('build_system', []) and 'cmake' not in lib.get('build_system', []): continue
if lib.name in ['ares', 'benchmark', 're2', 'xxhash', 'z']: continue # we build these using CMake instead
if is_absl_lib(lib.name): continue # we build these using CMake instead
cmake_libs.append(lib)
%>
% for lib in cmake_libs:
% if lib.build in ["test", "private"]:
if(gRPC_BUILD_TESTS)
${cc_library(lib)}
endif()
% elif lib.name in ['grpc_csharp_ext']:
if(gRPC_BUILD_CSHARP_EXT)
${cc_library(lib)}
endif()
% else:
${cc_library(lib)}
% if not lib.build in ["tool"]:
% if any(proto_re.match(src) for src in lib.src):
if(gRPC_BUILD_CODEGEN)
% endif
${cc_install(lib)}
% if any(proto_re.match(src) for src in lib.src):
endif()
% endif
% endif
% endif
% endfor
% for tgt in targets:
% if tgt.build in ["all", "protoc", "tool", "test", "private"] and not tgt.boringssl:
% if tgt.build in ["test", "private"]:
if(gRPC_BUILD_TESTS)
<%block filter='platforms_condition_block(tgt.platforms)'>
${cc_binary(tgt)}
</%block>
endif()
% elif tgt.build in ["protoc"]:
if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_${tgt.name.upper()})
<%block filter='platforms_condition_block(tgt.platforms)'>
${cc_binary(tgt)}
${cc_install(tgt)}
</%block>
endif()
% else:
<%block filter='platforms_condition_block(tgt.platforms)'>
${cc_binary(tgt)}
% if not tgt.build in ["tool"]:
${cc_install(tgt)}
% endif
</%block>
% endif
% endif
% endfor
<%def name="cc_library(lib)">
% if any(proto_re.match(src) for src in lib.src):
% if lib.name == 'grpcpp_channelz':
# grpcpp_channelz doesn't build with protobuf-lite
# See https://github.com/grpc/grpc/issues/19473
if(gRPC_BUILD_CODEGEN AND NOT gRPC_USE_PROTO_LITE)
% else:
if(gRPC_BUILD_CODEGEN)
% endif
% endif
add_library(${lib.name}${' SHARED' if is_shared_only_lib(lib.name) else ''}
% for src in lib.src:
% if not proto_re.match(src):
${src}
% else:
${proto_replace_ext(src, '.pb.cc')}
${proto_replace_ext(src, '.grpc.pb.cc')}
${proto_replace_ext(src, '.pb.h')}
${proto_replace_ext(src, '.grpc.pb.h')}
% if src in ["src/proto/grpc/testing/compiler_test.proto", "src/proto/grpc/testing/echo.proto"]:
${proto_replace_ext(src, '_mock.grpc.pb.h')}
% endif
% endif
% endfor
)
set_target_properties(${lib.name} PROPERTIES
% if lib.language == 'c++':
VERSION <%text>${gRPC_CPP_VERSION}</%text>
SOVERSION <%text>${gRPC_CPP_SOVERSION}</%text>
% elif lib.language == 'csharp':
VERSION <%text>${gRPC_CSHARP_VERSION}</%text>
SOVERSION <%text>${gRPC_CSHARP_SOVERSION}</%text>
% else:
VERSION <%text>${gRPC_CORE_VERSION}</%text>
SOVERSION <%text>${gRPC_CORE_SOVERSION}</%text>
% endif
)
if(WIN32 AND MSVC)
set_target_properties(${lib.name} PROPERTIES COMPILE_PDB_NAME "${lib.name}"
COMPILE_PDB_OUTPUT_DIRECTORY <%text>"${CMAKE_BINARY_DIR}</%text>"
)
if(gRPC_INSTALL)
install(FILES <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>${lib.name}.pdb
DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text> OPTIONAL
)
endif()
endif()
target_include_directories(${lib.name}
PUBLIC <%text>$<INSTALL_INTERFACE:${gRPC_INSTALL_INCLUDEDIR}> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include></%text>
PRIVATE
<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
<%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
<%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
<%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
<%text>${_gRPC_UPB_GENERATED_DIR}</%text>
<%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
<%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
<%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
<%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
% if lib.build in ['test', 'private'] and lib.language == 'c++':
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
% endif
% if lib.language == 'c++':
<%text>${_gRPC_PROTO_GENS_DIR}</%text>
% endif
)
% if len(get_deps(lib)) > 0:
target_link_libraries(${lib.name}
% for dep in get_deps(lib):
${dep}
% endfor
)
% endif
% if lib.name in ["gpr"]:
if(_gRPC_PLATFORM_ANDROID)
target_link_libraries(gpr
android
log
)
endif()
% endif
% if lib.name in ["grpc", "grpc_cronet", "grpc_test_util", \
"grpc_test_util_unsecure", "grpc_unsecure", \
"grpc++_cronet"]:
if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC)
target_link_libraries(${lib.name} "-framework CoreFoundation")
endif()
%endif
% if len(lib.get('public_headers', [])) > 0:
foreach(_hdr
% for hdr in lib.get('public_headers', []):
${hdr}
% endfor
)
string(REPLACE "include/" "" _path <%text>${_hdr}</%text>)
get_filename_component(_path <%text>${_path}</%text> PATH)
install(FILES <%text>${_hdr}</%text>
DESTINATION "<%text>${gRPC_INSTALL_INCLUDEDIR}/${_path}</%text>"
)
endforeach()
% endif
% if any(proto_re.match(src) for src in lib.src):
endif()
% endif
</%def>
<%def name="cc_binary(tgt)">
add_executable(${tgt.name}
% for src in tgt.src:
% if not proto_re.match(src):
${src}
% else:
${proto_replace_ext(src, '.pb.cc')}
${proto_replace_ext(src, '.grpc.pb.cc')}
${proto_replace_ext(src, '.pb.h')}
${proto_replace_ext(src, '.grpc.pb.h')}
% endif
% endfor
% if tgt.build == 'test' and tgt.language == 'c++':
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
% endif
)
target_include_directories(${tgt.name}
PRIVATE
<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/include
<%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
<%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
<%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
<%text>${_gRPC_UPB_GENERATED_DIR}</%text>
<%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
<%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
<%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
<%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
% if tgt.build in ['test', 'private'] and tgt.language == 'c++':
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
% endif
% if tgt.language == 'c++':
<%text>${_gRPC_PROTO_GENS_DIR}</%text>
% endif
)
% if len(get_deps(tgt)) > 0:
target_link_libraries(${tgt.name}
% for dep in get_deps(tgt):
${dep}
% endfor
)
% endif
</%def>
<%def name="cc_install(tgt)">
if(gRPC_INSTALL)
install(TARGETS ${tgt.name} EXPORT gRPCTargets
RUNTIME DESTINATION <%text>${gRPC_INSTALL_BINDIR}</%text>
LIBRARY DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
ARCHIVE DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
)
endif()
</%def>
if(gRPC_INSTALL)
install(EXPORT gRPCTargets
DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
NAMESPACE gRPC::
)
endif()
include(CMakePackageConfigHelpers)
configure_file(cmake/gRPCConfig.cmake.in
gRPCConfig.cmake @ONLY)
write_basic_package_version_file(<%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
VERSION <%text>${gRPC_CPP_VERSION}</%text>
COMPATIBILITY AnyNewerVersion)
install(FILES
<%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfig.cmake
<%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
)
install(FILES
<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findc-ares.cmake
<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findre2.cmake
DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>/modules
)
install(FILES <%text>${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem</%text>
DESTINATION <%text>${gRPC_INSTALL_SHAREDIR}</%text>)
# Function to generate pkg-config files.
function(generate_pkgconfig name description version requires
libs libs_private output_filename)
set(PC_NAME "<%text>${name}</%text>")
set(PC_DESCRIPTION "<%text>${description}</%text>")
set(PC_VERSION "<%text>${version}</%text>")
set(PC_REQUIRES "<%text>${requires}</%text>")
set(PC_LIB "<%text>${libs}</%text>")
set(PC_LIBS_PRIVATE "<%text>${libs_private}</%text>")
set(output_filepath "<%text>${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}</%text>")
configure_file(
"<%text>${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in</%text>"
"<%text>${output_filepath}</%text>"
@ONLY)
install(FILES "<%text>${output_filepath}</%text>"
DESTINATION "lib/pkgconfig/")
endfunction()
# gpr .pc file
generate_pkgconfig(
"gpr"
"gRPC platform support library"
"<%text>${gRPC_CORE_VERSION}</%text>"
""
"${" ".join(("-l" + l) for l in ["gpr",] + list_absl_lib_files_for("gpr"))}"
""
"gpr.pc")
# grpc .pc file
generate_pkgconfig(
"gRPC"
"high performance general RPC framework"
"<%text>${gRPC_CORE_VERSION}</%text>"
"gpr openssl"
"${" ".join(("-l" + l) for l in ["grpc", "address_sorting", "re2", "upb", "cares", "z"] + list_absl_lib_files_for("grpc"))}"
""
"grpc.pc")
# grpc_unsecure .pc file
generate_pkgconfig(
"gRPC unsecure"
"high performance general RPC framework without SSL"
"<%text>${gRPC_CORE_VERSION}</%text>"
"gpr"
"${" ".join(("-l" + l) for l in ["grpc_unsecure",] + list_absl_lib_files_for("grpc_unsecure"))}"
""
"grpc_unsecure.pc")
# grpc++ .pc file
generate_pkgconfig(
"gRPC++"
"C++ wrapper for gRPC"
"<%text>${gRPC_CPP_VERSION}</%text>"
"grpc"
"${" ".join(("-l" + l) for l in ["grpc++",] + list_absl_lib_files_for("grpc++"))}"
""
"grpc++.pc")
# grpc++_unsecure .pc file
generate_pkgconfig(
"gRPC++ unsecure"
"C++ wrapper for gRPC without SSL"
"<%text>${gRPC_CPP_VERSION}</%text>"
"grpc_unsecure"
"${" ".join(("-l" + l) for l in ["grpc++_unsecure",] + list_absl_lib_files_for("grpc++_unsecure"))}"
""
"grpc++_unsecure.pc")