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