71391f8139a47edb84db934f7aa6f5c5950f99d5
[platform/upstream/grpc.git] / templates / Makefile.template
1 %YAML 1.2
2 --- |
3   # GRPC global makefile
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
9
10   # Copyright 2015 gRPC authors.
11   #
12   # Licensed under the Apache License, Version 2.0 (the "License");
13   # you may not use this file except in compliance with the License.
14   # You may obtain a copy of the License at
15   #
16   #     http://www.apache.org/licenses/LICENSE-2.0
17   #
18   # Unless required by applicable law or agreed to in writing, software
19   # distributed under the License is distributed on an "AS IS" BASIS,
20   # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21   # See the License for the specific language governing permissions and
22   # limitations under the License.
23   <%!
24     import re
25     import os
26
27     proto_re = re.compile('(.*)\\.proto')
28
29     def proto_to_cc(filename):
30       m = proto_re.match(filename)
31       if not m:
32         return filename
33       return '$(GENDIR)/' + m.group(1) + '.pb.cc $(GENDIR)/' + m.group(1) + '.grpc.pb.cc'
34
35     sources_that_need_openssl = set()
36     sources_that_don_t_need_openssl = set()
37
38     # warnings we'd like, but that dont exist in all compilers
39     PREFERRED_WARNINGS=['shadow', 'extra-semi']
40     CHECK_WARNINGS=PREFERRED_WARNINGS + ['no-shift-negative-value', 'no-unused-but-set-variable', 'no-maybe-uninitialized']
41
42     def warning_var(fmt, warning):
43       return fmt % warning.replace('-', '_').replace('+', 'X').upper()
44
45     def neg_warning(warning):
46       if warning[0:3] == 'no-':
47         return warning[3:]
48       else:
49         return 'no-' + warning
50
51     lang_to_var = {
52       'c': 'CORE',
53       'c++': 'CPP',
54       'csharp': 'CSHARP'
55     }
56   %>
57
58
59   comma := ,
60
61
62   # Basic platform detection
63   HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
64   SYSTEM ?= $(HOST_SYSTEM)
65   ifeq ($(SYSTEM),MSYS)
66   SYSTEM = MINGW32
67   endif
68   ifeq ($(SYSTEM),MINGW64)
69   SYSTEM = MINGW32
70   endif
71
72
73   MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
74   ifndef BUILDDIR
75   BUILDDIR_ABSOLUTE = $(patsubst %/,%,$(dir $(MAKEFILE_PATH)))
76   else
77   BUILDDIR_ABSOLUTE = $(abspath $(BUILDDIR))
78   endif
79
80   HAS_GCC = $(shell which gcc > /dev/null 2> /dev/null && echo true || echo false)
81   HAS_CC = $(shell which cc > /dev/null 2> /dev/null && echo true || echo false)
82   HAS_CLANG = $(shell which clang > /dev/null 2> /dev/null && echo true || echo false)
83
84   ifeq ($(HAS_CC),true)
85   DEFAULT_CC = cc
86   DEFAULT_CXX = c++
87   else
88   ifeq ($(HAS_GCC),true)
89   DEFAULT_CC = gcc
90   DEFAULT_CXX = g++
91   else
92   ifeq ($(HAS_CLANG),true)
93   DEFAULT_CC = clang
94   DEFAULT_CXX = clang++
95   else
96   DEFAULT_CC = no_c_compiler
97   DEFAULT_CXX = no_c++_compiler
98   endif
99   endif
100   endif
101
102
103   BINDIR = $(BUILDDIR_ABSOLUTE)/bins
104   OBJDIR = $(BUILDDIR_ABSOLUTE)/objs
105   LIBDIR = $(BUILDDIR_ABSOLUTE)/libs
106   GENDIR = $(BUILDDIR_ABSOLUTE)/gens
107
108   # Configurations
109
110   % for name, args in configs.iteritems():
111   VALID_CONFIG_${name} = 1
112   %  if args.get('compile_the_world', False):
113   REQUIRE_CUSTOM_LIBRARIES_${name} = 1
114   %  endif
115   %  for tool, default in [('CC', 'CC'), ('CXX', 'CXX'), ('LD', 'CC'), ('LDXX', 'CXX')]:
116   ${tool}_${name} = ${args.get(tool, '$(DEFAULT_%s)' % default)}
117   %  endfor
118   %  for arg in ['CFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'LDFLAGS', 'DEFINES']:
119   %   if args.get(arg, None) is not None:
120   ${arg}_${name} = ${args.get(arg)}
121   %   endif
122   %  endfor
123
124   % endfor
125
126
127   # General settings.
128   # You may want to change these depending on your system.
129
130   prefix ?= /usr/local
131
132   PROTOC ?= protoc
133   DTRACE ?= dtrace
134   CONFIG ?= opt
135   # Doing X ?= Y is the same as:
136   # ifeq ($(origin X), undefined)
137   #  X = Y
138   # endif
139   # but some variables, such as CC, CXX, LD or AR, have defaults.
140   # So instead of using ?= on them, we need to check their origin.
141   # See:
142   #  https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
143   #  https://www.gnu.org/software/make/manual/html_node/Flavors.html#index-_003f_003d
144   #  https://www.gnu.org/software/make/manual/html_node/Origin-Function.html
145   ifeq ($(origin CC), default)
146   CC = $(CC_$(CONFIG))
147   endif
148   ifeq ($(origin CXX), default)
149   CXX = $(CXX_$(CONFIG))
150   endif
151   ifeq ($(origin LD), default)
152   LD = $(LD_$(CONFIG))
153   endif
154   LDXX ?= $(LDXX_$(CONFIG))
155   ifeq ($(SYSTEM),Linux)
156   ifeq ($(origin AR), default)
157   AR = ar rcs
158   endif
159   STRIP ?= strip --strip-unneeded
160   else
161   ifeq ($(SYSTEM),Darwin)
162   ifeq ($(origin AR), default)
163   AR = libtool -no_warning_for_no_symbols -o
164   endif
165   STRIP ?= strip -x
166   else
167   ifeq ($(SYSTEM),MINGW32)
168   ifeq ($(origin AR), default)
169   AR = ar rcs
170   endif
171   STRIP ?= strip --strip-unneeded
172   else
173   ifeq ($(origin AR), default)
174   AR = ar rcs
175   endif
176   STRIP ?= strip
177   endif
178   endif
179   endif
180   INSTALL ?= install
181   RM ?= rm -f
182   PKG_CONFIG ?= pkg-config
183
184   ifndef VALID_CONFIG_$(CONFIG)
185   $(error Invalid CONFIG value '$(CONFIG)')
186   endif
187
188   ifeq ($(SYSTEM),Linux)
189   TMPOUT = /dev/null
190   else
191   TMPOUT = `mktemp /tmp/test-out-XXXXXX`
192   endif
193
194   CHECK_NO_CXX14_COMPAT_WORKS_CMD = $(CC) -std=c++11 -Werror -Wno-c++14-compat -o $(TMPOUT) -c test/build/no-c++14-compat.cc
195   HAS_WORKING_NO_CXX14_COMPAT = $(shell $(CHECK_NO_CXX14_COMPAT_WORKS_CMD) 2> /dev/null && echo true || echo false)
196   ifeq ($(HAS_WORKING_NO_CXX14_COMPAT),true)
197   W_NO_CXX14_COMPAT=-Wno-c++14-compat
198   endif
199
200   %for warning in CHECK_WARNINGS:
201   ${warning_var('CHECK_%s_WORKS_CMD', warning)} = $(CC) -std=c99 -Werror -W${warning} -o $(TMPOUT) -c test/build/${warning}.c
202   ${warning_var('HAS_WORKING_%s', warning)} = $(shell $(${warning_var('CHECK_%s_WORKS_CMD', warning)}) 2> /dev/null && echo true || echo false)
203   ifeq ($(${warning_var('HAS_WORKING_%s', warning)}),true)
204   ${warning_var('W_%s', warning)}=-W${warning}
205   ${warning_var('NO_W_%s', warning)}=-W${neg_warning(warning)}
206   endif
207   %endfor
208
209   # The HOST compiler settings are used to compile the protoc plugins.
210   # In most cases, you won't have to change anything, but if you are
211   # cross-compiling, you can override these variables from GNU make's
212   # command line: make CC=cross-gcc HOST_CC=gcc
213
214   HOST_CC ?= $(CC)
215   HOST_CXX ?= $(CXX)
216   HOST_LD ?= $(LD)
217   HOST_LDXX ?= $(LDXX)
218
219   CFLAGS += -std=c99 -Wsign-conversion -Wconversion ${' '.join(warning_var('$(W_%s)', warning) for warning in PREFERRED_WARNINGS)}
220   CXXFLAGS += -std=c++11
221   ifeq ($(SYSTEM),Darwin)
222   CXXFLAGS += -stdlib=libc++
223   endif
224   % for arg in ['CFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'COREFLAGS', 'LDFLAGS', 'DEFINES']:
225   %  if defaults.get('global', []).get(arg, None) is not None:
226   ${arg} += ${defaults.get('global').get(arg)}
227   %  endif
228   % endfor
229
230   CPPFLAGS += $(CPPFLAGS_$(CONFIG))
231   CFLAGS += $(CFLAGS_$(CONFIG))
232   CXXFLAGS += $(CXXFLAGS_$(CONFIG))
233   DEFINES += $(DEFINES_$(CONFIG)) INSTALL_PREFIX=\"$(prefix)\"
234   LDFLAGS += $(LDFLAGS_$(CONFIG))
235
236   ifneq ($(SYSTEM),MINGW32)
237   PIC_CPPFLAGS = -fPIC
238   CPPFLAGS += -fPIC
239   LDFLAGS += -fPIC
240   endif
241
242   INCLUDES = . include $(GENDIR)
243   LDFLAGS += -Llibs/$(CONFIG)
244
245   ifeq ($(SYSTEM),Darwin)
246   ifneq ($(wildcard /usr/local/ssl/include),)
247   INCLUDES += /usr/local/ssl/include
248   endif
249   ifneq ($(wildcard /opt/local/include),)
250   INCLUDES += /opt/local/include
251   endif
252   ifneq ($(wildcard /usr/local/include),)
253   INCLUDES += /usr/local/include
254   endif
255   LIBS = m z
256   ifneq ($(wildcard /usr/local/ssl/lib),)
257   LDFLAGS += -L/usr/local/ssl/lib
258   endif
259   ifneq ($(wildcard /opt/local/lib),)
260   LDFLAGS += -L/opt/local/lib
261   endif
262   ifneq ($(wildcard /usr/local/lib),)
263   LDFLAGS += -L/usr/local/lib
264   endif
265   endif
266
267   ifeq ($(SYSTEM),Linux)
268   LIBS = dl rt m pthread
269   LDFLAGS += -pthread
270   endif
271
272   ifeq ($(SYSTEM),MINGW32)
273   LIBS = m pthread ws2_32
274   LDFLAGS += -pthread
275   endif
276
277   # If we are installing into a non-default prefix, both
278   # the libraries we build, and the apps users build,
279   # need to know how to find the libraries they depend on.
280   # There is much gnashing of teeth about this subject.
281   # It's tricky to do that without editing images during install,
282   # as you don't want tests during build to find previously installed and
283   # now stale libraries, etc.
284   ifeq ($(SYSTEM),Linux)
285   ifneq ($(prefix),/usr)
286   # Linux best practice for rpath on installed files is probably:
287   # 1) .pc file provides -Wl,-rpath,$(prefix)/lib
288   # 2) binaries we install into $(prefix)/bin use -Wl,-rpath,$ORIGIN/../lib
289   # 3) libraries we install into $(prefix)/lib use -Wl,-rpath,$ORIGIN
290   # cf. https://www.akkadia.org/drepper/dsohowto.pdf
291   # Doing all of that right is hard, but using -Wl,-rpath,$ORIGIN is always
292   # safe, and solves problems seen in the wild.  Note that $ORIGIN
293   # is a literal string interpreted much later by ld.so.  Escape it
294   # here with a dollar sign so Make doesn't expand $O.
295   LDFLAGS += '-Wl,-rpath,$$ORIGIN'
296   endif
297   endif
298
299   #
300   # The steps for cross-compiling are as follows:
301   # First, clone and make install of grpc using the native compilers for the host.
302   # Also, install protoc (e.g., from a package like apt-get)
303   # Then clone a fresh grpc for the actual cross-compiled build
304   # Set the environment variable GRPC_CROSS_COMPILE to true
305   # Set CC, CXX, LD, LDXX, AR, and STRIP to the cross-compiling binaries
306   # Also set PROTOBUF_CONFIG_OPTS to indicate cross-compilation to protobuf (e.g.,
307   #  PROTOBUF_CONFIG_OPTS="--host=arm-linux --with-protoc=/usr/local/bin/protoc" )
308   # Set HAS_PKG_CONFIG=false
309   # To build tests, go to third_party/gflags and follow its ccmake instructions
310   # Make sure that you enable building shared libraries and set your prefix to
311   # something useful like /usr/local/cross
312   # You will also need to set GRPC_CROSS_LDOPTS and GRPC_CROSS_AROPTS to hold
313   # additional required arguments for LD and AR (examples below)
314   # Then you can do a make from the cross-compiling fresh clone!
315   #
316   ifeq ($(GRPC_CROSS_COMPILE),true)
317   LDFLAGS += $(GRPC_CROSS_LDOPTS) # e.g. -L/usr/local/lib -L/usr/local/cross/lib
318   AROPTS = $(GRPC_CROSS_AROPTS) # e.g., rc --target=elf32-little
319   USE_BUILT_PROTOC = false
320   endif
321
322   GTEST_LIB = -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googletest third_party/googletest/googletest/src/gtest-all.cc -Ithird_party/googletest/googlemock/include -Ithird_party/googletest/googlemock third_party/googletest/googlemock/src/gmock-all.cc
323   GTEST_LIB += -lgflags
324   ifeq ($(V),1)
325   E = @:
326   Q =
327   else
328   E = @echo
329   Q = @
330   endif
331
332   CORE_VERSION = ${settings.core_version}
333   CPP_VERSION = ${settings.cpp_version}
334   CSHARP_VERSION = ${settings.csharp_version}
335
336   CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
337   CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
338
339   LDFLAGS += $(ARCH_FLAGS)
340   LDLIBS += $(addprefix -l, $(LIBS))
341   LDLIBSXX += $(addprefix -l, $(LIBSXX))
342
343
344   % for arg in ['CFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'LDFLAGS', 'DEFINES', 'LDLIBS']:
345   ${arg} += $(EXTRA_${arg})
346   % endfor
347
348   HOST_CPPFLAGS = $(CPPFLAGS)
349   HOST_CFLAGS = $(CFLAGS)
350   HOST_CXXFLAGS = $(CXXFLAGS)
351   HOST_LDFLAGS = $(LDFLAGS)
352   HOST_LDLIBS = $(LDLIBS)
353
354   # These are automatically computed variables.
355   # There shouldn't be any need to change anything from now on.
356
357   -include cache.mk
358
359   CACHE_MK =
360
361   HAS_PKG_CONFIG ?= $(shell command -v $(PKG_CONFIG) >/dev/null 2>&1 && echo true || echo false)
362
363   ifeq ($(HAS_PKG_CONFIG), true)
364   CACHE_MK += HAS_PKG_CONFIG = true,
365   endif
366
367   CORE_PC_TEMPLATE = prefix=$(prefix),\
368   exec_prefix=${'\$${prefix}'},\
369   includedir=${'\$${prefix}'}/include,\
370   libdir=${'\$${exec_prefix}'}/lib,\
371   ,\
372   Name: $(PC_NAME),\
373   Description: $(PC_DESCRIPTION),\
374   Version: $(CORE_VERSION),\
375   Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\
376   Requires.private: $(PC_REQUIRES_PRIVATE),\
377   Libs: -L${'\$${libdir}'} $(PC_LIB),\
378   Libs.private: $(PC_LIBS_PRIVATE)
379
380   CPP_PC_TEMPLATE = prefix=$(prefix),\
381   exec_prefix=${'\$${prefix}'},\
382   includedir=${'\$${prefix}'}/include,\
383   libdir=${'\$${exec_prefix}'}/lib,\
384   ,\
385   Name: $(PC_NAME),\
386   Description: $(PC_DESCRIPTION),\
387   Version: $(CPP_VERSION),\
388   Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\
389   Requires.private: $(PC_REQUIRES_PRIVATE),\
390   Libs: -L${'\$${libdir}'} $(PC_LIB),\
391   Libs.private: $(PC_LIBS_PRIVATE)
392
393   CSHARP_PC_TEMPLATE = prefix=$(prefix),\
394   exec_prefix=${'\$${prefix}'},\
395   includedir=${'\$${prefix}'}/include,\
396   libdir=${'\$${exec_prefix}'}/lib,\
397   ,\
398   Name: $(PC_NAME),\
399   Description: $(PC_DESCRIPTION),\
400   Version: $(CSHARP_VERSION),\
401   Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\
402   Requires.private: $(PC_REQUIRES_PRIVATE),\
403   Libs: -L${'\$${libdir}'} $(PC_LIB),\
404   Libs.private: $(PC_LIBS_PRIVATE)
405
406   ifeq ($(SYSTEM),MINGW32)
407   EXECUTABLE_SUFFIX = .exe
408   SHARED_EXT_CORE = dll
409   SHARED_EXT_CPP = dll
410   SHARED_EXT_CSHARP = dll
411   SHARED_PREFIX =
412   SHARED_VERSION_CORE = -${settings.core_version.major}
413   SHARED_VERSION_CPP = -${settings.cpp_version.major}
414   SHARED_VERSION_CSHARP = -${settings.csharp_version.major}
415   else ifeq ($(SYSTEM),Darwin)
416   EXECUTABLE_SUFFIX =
417   SHARED_EXT_CORE = dylib
418   SHARED_EXT_CPP = dylib
419   SHARED_EXT_CSHARP = dylib
420   SHARED_PREFIX = lib
421   SHARED_VERSION_CORE =
422   SHARED_VERSION_CPP =
423   SHARED_VERSION_CSHARP =
424   else
425   EXECUTABLE_SUFFIX =
426   SHARED_EXT_CORE = so.$(CORE_VERSION)
427   SHARED_EXT_CPP = so.$(CPP_VERSION)
428   SHARED_EXT_CSHARP = so.$(CSHARP_VERSION)
429   SHARED_PREFIX = lib
430   SHARED_VERSION_CORE =
431   SHARED_VERSION_CPP =
432   SHARED_VERSION_CSHARP =
433   endif
434
435   ifeq ($(wildcard .git),)
436   IS_GIT_FOLDER = false
437   else
438   IS_GIT_FOLDER = true
439   endif
440
441   ifeq ($(HAS_PKG_CONFIG),true)
442   OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl
443   ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib
444   PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.5.0 protobuf
445   CARES_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.11.0 libcares
446   else # HAS_PKG_CONFIG
447
448   ifeq ($(SYSTEM),MINGW32)
449   OPENSSL_LIBS = ssl32 eay32
450   else
451   OPENSSL_LIBS = ssl crypto
452   endif
453
454   OPENSSL_ALPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS)
455   BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) ${defaults.boringssl.CPPFLAGS} $(CFLAGS) ${defaults.boringssl.CFLAGS} -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS)
456   ZLIB_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS)
457   PROTOBUF_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS)
458   CARES_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/c-ares.c -lcares $(LDFLAGS)
459
460   endif # HAS_PKG_CONFIG
461
462   PERFTOOLS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/perftools.c -lprofiler $(LDFLAGS)
463
464   PROTOC_CHECK_CMD = which protoc > /dev/null
465   PROTOC_CHECK_VERSION_CMD = protoc --version | grep -q libprotoc.3
466   DTRACE_CHECK_CMD = which dtrace > /dev/null
467   SYSTEMTAP_HEADERS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/systemtap.c $(LDFLAGS)
468
469   ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG)
470   HAS_SYSTEM_PERFTOOLS ?= $(shell $(PERFTOOLS_CHECK_CMD) 2> /dev/null && echo true || echo false)
471   ifeq ($(HAS_SYSTEM_PERFTOOLS),true)
472   DEFINES += GRPC_HAVE_PERFTOOLS
473   LIBS += profiler
474   CACHE_MK += HAS_SYSTEM_PERFTOOLS = true,
475   endif
476   endif
477
478   HAS_SYSTEM_PROTOBUF_VERIFY = $(shell $(PROTOBUF_CHECK_CMD) 2> /dev/null && echo true || echo false)
479   ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG)
480   HAS_SYSTEM_OPENSSL_ALPN ?= $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false)
481   ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true)
482   CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = true,
483   endif
484   HAS_SYSTEM_ZLIB ?= $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false)
485   ifeq ($(HAS_SYSTEM_ZLIB),true)
486   CACHE_MK += HAS_SYSTEM_ZLIB = true,
487   endif
488   HAS_SYSTEM_PROTOBUF ?= $(HAS_SYSTEM_PROTOBUF_VERIFY)
489   ifeq ($(HAS_SYSTEM_PROTOBUF),true)
490   CACHE_MK += HAS_SYSTEM_PROTOBUF = true,
491   endif
492   HAS_SYSTEM_CARES ?=  $(shell $(CARES_CHECK_CMD) 2> /dev/null && echo true || echo false)
493   ifeq ($(HAS_SYSTEM_CARES),true)
494   CACHE_MK += HAS_SYSTEM_CARES = true,
495   endif
496   else
497   # override system libraries if the config requires a custom compiled library
498   HAS_SYSTEM_OPENSSL_ALPN = false
499   HAS_SYSTEM_ZLIB = false
500   HAS_SYSTEM_PROTOBUF = false
501   HAS_SYSTEM_CARES = false
502   endif
503
504   HAS_PROTOC ?= $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false)
505   ifeq ($(HAS_PROTOC),true)
506   CACHE_MK += HAS_PROTOC = true,
507   HAS_VALID_PROTOC ?= $(shell $(PROTOC_CHECK_VERSION_CMD) 2> /dev/null && echo true || echo false)
508   ifeq ($(HAS_VALID_PROTOC),true)
509   CACHE_MK += HAS_VALID_PROTOC = true,
510   endif
511   else
512   HAS_VALID_PROTOC = false
513   endif
514
515   # Check for Systemtap (https://sourceware.org/systemtap/), first by making sure <sys/sdt.h> is present
516   # in the system and secondly by checking for the "dtrace" binary (on Linux, this is part of the Systemtap
517   # distribution. It's part of the base system on BSD/Solaris machines).
518   ifndef HAS_SYSTEMTAP
519   HAS_SYSTEMTAP_HEADERS = $(shell $(SYSTEMTAP_HEADERS_CHECK_CMD) 2> /dev/null && echo true || echo false)
520   HAS_DTRACE = $(shell $(DTRACE_CHECK_CMD) 2> /dev/null && echo true || echo false)
521   HAS_SYSTEMTAP = false
522   ifeq ($(HAS_SYSTEMTAP_HEADERS),true)
523   ifeq ($(HAS_DTRACE),true)
524   HAS_SYSTEMTAP = true
525   endif
526   endif
527   endif
528
529   ifeq ($(HAS_SYSTEMTAP),true)
530   CACHE_MK += HAS_SYSTEMTAP = true,
531   endif
532
533   # Note that for testing purposes, one can do:
534   #   make HAS_EMBEDDED_OPENSSL_ALPN=false
535   # to emulate the fact we do not have OpenSSL in the third_party folder.
536   ifneq ($(wildcard third_party/${openssl_fallback.extraction_dir}/libssl.a),)
537   HAS_EMBEDDED_OPENSSL_ALPN = third_party/${openssl_fallback.extraction_dir}
538   else ifeq ($(wildcard third_party/boringssl/include/openssl/ssl.h),)
539   HAS_EMBEDDED_OPENSSL_ALPN = false
540   else
541   CAN_COMPILE_EMBEDDED_OPENSSL ?= $(shell $(BORINGSSL_COMPILE_CHECK_CMD) 2> /dev/null && echo true || echo false)
542   HAS_EMBEDDED_OPENSSL_ALPN = $(CAN_COMPILE_EMBEDDED_OPENSSL)
543   endif
544
545   ifeq ($(wildcard third_party/zlib/zlib.h),)
546   HAS_EMBEDDED_ZLIB = false
547   else
548   HAS_EMBEDDED_ZLIB = true
549   endif
550
551   ifeq ($(wildcard third_party/protobuf/src/google/protobuf/descriptor.pb.h),)
552   HAS_EMBEDDED_PROTOBUF = false
553   ifneq ($(HAS_VALID_PROTOC),true)
554   NO_PROTOC = true
555   endif
556   else
557   HAS_EMBEDDED_PROTOBUF = true
558   endif
559
560   ifeq ($(wildcard third_party/cares/cares/ares.h),)
561   HAS_EMBEDDED_CARES = false
562   else
563   HAS_EMBEDDED_CARES = true
564   endif
565
566   PC_REQUIRES_GRPC =
567   PC_LIBS_GRPC =
568
569   ifeq ($(HAS_SYSTEM_ZLIB),false)
570   ifeq ($(HAS_EMBEDDED_ZLIB), true)
571   EMBED_ZLIB ?= true
572   else
573   DEP_MISSING += zlib
574   EMBED_ZLIB ?= broken
575   endif
576   else
577   EMBED_ZLIB ?= false
578   endif
579
580   ifeq ($(EMBED_ZLIB),true)
581   ZLIB_DEP = $(LIBDIR)/$(CONFIG)/libz.a
582   ZLIB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libz.a
583   ZLIB_MERGE_OBJS = $(LIBZ_OBJS)
584   CPPFLAGS += -Ithird_party/zlib
585   else
586   ifeq ($(HAS_PKG_CONFIG),true)
587   CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib)
588   LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib)
589   LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l zlib))
590   PC_REQUIRES_GRPC += zlib
591   else
592   PC_LIBS_GRPC += -lz
593   LIBS += z
594   endif
595   endif
596
597   CARES_PKG_CONFIG = false
598
599   ifeq ($(HAS_SYSTEM_CARES),false)
600   ifeq ($(HAS_EMBEDDED_CARES), true)
601   EMBED_CARES ?= true
602   else
603   DEP_MISSING += cares
604   EMBED_CARES ?= broken
605   endif
606   else
607   EMBED_CARES ?= false
608   endif
609
610   ADDRESS_SORTING_DEP = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a
611   ADDRESS_SORTING_MERGE_OBJS = $(LIBADDRESS_SORTING_OBJS)
612   ADDRESS_SORTING_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a
613   CPPFLAGS := -Ithird_party/address_sorting/include $(CPPFLAGS)
614
615   ifeq ($(EMBED_CARES),true)
616   CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a
617   CARES_MERGE_OBJS = $(LIBARES_OBJS)
618   CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a
619   CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS)
620   else
621   ifeq ($(HAS_PKG_CONFIG),true)
622   PC_REQUIRES_GRPC += libcares
623   CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libcares)
624   LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libcares)
625   LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l libcares))
626   else
627   PC_LIBS_GRPC += -lcares
628   LIBS += cares
629   endif
630   endif
631
632   OPENSSL_PKG_CONFIG = false
633
634   PC_REQUIRES_SECURE =
635   PC_LIBS_SECURE =
636
637   ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true)
638   EMBED_OPENSSL ?= false
639   NO_SECURE ?= false
640   else # HAS_SYSTEM_OPENSSL_ALPN=false
641   ifneq ($(HAS_EMBEDDED_OPENSSL_ALPN),false)
642   EMBED_OPENSSL ?= $(HAS_EMBEDDED_OPENSSL_ALPN)
643   NO_SECURE ?= false
644   else # HAS_EMBEDDED_OPENSSL_ALPN=false
645   NO_SECURE ?= true
646   endif # HAS_EMBEDDED_OPENSSL_ALPN
647   endif # HAS_SYSTEM_OPENSSL_ALPN
648
649   OPENSSL_DEP :=
650   OPENSSL_MERGE_LIBS :=
651   ifeq ($(NO_SECURE),false)
652   ifeq ($(EMBED_OPENSSL),true)
653   OPENSSL_DEP += $(LIBDIR)/$(CONFIG)/libboringssl.a
654   OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/libboringssl.a
655   OPENSSL_MERGE_OBJS += $(LIBBORINGSSL_OBJS)
656   # need to prefix these to ensure overriding system libraries
657   CPPFLAGS := -Ithird_party/boringssl/include $(CPPFLAGS)
658   else ifneq ($(EMBED_OPENSSL),false)
659   OPENSSL_DEP += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a
660   OPENSSL_MERGE_LIBS += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a
661   OPENSSL_MERGE_OBJS += $(wildcard $(EMBED_OPENSSL)/grpc_obj/*.o)
662   # need to prefix these to ensure overriding system libraries
663   CPPFLAGS := -I$(EMBED_OPENSSL)/include $(CPPFLAGS)
664   else # EMBED_OPENSSL=false
665   ifeq ($(HAS_PKG_CONFIG),true)
666   OPENSSL_PKG_CONFIG = true
667   PC_REQUIRES_SECURE = openssl
668   CPPFLAGS := $(shell $(PKG_CONFIG) --cflags openssl) $(CPPFLAGS)
669   LDFLAGS_OPENSSL_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L openssl)
670   ifeq ($(SYSTEM),Linux)
671   ifneq ($(LDFLAGS_OPENSSL_PKG_CONFIG),)
672   LDFLAGS_OPENSSL_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L openssl | sed s/L/Wl,-rpath,/)
673   endif # LDFLAGS_OPENSSL_PKG_CONFIG=''
674   endif # System=Linux
675   LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS)
676   else # HAS_PKG_CONFIG=false
677   LIBS_SECURE = $(OPENSSL_LIBS)
678   endif # HAS_PKG_CONFIG
679   ifeq ($(DISABLE_ALPN),true)
680   CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0
681   LIBS_SECURE = $(OPENSSL_LIBS)
682   endif # DISABLE_ALPN
683   PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE))
684   endif # EMBED_OPENSSL
685   endif # NO_SECURE
686
687   ifeq ($(OPENSSL_PKG_CONFIG),true)
688   LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl)
689   else
690   LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE))
691   endif
692
693   # gpr .pc file
694   PC_NAME = gpr
695   PC_DESCRIPTION = gRPC platform support library
696   PC_CFLAGS =
697   PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GPR)
698   PC_LIBS_PRIVATE = $(PC_LIBS_GPR)
699   PC_LIB = -lgpr
700   GPR_PC_FILE := $(CORE_PC_TEMPLATE)
701
702   # grpc .pc file
703   PC_NAME = gRPC
704   PC_DESCRIPTION = high performance general RPC framework
705   PC_CFLAGS =
706   PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE)
707   PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE)
708   PC_LIB = -lgrpc
709   GRPC_PC_FILE := $(CORE_PC_TEMPLATE)
710
711   # grpc_unsecure .pc file
712   PC_NAME = gRPC unsecure
713   PC_DESCRIPTION = high performance general RPC framework without SSL
714   PC_CFLAGS =
715   PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC)
716   PC_LIBS_PRIVATE = $(PC_LIBS_GRPC)
717   PC_LIB = -lgrpc_unsecure
718   GRPC_UNSECURE_PC_FILE := $(CORE_PC_TEMPLATE)
719
720   PROTOBUF_PKG_CONFIG = false
721
722   PC_REQUIRES_GRPCXX =
723   PC_LIBS_GRPCXX =
724
725   CPPFLAGS := -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googlemock/include $(CPPFLAGS)
726
727   PROTOC_PLUGINS_ALL =\
728   % for tgt in targets:
729   % if tgt.build == 'protoc':
730    $(BINDIR)/$(CONFIG)/${tgt.name}\
731   % endif
732   % endfor
733
734   PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG)
735
736   ifeq ($(HAS_SYSTEM_PROTOBUF),true)
737   ifeq ($(HAS_PKG_CONFIG),true)
738   PROTOBUF_PKG_CONFIG = true
739   PC_REQUIRES_GRPCXX = protobuf
740   CPPFLAGS := $(CPPFLAGS) $(shell $(PKG_CONFIG) --cflags protobuf)
741   LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L protobuf)
742   ifeq ($(SYSTEM),Linux)
743   ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),)
744   LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L protobuf | sed s/L/Wl,-rpath,/)
745   endif
746   endif
747   else
748   PC_LIBS_GRPCXX = -lprotobuf
749   endif
750   PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL)
751   else
752   ifeq ($(HAS_EMBEDDED_PROTOBUF),true)
753   PROTOBUF_DEP = $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a
754   CPPFLAGS := -Ithird_party/protobuf/src $(CPPFLAGS)
755   LDFLAGS := -L$(LIBDIR)/$(CONFIG)/protobuf $(LDFLAGS)
756   ifneq ($(USE_BUILT_PROTOC),false)
757   PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc
758   PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL)
759   else
760   PROTOC_PLUGINS =
761   PROTOC_PLUGINS_DIR = $(prefix)/bin
762   endif
763   else
764   NO_PROTOBUF = true
765   endif
766   endif
767
768   LIBS_PROTOBUF = protobuf
769   LIBS_PROTOC = protoc protobuf
770
771   HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC))
772
773   ifeq ($(PROTOBUF_PKG_CONFIG),true)
774   LDLIBS_PROTOBUF += $(shell $(PKG_CONFIG) --libs-only-l protobuf)
775   else
776   LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF))
777   endif
778
779   # grpc++ .pc file
780   PC_NAME = gRPC++
781   PC_DESCRIPTION = C++ wrapper for gRPC
782   PC_CFLAGS =
783   PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX)
784   PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX)
785   PC_LIB = -lgrpc++
786   GRPCXX_PC_FILE := $(CPP_PC_TEMPLATE)
787
788   # grpc++_unsecure .pc file
789   PC_NAME = gRPC++ unsecure
790   PC_DESCRIPTION = C++ wrapper for gRPC without SSL
791   PC_CFLAGS =
792   PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX)
793   PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX)
794   PC_LIB = -lgrpc++_unsecure
795   GRPCXX_UNSECURE_PC_FILE := $(CPP_PC_TEMPLATE)
796
797   ifeq ($(MAKECMDGOALS),clean)
798   NO_DEPS = true
799   endif
800
801   .SECONDARY = %.pb.h %.pb.cc
802
803   ifeq ($(DEP_MISSING),)
804   all: static shared plugins\
805   % for tgt in targets:
806   % if tgt.build == 'all':
807    $(BINDIR)/$(CONFIG)/${tgt.name}\
808   % endif
809   % endfor
810
811   dep_error:
812         @echo "You shouldn't see this message - all of your dependencies are correct."
813   else
814   all: dep_error git_update stop
815
816   dep_error:
817         @echo
818         @echo "DEPENDENCY ERROR"
819         @echo
820         @echo "You are missing system dependencies that are essential to build grpc,"
821         @echo "and the third_party directory doesn't have them:"
822         @echo
823         @echo "  $(DEP_MISSING)"
824         @echo
825         @echo "Installing the development packages for your system will solve"
826         @echo "this issue. Please consult INSTALL to get more information."
827         @echo
828         @echo "If you need information about why these tests failed, run:"
829         @echo
830         @echo "  make run_dep_checks"
831         @echo
832   endif
833
834   git_update:
835   ifeq ($(IS_GIT_FOLDER),true)
836         @echo "Additionally, since you are in a git clone, you can download the"
837         @echo "missing dependencies in third_party by running the following command:"
838         @echo
839         @echo "  git submodule update --init"
840         @echo
841   endif
842
843   openssl_dep_error: openssl_dep_message git_update stop
844
845   protobuf_dep_error: protobuf_dep_message git_update stop
846
847   protoc_dep_error: protoc_dep_message git_update stop
848
849   openssl_dep_message:
850         @echo
851         @echo "DEPENDENCY ERROR"
852         @echo
853         @echo "The target you are trying to run requires an OpenSSL implementation."
854         @echo "Your system doesn't have one, and either the third_party directory"
855         @echo "doesn't have it, or your compiler can't build BoringSSL."
856         @echo
857         @echo "Please consult INSTALL to get more information."
858         @echo
859         @echo "If you need information about why these tests failed, run:"
860         @echo
861         @echo "  make run_dep_checks"
862         @echo
863
864   protobuf_dep_message:
865         @echo
866         @echo "DEPENDENCY ERROR"
867         @echo
868         @echo "The target you are trying to run requires protobuf 3.5.0+"
869         @echo "Your system doesn't have it, and neither does the third_party directory."
870         @echo
871         @echo "Please consult INSTALL to get more information."
872         @echo
873         @echo "If you need information about why these tests failed, run:"
874         @echo
875         @echo "  make run_dep_checks"
876         @echo
877
878   protoc_dep_message:
879         @echo
880         @echo "DEPENDENCY ERROR"
881         @echo
882         @echo "The target you are trying to run requires protobuf-compiler 3.5.0+"
883         @echo "Your system doesn't have it, and neither does the third_party directory."
884         @echo
885         @echo "Please consult INSTALL to get more information."
886         @echo
887         @echo "If you need information about why these tests failed, run:"
888         @echo
889         @echo "  make run_dep_checks"
890         @echo
891
892   systemtap_dep_error:
893         @echo
894         @echo "DEPENDENCY ERROR"
895         @echo
896         @echo "Under the '$(CONFIG)' configutation, the target you are trying "
897         @echo "to build requires systemtap 2.7+ (on Linux) or dtrace (on other "
898         @echo "platforms such as Solaris and *BSD). "
899         @echo
900         @echo "Please consult INSTALL to get more information."
901         @echo
902
903   stop:
904         @false
905
906   % for tgt in targets:
907   ${tgt.name}: $(BINDIR)/$(CONFIG)/${tgt.name}
908   % endfor
909
910   run_dep_checks:
911         $(OPENSSL_ALPN_CHECK_CMD) || true
912         $(ZLIB_CHECK_CMD) || true
913         $(PERFTOOLS_CHECK_CMD) || true
914         $(PROTOBUF_CHECK_CMD) || true
915         $(PROTOC_CHECK_VERSION_CMD) || true
916         $(CARES_CHECK_CMD) || true
917
918   third_party/protobuf/configure:
919         $(E) "[AUTOGEN] Preparing protobuf"
920         $(Q)(cd third_party/protobuf ; autoreconf -f -i -Wall,no-obsolete)
921
922   $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure
923         $(E) "[MAKE]    Building protobuf"
924         $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/protobuf
925         $(Q)(cd third_party/protobuf ; CC="$(CC)" CXX="$(CXX)" LDFLAGS="$(LDFLAGS_$(CONFIG)) -g $(PROTOBUF_LDFLAGS_EXTRA)" CPPFLAGS="$(PIC_CPPFLAGS) $(CPPFLAGS_$(CONFIG)) -g $(PROTOBUF_CPPFLAGS_EXTRA)" ./configure --disable-shared --enable-static $(PROTOBUF_CONFIG_OPTS))
926         $(Q)$(MAKE) -C third_party/protobuf clean
927         $(Q)$(MAKE) -C third_party/protobuf
928         $(Q)mkdir -p $(BINDIR)/$(CONFIG)/protobuf
929         $(Q)cp third_party/protobuf/src/.libs/libprotoc.a $(LIBDIR)/$(CONFIG)/protobuf
930         $(Q)cp third_party/protobuf/src/.libs/libprotobuf.a $(LIBDIR)/$(CONFIG)/protobuf
931         $(Q)cp third_party/protobuf/src/protoc $(BINDIR)/$(CONFIG)/protobuf
932
933   static: static_c static_cxx
934
935   static_c: pc_c pc_c_unsecure cache.mk \
936   % for lib in libs:
937   % if 'Makefile' in lib.get('build_system', ['Makefile']):
938   % if lib.build == 'all' and lib.language == 'c' and not lib.get('external_deps', None):
939    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
940   % endif
941   % endif
942   % endfor
943
944
945   static_cxx: pc_cxx pc_cxx_unsecure cache.mk \
946   % for lib in libs:
947   % if 'Makefile' in lib.get('build_system', ['Makefile']):
948   % if lib.build == 'all' and lib.language == 'c++':
949    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
950   % endif
951   % endif
952   % endfor
953
954
955   static_csharp: static_c \
956   % for lib in libs:
957   % if 'Makefile' in lib.get('build_system', ['Makefile']):
958   % if lib.build == 'all' and lib.language == 'csharp':
959    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
960   % endif
961   % endif
962   % endfor
963
964
965   shared: shared_c shared_cxx
966
967   shared_c: pc_c pc_c_unsecure cache.mk\
968   % for lib in libs:
969   % if 'Makefile' in lib.get('build_system', ['Makefile']):
970   % if lib.build == 'all' and lib.language == 'c' and not lib.get('external_deps', None):
971    $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)\
972   % endif
973   % endif
974   % endfor
975
976   shared_cxx: pc_cxx pc_cxx_unsecure cache.mk\
977   % for lib in libs:
978   % if 'Makefile' in lib.get('build_system', ['Makefile']):
979   % if lib.build == 'all' and lib.language == 'c++':
980    $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)\
981   % endif
982   % endif
983   % endfor
984
985
986   shared_csharp: shared_c \
987   % for lib in libs:
988   % if 'Makefile' in lib.get('build_system', ['Makefile']):
989   % if lib.build == 'all' and lib.language == 'csharp':
990    $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CSHARP).$(SHARED_EXT_CSHARP)\
991   % endif
992   % endif
993   % endfor
994
995   grpc_csharp_ext: shared_csharp
996
997   plugins: $(PROTOC_PLUGINS)
998
999   privatelibs: privatelibs_c privatelibs_cxx
1000
1001   privatelibs_c: \
1002   % for lib in libs:
1003   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1004   % if lib.build == 'private' and lib.language == 'c' and not lib.get('external_deps', None) and not lib.boringssl:
1005    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
1006   % endif
1007   % endif
1008   % endfor
1009
1010   pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc
1011
1012   pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc
1013
1014   pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc
1015
1016   pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc
1017
1018   ifeq ($(EMBED_OPENSSL),true)
1019   privatelibs_cxx: \
1020   % for lib in libs:
1021   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1022   % if lib.build == 'private' and lib.language == 'c++' and not lib.get('external_deps', None):
1023    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
1024   % endif
1025   % endif
1026   % endfor
1027
1028   else
1029   privatelibs_cxx: \
1030   % for lib in libs:
1031   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1032   % if lib.build == 'private' and lib.language == 'c++' and not lib.get('external_deps', None) and not lib.boringssl:
1033    $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\
1034   % endif
1035   % endif
1036   % endfor
1037
1038   endif
1039
1040
1041   buildtests: buildtests_c buildtests_cxx
1042
1043   buildtests_c: privatelibs_c <%text>\</%text>
1044   % for tgt in targets:
1045   % if tgt.build == 'test' and not tgt.language == 'c++' and not tgt.get('external_deps', None):
1046     $(BINDIR)/$(CONFIG)/${tgt.name} <%text>\</%text>
1047   % endif
1048   % endfor
1049
1050
1051   ifeq ($(EMBED_OPENSSL),true)
1052   buildtests_cxx: privatelibs_cxx <%text>\</%text>
1053   % for tgt in targets:
1054   % if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None):
1055     $(BINDIR)/$(CONFIG)/${tgt.name} <%text>\</%text>
1056   % endif
1057   % endfor
1058
1059   else
1060   buildtests_cxx: privatelibs_cxx <%text>\</%text>
1061   % for tgt in targets:
1062   % if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
1063     $(BINDIR)/$(CONFIG)/${tgt.name} <%text>\</%text>
1064   % endif
1065   % endfor
1066
1067   endif
1068
1069
1070   test: test_c test_cxx
1071
1072   flaky_test: flaky_test_c flaky_test_cxx
1073
1074   test_c: buildtests_c
1075   % for tgt in targets:
1076   % if tgt.build == 'test' and tgt.get('run', True) and not tgt.language == 'c++' and not tgt.get('flaky', False) and not tgt.get('external_deps', None):
1077         $(E) "[RUN]     Testing ${tgt.name}"
1078         $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
1079   % endif
1080   % endfor
1081
1082
1083   flaky_test_c: buildtests_c
1084   % for tgt in targets:
1085   % if tgt.build == 'test' and tgt.get('run', True) and not tgt.language == 'c++' and tgt.get('flaky', False) and not tgt.get('external_deps', None):
1086         $(E) "[RUN]     Testing ${tgt.name}"
1087         $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
1088   % endif
1089   % endfor
1090
1091
1092   test_cxx: buildtests_cxx
1093   % for tgt in targets:
1094   % if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and not tgt.get('flaky', False) and not tgt.get('external_deps', None):
1095         $(E) "[RUN]     Testing ${tgt.name}"
1096         $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
1097   % endif
1098   % endfor
1099
1100
1101   flaky_test_cxx: buildtests_cxx
1102   % for tgt in targets:
1103   % if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and tgt.get('flaky', False) and not tgt.get('external_deps', None):
1104         $(E) "[RUN]     Testing ${tgt.name}"
1105         $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
1106   % endif
1107   % endfor
1108
1109
1110   test_python: static_c
1111         $(E) "[RUN]     Testing python code"
1112         $(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG)
1113
1114
1115   tools: tools_c tools_cxx
1116
1117
1118   tools_c: privatelibs_c\
1119   % for tgt in targets:
1120   % if tgt.build == 'tool' and not tgt.language=='c++':
1121    $(BINDIR)/$(CONFIG)/${tgt.name}\
1122   % endif
1123   % endfor
1124
1125
1126   tools_cxx: privatelibs_cxx\
1127   % for tgt in targets:
1128   % if tgt.build == 'tool' and tgt.language=='c++':
1129    $(BINDIR)/$(CONFIG)/${tgt.name}\
1130   % endif
1131   % endfor
1132
1133
1134   buildbenchmarks: privatelibs\
1135   % for tgt in targets:
1136   % if tgt.build == 'benchmark':
1137    $(BINDIR)/$(CONFIG)/${tgt.name}\
1138   % endif
1139   % endfor
1140
1141
1142   benchmarks: buildbenchmarks
1143
1144   strip: strip-static strip-shared
1145
1146   strip-static: strip-static_c strip-static_cxx
1147
1148   strip-shared: strip-shared_c strip-shared_cxx
1149
1150
1151   # TODO(nnoble): the strip target is stripping in-place, instead
1152   # of copying files in a temporary folder.
1153   # This prevents proper debugging after running make install.
1154
1155   strip-static_c: static_c
1156   ifeq ($(CONFIG),opt)
1157   % for lib in libs:
1158   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1159   % if lib.language == "c":
1160   % if lib.build == "all":
1161   % if not lib.get('external_deps', None):
1162         $(E) "[STRIP]   Stripping lib${lib.name}.a"
1163         $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a
1164   % endif
1165   % endif
1166   % endif
1167   % endif
1168   % endfor
1169   endif
1170
1171   strip-static_cxx: static_cxx
1172   ifeq ($(CONFIG),opt)
1173   % for lib in libs:
1174   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1175   % if lib.language == "c++":
1176   % if lib.build == "all":
1177         $(E) "[STRIP]   Stripping lib${lib.name}.a"
1178         $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a
1179   % endif
1180   % endif
1181   % endif
1182   % endfor
1183   endif
1184
1185   strip-shared_c: shared_c
1186   ifeq ($(CONFIG),opt)
1187   % for lib in libs:
1188   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1189   % if lib.language == "c":
1190   % if lib.build == "all":
1191   % if not lib.get('external_deps', None):
1192         $(E) "[STRIP]   Stripping $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)"
1193         $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)
1194   % endif
1195   % endif
1196   % endif
1197   % endif
1198   % endfor
1199   endif
1200
1201   strip-shared_cxx: shared_cxx
1202   ifeq ($(CONFIG),opt)
1203   % for lib in libs:
1204   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1205   % if lib.language == "c++":
1206   % if lib.build == "all":
1207         $(E) "[STRIP]   Stripping $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)"
1208         $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)
1209   % endif
1210   % endif
1211   % endif
1212   % endfor
1213   endif
1214
1215   strip-shared_csharp: shared_csharp
1216   ifeq ($(CONFIG),opt)
1217   % for lib in libs:
1218   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1219   % if lib.language == "csharp":
1220   % if lib.build == "all":
1221         $(E) "[STRIP]   Stripping $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CSHARP).$(SHARED_EXT_CSHARP)"
1222         $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_CSHARP).$(SHARED_EXT_CSHARP)
1223   % endif
1224   % endif
1225   % endif
1226   % endfor
1227   endif
1228
1229   cache.mk::
1230         $(E) "[MAKE]    Generating $@"
1231         $(Q) echo "$(CACHE_MK)" | tr , '\n' >$@
1232
1233   $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc:
1234         $(E) "[MAKE]    Generating $@"
1235         $(Q) mkdir -p $(@D)
1236         $(Q) echo "$(GPR_PC_FILE)" | tr , '\n' >$@
1237
1238   $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc:
1239         $(E) "[MAKE]    Generating $@"
1240         $(Q) mkdir -p $(@D)
1241         $(Q) echo "$(GRPC_PC_FILE)" | tr , '\n' >$@
1242
1243   $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc:
1244         $(E) "[MAKE]    Generating $@"
1245         $(Q) mkdir -p $(@D)
1246         $(Q) echo "$(GRPC_UNSECURE_PC_FILE)" | tr , '\n' >$@
1247
1248   $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc:
1249         $(E) "[MAKE]    Generating $@"
1250         $(Q) mkdir -p $(@D)
1251         $(Q) echo "$(GRPCXX_PC_FILE)" | tr , '\n' >$@
1252
1253   $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc:
1254         $(E) "[MAKE]    Generating $@"
1255         $(Q) mkdir -p $(@D)
1256         $(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@
1257
1258   % for p in protos:
1259   ifeq ($(NO_PROTOC),true)
1260   $(GENDIR)/${p}.pb.cc: protoc_dep_error
1261   $(GENDIR)/${p}.grpc.pb.cc: protoc_dep_error
1262   else
1263   <%
1264     pluginflags=""
1265   %>
1266   % if p in ["src/proto/grpc/testing/compiler_test", "src/proto/grpc/testing/echo"]:
1267   <%
1268     pluginflags="generate_mock_code=true:"
1269   %>
1270   % endif
1271   $(GENDIR)/${p}.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) ${' '.join('$(GENDIR)/%s.pb.cc' % q for q in proto_deps.get(p, []))}
1272         $(E) "[PROTOC]  Generating protobuf CC file from $<"
1273         $(Q) mkdir -p `dirname $@`
1274         $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
1275
1276   $(GENDIR)/${p}.grpc.pb.cc: ${p}.proto $(GENDIR)/${p}.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) ${' '.join('$(GENDIR)/%s.pb.cc $(GENDIR)/%s.grpc.pb.cc' % (q,q) for q in proto_deps.get(p, []))}
1277         $(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
1278         $(Q) mkdir -p `dirname $@`
1279         $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=${pluginflags}$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
1280   endif
1281
1282   % endfor
1283
1284   ifeq ($(CONFIG),stapprof)
1285   src/core/profiling/stap_timers.c: $(GENDIR)/src/core/profiling/stap_probes.h
1286   ifeq ($(HAS_SYSTEMTAP),true)
1287   $(GENDIR)/src/core/profiling/stap_probes.h: src/core/profiling/stap_probes.d
1288         $(E) "[DTRACE]  Compiling $<"
1289         $(Q) mkdir -p `dirname $@`
1290         $(Q) $(DTRACE) -C -h -s $< -o $@
1291   else
1292   $(GENDIR)/src/core/profiling/stap_probes.h: systemtap_dep_error stop
1293   endif
1294   endif
1295
1296   $(OBJDIR)/$(CONFIG)/%.o : %.c
1297         $(E) "[C]       Compiling $<"
1298         $(Q) mkdir -p `dirname $@`
1299         $(Q) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1300
1301   $(OBJDIR)/$(CONFIG)/%.o : $(GENDIR)/%.pb.cc
1302         $(E) "[CXX]     Compiling $<"
1303         $(Q) mkdir -p `dirname $@`
1304         $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1305
1306   $(OBJDIR)/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc
1307         $(E) "[HOSTCXX] Compiling $<"
1308         $(Q) mkdir -p `dirname $@`
1309         $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1310
1311   $(OBJDIR)/$(CONFIG)/src/core/%.o : src/core/%.cc
1312         $(E) "[CXX]     Compiling $<"
1313         $(Q) mkdir -p `dirname $@`
1314         $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(COREFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1315
1316   $(OBJDIR)/$(CONFIG)/test/core/%.o : test/core/%.cc
1317         $(E) "[CXX]     Compiling $<"
1318         $(Q) mkdir -p `dirname $@`
1319         $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(COREFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1320
1321   $(OBJDIR)/$(CONFIG)/%.o : %.cc
1322         $(E) "[CXX]     Compiling $<"
1323         $(Q) mkdir -p `dirname $@`
1324         $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1325
1326   $(OBJDIR)/$(CONFIG)/%.o : %.cpp
1327         $(E) "[CXX]     Compiling $<"
1328         $(Q) mkdir -p `dirname $@`
1329         $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1330
1331   install: install_c install_cxx install-plugins install-certs
1332
1333   install_c: install-headers_c install-static_c install-shared_c
1334
1335   install_cxx: install-headers_cxx install-static_cxx install-shared_cxx
1336
1337   install_csharp: install-shared_csharp install_c
1338
1339   install_grpc_csharp_ext: install_csharp
1340
1341   install-headers: install-headers_c install-headers_cxx
1342
1343   install-headers_c:
1344         $(E) "[INSTALL] Installing public C headers"
1345         $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1
1346         $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
1347
1348   install-headers_cxx:
1349         $(E) "[INSTALL] Installing public C++ headers"
1350         $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1
1351         $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
1352
1353   install-static: install-static_c install-static_cxx
1354
1355   install-static_c: static_c strip-static_c install-pkg-config_c
1356   % for lib in libs:
1357   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1358   % if lib.language == "c":
1359   % if lib.build == "all":
1360   % if not lib.get('external_deps', None):
1361         $(E) "[INSTALL] Installing lib${lib.name}.a"
1362         $(Q) $(INSTALL) -d $(prefix)/lib
1363         $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
1364   % endif
1365   % endif
1366   % endif
1367   % endif
1368   % endfor
1369
1370   install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx
1371   % for lib in libs:
1372   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1373   % if lib.language == "c++":
1374   % if lib.build == "all":
1375         $(E) "[INSTALL] Installing lib${lib.name}.a"
1376         $(Q) $(INSTALL) -d $(prefix)/lib
1377         $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
1378   % endif
1379   % endif
1380   % endif
1381   % endfor
1382
1383   <%def name="install_shared(lang_filter)">\
1384   % for lib in libs:
1385   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1386   % if lib.language == lang_filter:
1387   % if lib.build == "all":
1388   % if not lib.get('external_deps', None):
1389         $(E) "[INSTALL] Installing $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]})"
1390         $(Q) $(INSTALL) -d $(prefix)/lib
1391         $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) $(prefix)/lib/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]})
1392   ifeq ($(SYSTEM),MINGW32)
1393         $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]})-dll.a $(prefix)/lib/lib${lib.name}.a
1394   else ifneq ($(SYSTEM),Darwin)
1395         $(Q) ln -sf $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) $(prefix)/lib/lib${lib.name}.so.${settings.get(lang_to_var[lib.language].lower() + '_version').major}
1396         $(Q) ln -sf $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) $(prefix)/lib/lib${lib.name}.so
1397   endif
1398   % endif
1399   % endif
1400   % endif
1401   % endif
1402   % endfor
1403   ifneq ($(SYSTEM),MINGW32)
1404   ifneq ($(SYSTEM),Darwin)
1405         $(Q) ldconfig || true
1406   endif
1407   endif
1408   </%def>
1409
1410   install-shared_c: shared_c strip-shared_c install-pkg-config_c
1411   ${install_shared("c")}
1412
1413   install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx
1414   ${install_shared("c++")}
1415
1416   install-shared_csharp: shared_csharp strip-shared_csharp
1417   ${install_shared("csharp")}
1418
1419   install-plugins: $(PROTOC_PLUGINS)
1420         $(E) "[INSTALL] Installing grpc protoc plugins"
1421   % for tgt in targets:
1422   % if tgt.build == 'protoc':
1423         $(Q) $(INSTALL) -d $(prefix)/bin
1424         $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/${tgt.name} $(prefix)/bin/${tgt.name}
1425   % endif
1426   % endfor
1427
1428   install-grpc-cli: grpc_cli
1429         $(E) "[INSTALL] Installing grpc cli"
1430         $(Q) $(INSTALL) -d $(prefix)/bin
1431         $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_cli $(prefix)/bin/grpc_cli
1432
1433   install-pkg-config_c: pc_c pc_c_unsecure
1434         $(E) "[INSTALL] Installing C pkg-config files"
1435         $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig
1436         $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc
1437         $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc
1438         $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc
1439
1440   install-pkg-config_cxx: pc_cxx pc_cxx_unsecure
1441         $(E) "[INSTALL] Installing C++ pkg-config files"
1442         $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig
1443         $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc
1444         $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc
1445
1446   install-certs: etc/roots.pem
1447         $(E) "[INSTALL] Installing root certificates"
1448         $(Q) $(INSTALL) -d $(prefix)/share/grpc
1449         $(Q) $(INSTALL) etc/roots.pem $(prefix)/share/grpc/roots.pem
1450
1451   clean:
1452         $(E) "[CLEAN]   Cleaning build directories."
1453         $(Q) $(RM) -rf $(OBJDIR) $(LIBDIR) $(BINDIR) $(GENDIR) cache.mk
1454
1455
1456   # The various libraries
1457
1458   % for lib in libs:
1459   % if 'Makefile' in lib.get('build_system', ['Makefile']):
1460   ${makelib(lib)}
1461   % endif
1462   % endfor
1463
1464
1465   # All of the test targets, and protoc plugins
1466
1467   % for tgt in targets:
1468   ${maketarget(tgt)}
1469   % endfor
1470
1471   <%def name="makelib(lib)">
1472   LIB${lib.name.upper()}_SRC = \\
1473
1474   % for src in lib.src:
1475       ${proto_to_cc(src)} \\
1476
1477   % endfor
1478
1479   % if "public_headers" in lib:
1480   % if lib.language == "c++":
1481   PUBLIC_HEADERS_CXX += \\
1482
1483   % else:
1484   PUBLIC_HEADERS_C += \\
1485
1486   % endif
1487   % for hdr in lib.public_headers:
1488       ${hdr} \\
1489
1490   % endfor
1491   % endif
1492
1493   LIB${lib.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC))))
1494
1495   % if lib.get('defaults', None):
1496   %  for name, value in defaults.get(lib.defaults).iteritems():
1497   $(LIB${lib.name.upper()}_OBJS): ${name} += ${value}
1498   %  endfor
1499   % endif
1500
1501   ## If the library requires OpenSSL, let's add some restrictions.
1502   % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check':
1503   ifeq ($(NO_SECURE),true)
1504
1505   # You can't build secure libraries if you don't have OpenSSL.
1506
1507   $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: openssl_dep_error
1508
1509   % if lib.build == "all":
1510   $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}): openssl_dep_error
1511   % endif
1512
1513   else
1514
1515   % if lib.language == 'c++':
1516   ifeq ($(NO_PROTOBUF),true)
1517
1518   # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
1519
1520   $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error
1521
1522   % if lib.build == "all":
1523   $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}): protobuf_dep_error
1524   % endif
1525
1526   else
1527   % endif
1528
1529   $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP)\
1530   ## The else here corresponds to the if secure earlier.
1531   % else:
1532   % if lib.language == 'c++':
1533   ifeq ($(NO_PROTOBUF),true)
1534
1535   # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
1536
1537   $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error
1538
1539   % if lib.build == "all":
1540   $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}): protobuf_dep_error
1541   % endif
1542
1543   else
1544
1545   % endif
1546   $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: \
1547   % if lib.name not in ['z', 'ares', 'address_sorting']:
1548   $(ZLIB_DEP) \
1549   $(CARES_DEP) \
1550   $(ADDRESS_SORTING_DEP) \
1551   % endif
1552   % endif
1553   % if lib.language == 'c++':
1554    $(PROTOBUF_DEP)\
1555   % endif
1556    $(LIB${lib.name.upper()}_OBJS) \
1557   % if lib.get('baselib', False):
1558    $(LIBGPR_OBJS) \
1559    $(ZLIB_MERGE_OBJS) \
1560    $(CARES_MERGE_OBJS) \
1561    $(ADDRESS_SORTING_MERGE_OBJS) \
1562   % if lib.get('secure', 'check') == True:
1563    $(OPENSSL_MERGE_OBJS) \
1564   % endif
1565   % endif
1566
1567         $(E) "[AR]      Creating $@"
1568         $(Q) mkdir -p `dirname $@`
1569         $(Q) rm -f $(LIBDIR)/$(CONFIG)/lib${lib.name}.a
1570         $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS) \
1571   % if lib.get('baselib', False):
1572    $(LIBGPR_OBJS) \
1573    $(ZLIB_MERGE_OBJS) \
1574    $(CARES_MERGE_OBJS) \
1575    $(ADDRESS_SORTING_MERGE_OBJS) \
1576   % if lib.get('secure', 'check') == True:
1577    $(OPENSSL_MERGE_OBJS) \
1578   % endif
1579   % endif
1580
1581   ifeq ($(SYSTEM),Darwin)
1582         $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/lib${lib.name}.a
1583   endif
1584
1585   <%
1586
1587     if lib.language == 'c++':
1588       ld = '$(LDXX)'
1589     else:
1590       ld = '$(LD)'
1591
1592     out_mingbase = '$(LIBDIR)/$(CONFIG)/' + lib.name + '$(SHARED_VERSION_' + lang_to_var[lib.language] + ')'
1593     out_libbase = '$(LIBDIR)/$(CONFIG)/lib' + lib.name + '$(SHARED_VERSION_' + lang_to_var[lib.language] + ')'
1594
1595     common = '$(LIB' + lib.name.upper() + '_OBJS)'
1596
1597     link_libs = ''
1598     lib_deps = ' $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP)'
1599     mingw_libs = ''
1600     mingw_lib_deps = ' $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP)'
1601     if lib.language == 'c++':
1602       lib_deps += ' $(PROTOBUF_DEP)'
1603       mingw_lib_deps += ' $(PROTOBUF_DEP)'
1604     if lib.get('deps_linkage', None) == 'static':
1605       for dep in lib.get('deps', []):
1606         lib_archive = '$(LIBDIR)/$(CONFIG)/lib' + dep + '.a'
1607         common = common + ' ' + lib_archive
1608         lib_deps = lib_deps + ' ' + lib_archive
1609         mingw_lib_deps = mingw_lib_deps + ' ' + lib_archive
1610     else:
1611       for dep in lib.get('deps', []):
1612         dep_lib = None
1613         for dl in libs:
1614           if dl.name == dep:
1615             dep_lib = dl
1616         assert dep_lib, 'lib %s not found (in %s)' % (dep, lib.name)
1617         link_libs = link_libs + ' -l' + dep
1618         lib_deps = lib_deps + ' $(LIBDIR)/$(CONFIG)/lib' + dep + '.$(SHARED_EXT_' + lang_to_var[dep_lib.language] + ')'
1619         mingw_libs = mingw_libs + ' -l' + dep + '$(SHARED_VERSION_' + lang_to_var[dep_lib.language] + ')-dll'
1620         mingw_lib_deps = mingw_lib_deps + ' $(LIBDIR)/$(CONFIG)/' + dep + '$(SHARED_VERSION_' + lang_to_var[dep_lib.language] + ').$(SHARED_EXT_' + lang_to_var[dep_lib.language] + ')'
1621
1622     security = lib.get('secure', 'check')
1623     if security == True:
1624       common = common + ' $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE)'
1625     common = common + ' $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS)'
1626
1627     if security in [True, 'check']:
1628       for src in lib.src:
1629         if not proto_re.match(src):
1630           sources_that_need_openssl.add(src)
1631     else:
1632       for src in lib.src:
1633         sources_that_don_t_need_openssl.add(src)
1634
1635     if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check':
1636       lib_deps = lib_deps + ' $(OPENSSL_DEP)'
1637       mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)'
1638
1639     if lib.language == 'c++':
1640       common = common + ' $(LDLIBSXX) $(LDLIBS_PROTOBUF)'
1641
1642     ldflags = '$(LDFLAGS)'
1643     if lib.get('LDFLAGS', None):
1644       ldflags += ' ' + lib['LDFLAGS']
1645
1646     common = common + ' $(LDLIBS)'
1647   %>
1648
1649   % if lib.build == "all":
1650   ifeq ($(SYSTEM),MINGW32)
1651   ${out_mingbase}.$(SHARED_EXT_${lang_to_var[lib.language]}): $(LIB${lib.name.upper()}_OBJS) ${mingw_lib_deps}
1652         $(E) "[LD]      Linking $@"
1653         $(Q) mkdir -p `dirname $@`
1654         $(Q) ${ld} ${ldflags} -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=${out_mingbase}.def -Wl,--out-implib=${out_libbase}-dll.a -o ${out_mingbase}.$(SHARED_EXT_${lang_to_var[lib.language]}) ${common}${mingw_libs}
1655   else
1656   ${out_libbase}.$(SHARED_EXT_${lang_to_var[lib.language]}): $(LIB${lib.name.upper()}_OBJS) ${lib_deps}
1657         $(E) "[LD]      Linking $@"
1658         $(Q) mkdir -p `dirname $@`
1659   ifeq ($(SYSTEM),Darwin)
1660         $(Q) ${ld} ${ldflags} -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) -dynamiclib -o ${out_libbase}.$(SHARED_EXT_${lang_to_var[lib.language]}) ${common}${link_libs}
1661   else
1662         $(Q) ${ld} ${ldflags} -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,lib${lib.name}.so.${settings.get(lang_to_var[lib.language].lower() + '_version').major} -o ${out_libbase}.$(SHARED_EXT_${lang_to_var[lib.language]}) ${common}${link_libs}
1663         $(Q) ln -sf $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) ${out_libbase}.so.${settings.get(lang_to_var[lib.language].lower() + '_version').major}
1664         $(Q) ln -sf $(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}) ${out_libbase}.so
1665   endif
1666   endif
1667   % endif
1668   % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check':
1669   ## If the lib was secure, we have to close the Makefile's if that tested
1670   ## the presence of OpenSSL.
1671
1672   endif
1673   % endif
1674   % if lib.language == 'c++':
1675   ## If the lib was C++, we have to close the Makefile's if that tested
1676   ## the presence of protobuf 3.5.0+
1677
1678   endif
1679   % endif
1680
1681   % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check':
1682   ifneq ($(NO_SECURE),true)
1683   % endif
1684   ifneq ($(NO_DEPS),true)
1685   -include $(LIB${lib.name.upper()}_OBJS:.o=.dep)
1686   endif
1687   % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check':
1688   endif
1689   % endif
1690   % for src in lib.src:
1691   % if not proto_re.match(src) and any(proto_re.match(src2) for src2 in lib.src):
1692   $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in lib.src if proto_re.match(src2))}
1693   % endif
1694   % endfor
1695   </%def>
1696
1697   <%def name="maketarget(tgt)"><% has_no_sources = not tgt.src %>
1698   % if not has_no_sources:
1699   ${tgt.name.upper()}_SRC = \\
1700
1701   % for src in tgt.src:
1702       ${proto_to_cc(src)} \\
1703
1704   % endfor
1705
1706   ${tgt.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC))))
1707   % endif
1708   % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check':
1709   ifeq ($(NO_SECURE),true)
1710
1711   # You can't build secure targets if you don't have OpenSSL.
1712
1713   $(BINDIR)/$(CONFIG)/${tgt.name}: openssl_dep_error
1714
1715   else
1716
1717   % endif
1718
1719   % if tgt.boringssl:
1720   # boringssl needs an override to ensure that it does not include
1721   # system openssl headers regardless of other configuration
1722   # we do so here with a target specific variable assignment
1723   $(${tgt.name.upper()}_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
1724   $(${tgt.name.upper()}_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
1725   $(${tgt.name.upper()}_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
1726   % else:
1727   % endif
1728
1729   ##
1730   ## We're not trying to add a dependency on building zlib and openssl here,
1731   ## as it's already done in the libraries. We're assuming that the build
1732   ## trickles down, and that a secure target requires a secure version of
1733   ## a library.
1734   ##
1735   ## That simplifies the codegen a bit, but prevents a fully defined Makefile.
1736   ## I can live with that.
1737   ##
1738   % if tgt.build == 'protoc' or tgt.language == 'c++':
1739
1740   ifeq ($(NO_PROTOBUF),true)
1741
1742   # You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+.
1743
1744   $(BINDIR)/$(CONFIG)/${tgt.name}: protobuf_dep_error
1745
1746   else
1747
1748   $(BINDIR)/$(CONFIG)/${tgt.name}: \
1749   % if not has_no_sources:
1750   $(PROTOBUF_DEP) $(${tgt.name.upper()}_OBJS)\
1751   % endif
1752   % else:
1753   $(BINDIR)/$(CONFIG)/${tgt.name}: \
1754   % if not has_no_sources:
1755   $(${tgt.name.upper()}_OBJS)\
1756   % endif
1757   % endif
1758   % for dep in tgt.deps:
1759    $(LIBDIR)/$(CONFIG)/lib${dep}.a\
1760   % endfor
1761
1762   % if tgt.language == "c++" or tgt.boringssl or tgt.build == 'fuzzer':
1763   ## C++ targets specificies.
1764   % if tgt.build == 'protoc':
1765         $(E) "[HOSTLD]  Linking $@"
1766         $(Q) mkdir -p `dirname $@`
1767         $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) \
1768   % if not has_no_sources:
1769   $(${tgt.name.upper()}_OBJS)\
1770   % endif
1771   % else:
1772         $(E) "[LD]      Linking $@"
1773         $(Q) mkdir -p `dirname $@`
1774         $(Q) $(LDXX) $(LDFLAGS) \
1775   % if not has_no_sources:
1776   $(${tgt.name.upper()}_OBJS)\
1777   % endif
1778   % endif
1779   % else:
1780   ## C-only targets specificities.
1781         $(E) "[LD]      Linking $@"
1782         $(Q) mkdir -p `dirname $@`
1783         $(Q) $(LD) $(LDFLAGS) \
1784   % if not has_no_sources:
1785   $(${tgt.name.upper()}_OBJS)\
1786   % endif
1787   % endif
1788   % for dep in tgt.deps:
1789    $(LIBDIR)/$(CONFIG)/lib${dep}.a\
1790   % endfor
1791   % if tgt.language == "c++":
1792   % if tgt.build == 'protoc':
1793    $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC)\
1794   % else:
1795    $(LDLIBSXX) $(LDLIBS_PROTOBUF)\
1796   % endif
1797   % endif
1798   % if tgt.build == 'protoc':
1799    $(HOST_LDLIBS)\
1800   % else:
1801    $(LDLIBS)\
1802   % endif
1803   % if tgt.build == 'protoc':
1804    $(HOST_LDLIBS_PROTOC)\
1805   % elif tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check':
1806    $(LDLIBS_SECURE)\
1807   % endif
1808   % if tgt.language == 'c++' and tgt.build == 'test':
1809    $(GTEST_LIB)\
1810   % elif tgt.language == 'c++' and tgt.build == 'benchmark':
1811    $(GTEST_LIB)\
1812   % endif
1813   % if tgt.build == 'fuzzer':
1814    -lFuzzer\
1815   % endif
1816    -o $(BINDIR)/$(CONFIG)/${tgt.name}
1817   % if tgt.build == 'protoc' or tgt.language == 'c++':
1818
1819   endif
1820   % endif
1821   % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check':
1822
1823   endif
1824   % endif
1825
1826   % if tgt.get('defaults', None):
1827   %  for name, value in defaults.get(tgt.defaults).iteritems():
1828   $(${tgt.name.upper()}_OBJS): ${name} += ${value}
1829   %  endfor
1830   % endif
1831   % for src in tgt.src:
1832   $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
1833   % for dep in tgt.deps:
1834    $(LIBDIR)/$(CONFIG)/lib${dep}.a\
1835   % endfor
1836
1837   % if tgt.language == 'c89':
1838   % for src in tgt.src:
1839   $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o : ${src}
1840         $(E) "[C]       Compiling $<"
1841         $(Q) mkdir -p `dirname $@`
1842         $(Q) $(CC) $(CPPFLAGS) $(CFLAGS) -std=c89 -pedantic -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
1843   % endfor
1844   % endif
1845
1846   % endfor
1847   % if not has_no_sources:
1848   deps_${tgt.name}: $(${tgt.name.upper()}_OBJS:.o=.dep)
1849   % endif
1850
1851   % if not has_no_sources:
1852   % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check':
1853   ifneq ($(NO_SECURE),true)
1854   % endif
1855   ifneq ($(NO_DEPS),true)
1856   -include $(${tgt.name.upper()}_OBJS:.o=.dep)
1857   endif
1858   % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check':
1859   endif
1860   % endif
1861   % endif
1862   % for src in tgt.src:
1863   % if not proto_re.match(src) and any(proto_re.match(src2) for src2 in tgt.src):
1864   $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in tgt.src if proto_re.match(src2))}
1865   % endif
1866   % endfor
1867   </%def>
1868
1869   ifneq ($(OPENSSL_DEP),)
1870   # This is to ensure the embedded OpenSSL is built beforehand, properly
1871   # installing headers to their final destination on the drive. We need this
1872   # otherwise parallel compilation will fail if a source is compiled first.
1873   % for src in sorted(sources_that_need_openssl):
1874   % if src not in sources_that_don_t_need_openssl:
1875   ${src}: $(OPENSSL_DEP)
1876   % endif
1877   % endfor
1878   endif
1879
1880   .PHONY: all strip tools \
1881   dep_error openssl_dep_error openssl_dep_message git_update stop \
1882   buildtests buildtests_c buildtests_cxx \
1883   test test_c test_cxx \
1884   install install_c install_cxx \
1885   install-headers install-headers_c install-headers_cxx \
1886   install-shared install-shared_c install-shared_cxx \
1887   install-static install-static_c install-static_cxx \
1888   strip strip-shared strip-static \
1889   strip_c strip-shared_c strip-static_c \
1890   strip_cxx strip-shared_cxx strip-static_cxx \
1891   dep_c dep_cxx bins_dep_c bins_dep_cxx \
1892   clean
1893
1894   .PHONY: printvars
1895   printvars:
1896         @$(foreach V,$(sort $(.VARIABLES)),                 \
1897           $(if $(filter-out environment% default automatic, \
1898           $(origin $V)),$(warning $V=$($V) ($(value $V)))))