diff options
author | 2015-09-04 19:53:42 +0200 | |
---|---|---|
committer | 2015-09-04 19:53:42 +0200 | |
commit | b70e3be0409225b0e389379cc62d740694b888ac (patch) | |
tree | f7a440e38c549393e0596fb283a94d28c423ae0b /templates | |
parent | 38b32c077bf3095c3dfbdb84c2c3afe47df35c1b (diff) | |
parent | 02128e9bbf92c3900f0927a724482b5b3ff7541f (diff) |
Merge branch 'master' of github.com:grpc/grpc into winnt-check
Conflicts:
vsprojects/global.props
Diffstat (limited to 'templates')
50 files changed, 2634 insertions, 2516 deletions
diff --git a/templates/BUILD.template b/templates/BUILD.template index 4e9d8c376a..bb18c353b1 100644 --- a/templates/BUILD.template +++ b/templates/BUILD.template @@ -1,225 +1,229 @@ -# GRPC Bazel BUILD file. -# This currently builds C, C++ and Objective-C code. -# This file has been automatically generated from a template file. -# Please look at the templates directory instead. -# This file can be regenerated from the template by running -# tools/buildgen/generate_projects.sh - -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -licenses(["notice"]) # 3-clause BSD - -package(default_visibility = ["//visibility:public"]) - -<%! -def get_deps(target_dict): - deps = [] - if target_dict.get('secure', 'no') == 'yes': +%YAML 1.2 +--- | + # GRPC Bazel BUILD file. + # This currently builds C, C++ and Objective-C code. + # This file has been automatically generated from a template file. + # Please look at the templates directory instead. + # This file can be regenerated from the template by running + # tools/buildgen/generate_projects.sh + + # Copyright 2015, Google Inc. + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are + # met: + # + # * Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # * Redistributions in binary form must reproduce the above + # copyright notice, this list of conditions and the following disclaimer + # in the documentation and/or other materials provided with the + # distribution. + # * Neither the name of Google Inc. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + licenses(["notice"]) # 3-clause BSD + + package(default_visibility = ["//visibility:public"]) + + <%! + def get_deps(target_dict): + deps = [] + if target_dict.get('secure', False): + deps = [ + "//external:libssl", + ] + if target_dict.get('build', None) == 'protoc': + deps.append("//external:protobuf_compiler") + if target_dict['name'] == 'grpc++_unsecure' or target_dict['name'] == 'grpc++': + deps.append("//external:protobuf_clib") + elif target_dict['name'] == 'grpc': + deps.append("//external:zlib") + for d in target_dict.get('deps', []): + if d.find('//') == 0 or d[0] == ':': + deps.append(d) + else: + deps.append(':%s' % (d)) + return deps + %> + + % for lib in libs: + % if lib.build in ("all", "protoc"): + ${cc_library(lib)} + % endif + % endfor + + % for lib in libs: + % if lib.name in ("grpc", "gpr"): + ${objc_library(lib)} + % endif + % endfor + + % for tgt in targets: + % if tgt.build == 'protoc': + ${cc_binary(tgt)} + % endif + % endfor + + <%def name="cc_library(lib)"> + cc_library( + name = "${lib.name}", + srcs = [ + % for hdr in lib.get("headers", []): + "${hdr}", + % endfor + % for src in lib.src: + "${src}", + % endfor + ], + hdrs = [ + % for hdr in lib.get("public_headers", []): + "${hdr}", + % endfor + ], + includes = [ + "include", + ".", + ], deps = [ - "//external:libssl", - ] - if target_dict.get('build', None) == 'protoc': - deps.append("//external:protobuf_compiler") - if target_dict['name'] == 'grpc++_unsecure' or target_dict['name'] == 'grpc++': - deps.append("//external:protobuf_clib") - for d in target_dict.get('deps', []): - if d.find('//') == 0 or d[0] == ':': - deps.append(d) - else: - deps.append(':%s' % (d)) - return deps -%> - -% for lib in libs: -% if lib.build in ("all", "protoc"): -${cc_library(lib)} -% endif -% endfor - -% for lib in libs: -% if lib.name in ("grpc", "gpr"): -${objc_library(lib)} -% endif -% endfor - -% for tgt in targets: -% if tgt.build == 'protoc': -${cc_binary(tgt)} -% endif -% endfor - -<%def name="cc_library(lib)"> -cc_library( - name = "${lib.name}", - srcs = [ -% for hdr in lib.get("headers", []): - "${hdr}", -% endfor -% for src in lib.src: - "${src}", -% endfor - ], - hdrs = [ -% for hdr in lib.get("public_headers", []): - "${hdr}", -% endfor - ], - includes = [ - "include", - ".", - ], - deps = [ -% for dep in get_deps(lib): - "${dep}", -% endfor - ], -) -</%def> - -<%def name="objc_library(lib)"> -objc_library( - name = "${lib.name}_objc", - srcs = [ -% for src in lib.src: - "${src}", -% endfor - ], - hdrs = [ -% for hdr in lib.get("public_headers", []): - "${hdr}", -% endfor -% for hdr in lib.get("headers", []): - "${hdr}", -% endfor - ], - includes = [ - "include", - ".", - ], - deps = [ -% for dep in lib.get("deps", []): - ":${dep}_objc", -% endfor -% if lib.get('secure', 'no') == 'yes': - "//external:libssl_objc", -% endif - ], -% if lib.get("baselib", false): - sdk_dylibs = ["libz"], -% endif -) -</%def> - -<%def name="cc_binary(tgt)"> -cc_binary( - name = "${tgt.name}", - srcs = [ -% for src in tgt.src: - "${src}", -% endfor - ], - deps = [ -% for dep in get_deps(tgt): - "${dep}", -% endfor - ], -) -</%def> - -objc_path = "src/objective-c" - -rx_library_path = objc_path + "/RxLibrary" - -objc_library( - name = "rx_library", - hdrs = glob([ - rx_library_path + "/*.h", - rx_library_path + "/transformations/*.h", - ]), - srcs = glob([ - rx_library_path + "/*.m", - rx_library_path + "/transformations/*.m", - ]), - includes = [objc_path], - deps = [ - ":rx_library_private", - ], -) - -objc_library( - name = "rx_library_private", - hdrs = glob([rx_library_path + "/private/*.h"]), - srcs = glob([rx_library_path + "/private/*.m"]), - visibility = ["//visibility:private"], -) - -objc_client_path = objc_path + "/GRPCClient" - -objc_library( - name = "grpc_client", - hdrs = glob([ - objc_client_path + "/*.h", - objc_client_path + "/private/*.h", - ]), - srcs = glob([ - objc_client_path + "/*.m", - objc_client_path + "/private/*.m", - ]), - includes = [objc_path], - bundles = [":gRPCCertificates"], - deps = [ - ":grpc_objc", - ":rx_library", - ], -) - -objc_bundle_library( - # The choice of name is signicant here, since it determines the bundle name. - name = "gRPCCertificates", - resources = ["etc/roots.pem"], -) - -proto_objc_rpc_path = objc_path + "/ProtoRPC" - -objc_library( - name = "proto_objc_rpc", - hdrs = glob([ - proto_objc_rpc_path + "/*.h", - ]), - srcs = glob([ - proto_objc_rpc_path + "/*.m", - ]), - includes = [objc_path], - deps = [ - ":grpc_client", - ":rx_library", - "//external:protobuf_objc", - ], -) + % for dep in get_deps(lib): + "${dep}", + % endfor + ], + ) + </%def> + + <%def name="objc_library(lib)"> + objc_library( + name = "${lib.name}_objc", + srcs = [ + % for src in lib.src: + "${src}", + % endfor + ], + hdrs = [ + % for hdr in lib.get("public_headers", []): + "${hdr}", + % endfor + % for hdr in lib.get("headers", []): + "${hdr}", + % endfor + ], + includes = [ + "include", + ".", + ], + deps = [ + % for dep in lib.get("deps", []): + ":${dep}_objc", + % endfor + % if lib.get('secure', False): + "//external:libssl_objc", + % endif + ], + % if lib.get("baselib", false): + sdk_dylibs = ["libz"], + % endif + ) + </%def> + + <%def name="cc_binary(tgt)"> + cc_binary( + name = "${tgt.name}", + srcs = [ + % for src in tgt.src: + "${src}", + % endfor + ], + deps = [ + % for dep in get_deps(tgt): + "${dep}", + % endfor + ], + ) + </%def> + + objc_path = "src/objective-c" + + rx_library_path = objc_path + "/RxLibrary" + + objc_library( + name = "rx_library", + hdrs = glob([ + rx_library_path + "/*.h", + rx_library_path + "/transformations/*.h", + ]), + srcs = glob([ + rx_library_path + "/*.m", + rx_library_path + "/transformations/*.m", + ]), + includes = [objc_path], + deps = [ + ":rx_library_private", + ], + ) + + objc_library( + name = "rx_library_private", + hdrs = glob([rx_library_path + "/private/*.h"]), + srcs = glob([rx_library_path + "/private/*.m"]), + visibility = ["//visibility:private"], + ) + + objc_client_path = objc_path + "/GRPCClient" + + objc_library( + name = "grpc_client", + hdrs = glob([ + objc_client_path + "/*.h", + objc_client_path + "/private/*.h", + ]), + srcs = glob([ + objc_client_path + "/*.m", + objc_client_path + "/private/*.m", + ]), + includes = [objc_path], + bundles = [":gRPCCertificates"], + deps = [ + ":grpc_objc", + ":rx_library", + ], + ) + + objc_bundle_library( + # The choice of name is signicant here, since it determines the bundle name. + name = "gRPCCertificates", + resources = ["etc/roots.pem"], + ) + + proto_objc_rpc_path = objc_path + "/ProtoRPC" + + objc_library( + name = "proto_objc_rpc", + hdrs = glob([ + proto_objc_rpc_path + "/*.h", + ]), + srcs = glob([ + proto_objc_rpc_path + "/*.m", + ]), + includes = [objc_path], + deps = [ + ":grpc_client", + ":rx_library", + "//external:protobuf_objc", + ], + ) diff --git a/templates/Makefile.template b/templates/Makefile.template index 6530ea5eb2..6069d6d238 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -1,1701 +1,1876 @@ -# GRPC global makefile -# This currently builds C and C++ code. -# This file has been automatically generated from a template file. -# Please look at the templates directory instead. -# This file can be regenerated from the template by running -# tools/buildgen/generate_projects.sh - -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -<%! - import re - import os - - proto_re = re.compile('(.*)\\.proto') - - def proto_to_cc(filename): - m = proto_re.match(filename) - if not m: - return filename - return '$(GENDIR)/' + m.group(1) + '.pb.cc $(GENDIR)/' + m.group(1) + '.grpc.pb.cc' - - sources_that_need_openssl = set() - sources_that_don_t_need_openssl = set() -%> - - -# Basic platform detection -HOST_SYSTEM = $(shell uname | cut -f 1 -d_) -ifeq ($(SYSTEM),) -SYSTEM = $(HOST_SYSTEM) -endif -ifeq ($(SYSTEM),MSYS) -SYSTEM = MINGW32 -endif -ifeq ($(SYSTEM),MINGW64) -SYSTEM = MINGW32 -endif - - -ifndef BUILDDIR -BUILDDIR = . -endif - -HAS_GCC = $(shell which gcc > /dev/null 2> /dev/null && echo true || echo false) -HAS_CC = $(shell which cc > /dev/null 2> /dev/null && echo true || echo false) -HAS_CLANG = $(shell which clang > /dev/null 2> /dev/null && echo true || echo false) - -ifeq ($(HAS_CC),true) -DEFAULT_CC = cc -DEFAULT_CXX = c++ -else -ifeq ($(HAS_GCC),true) -DEFAULT_CC = gcc -DEFAULT_CXX = g++ -else -ifeq ($(HAS_CLANG),true) -DEFAULT_CC = clang -DEFAULT_CXX = clang++ -else -DEFAULT_CC = no_c_compiler -DEFAULT_CXX = no_c++_compiler -endif -endif -endif - - -BINDIR = $(BUILDDIR)/bins -OBJDIR = $(BUILDDIR)/objs -LIBDIR = $(BUILDDIR)/libs -GENDIR = $(BUILDDIR)/gens - -# Configurations - -VALID_CONFIG_opt = 1 -CC_opt = $(DEFAULT_CC) -CXX_opt = $(DEFAULT_CXX) -LD_opt = $(DEFAULT_CC) -LDXX_opt = $(DEFAULT_CXX) -CPPFLAGS_opt = -O2 -LDFLAGS_opt = -DEFINES_opt = NDEBUG - -VALID_CONFIG_basicprof = 1 -CC_basicprof = $(DEFAULT_CC) -CXX_basicprof = $(DEFAULT_CXX) -LD_basicprof = $(DEFAULT_CC) -LDXX_basicprof = $(DEFAULT_CXX) -CPPFLAGS_basicprof = -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC -LDFLAGS_basicprof = -DEFINES_basicprof = NDEBUG - -VALID_CONFIG_stapprof = 1 -CC_stapprof = $(DEFAULT_CC) -CXX_stapprof = $(DEFAULT_CXX) -LD_stapprof = $(DEFAULT_CC) -LDXX_stapprof = $(DEFAULT_CXX) -CPPFLAGS_stapprof = -O2 -DGRPC_STAP_PROFILER -LDFLAGS_stapprof = -DEFINES_stapprof = NDEBUG - -VALID_CONFIG_dbg = 1 -CC_dbg = $(DEFAULT_CC) -CXX_dbg = $(DEFAULT_CXX) -LD_dbg = $(DEFAULT_CC) -LDXX_dbg = $(DEFAULT_CXX) -CPPFLAGS_dbg = -O0 -LDFLAGS_dbg = -DEFINES_dbg = _DEBUG DEBUG - -VALID_CONFIG_mutrace = 1 -CC_mutrace = $(DEFAULT_CC) -CXX_mutrace = $(DEFAULT_CXX) -LD_mutrace = $(DEFAULT_CC) -LDXX_mutrace = $(DEFAULT_CXX) -CPPFLAGS_mutrace = -O0 -LDFLAGS_mutrace = -rdynamic -DEFINES_mutrace = _DEBUG DEBUG - -VALID_CONFIG_valgrind = 1 -REQUIRE_CUSTOM_LIBRARIES_valgrind = 1 -CC_valgrind = $(DEFAULT_CC) -CXX_valgrind = $(DEFAULT_CXX) -LD_valgrind = $(DEFAULT_CC) -LDXX_valgrind = $(DEFAULT_CXX) -CPPFLAGS_valgrind = -O0 -OPENSSL_CFLAGS_valgrind = -DPURIFY -LDFLAGS_valgrind = -DEFINES_valgrind = _DEBUG DEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=20 - -VALID_CONFIG_tsan = 1 -REQUIRE_CUSTOM_LIBRARIES_tsan = 1 -CC_tsan = clang -CXX_tsan = clang++ -LD_tsan = clang -LDXX_tsan = clang++ -CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-error=unused-command-line-argument -LDFLAGS_tsan = -fsanitize=thread -DEFINES_tsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=10 - -VALID_CONFIG_asan = 1 -REQUIRE_CUSTOM_LIBRARIES_asan = 1 -CC_asan = clang -CXX_asan = clang++ -LD_asan = clang -LDXX_asan = clang++ -CPPFLAGS_asan = -O0 -fsanitize=address -fno-omit-frame-pointer -Wno-error=unused-command-line-argument -LDFLAGS_asan = -fsanitize=address -DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 - -VALID_CONFIG_msan = 1 -REQUIRE_CUSTOM_LIBRARIES_msan = 1 -CC_msan = clang -CXX_msan = clang++-libc++ -LD_msan = clang -LDXX_msan = clang++-libc++ -CPPFLAGS_msan = -O0 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-error=unused-command-line-argument -OPENSSL_CFLAGS_msan = -DPURIFY -LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=4 - -VALID_CONFIG_ubsan = 1 -REQUIRE_CUSTOM_LIBRARIES_ubsan = 1 -CC_ubsan = clang -CXX_ubsan = clang++ -LD_ubsan = clang -LDXX_ubsan = clang++ -CPPFLAGS_ubsan = -O1 -fsanitize=undefined -fno-omit-frame-pointer -Wno-error=unused-command-line-argument -OPENSSL_CFLAGS_ubsan = -DPURIFY -LDFLAGS_ubsan = -fsanitize=undefined -DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 - -VALID_CONFIG_gcov = 1 -CC_gcov = gcc -CXX_gcov = g++ -LD_gcov = gcc -LDXX_gcov = g++ -CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage -LDFLAGS_gcov = -fprofile-arcs -ftest-coverage -DEFINES_gcov = _DEBUG DEBUG - - -# General settings. -# You may want to change these depending on your system. - -prefix ?= /usr/local - -PROTOC = protoc -DTRACE = dtrace -CONFIG ?= opt -CC = $(CC_$(CONFIG)) -CXX = $(CXX_$(CONFIG)) -LD = $(LD_$(CONFIG)) -LDXX = $(LDXX_$(CONFIG)) -AR = ar -ifeq ($(SYSTEM),Linux) -STRIP = strip --strip-unneeded -else -ifeq ($(SYSTEM),Darwin) -STRIP = strip -x -else -STRIP = strip -endif -endif -INSTALL = install -RM = rm -f -PKG_CONFIG = pkg-config - -ifndef VALID_CONFIG_$(CONFIG) -$(error Invalid CONFIG value '$(CONFIG)') -endif - -ifeq ($(SYSTEM),Linux) -TMPOUT = /dev/null -else -TMPOUT = `mktemp /tmp/test-out-XXXXXX` -endif - -# Detect if we can use C++11 -CXX11_CHECK_CMD = $(CXX) -std=c++11 -o $(TMPOUT) -c test/build/c++11.cc -HAS_CXX11 = $(shell $(CXX11_CHECK_CMD) 2> /dev/null && echo true || echo false) - -# The HOST compiler settings are used to compile the protoc plugins. -# In most cases, you won't have to change anything, but if you are -# cross-compiling, you can override these variables from GNU make's -# command line: make CC=cross-gcc HOST_CC=gcc - -HOST_CC = $(CC) -HOST_CXX = $(CXX) -HOST_LD = $(LD) -HOST_LDXX = $(LDXX) - -ifdef EXTRA_DEFINES -DEFINES += $(EXTRA_DEFINES) -endif - -CFLAGS += -std=c89 -pedantic -ifeq ($(HAS_CXX11),true) -CXXFLAGS += -std=c++11 -else -CXXFLAGS += -std=c++0x -endif -CPPFLAGS += -g -Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter -LDFLAGS += -g - -CPPFLAGS += $(CPPFLAGS_$(CONFIG)) -DEFINES += $(DEFINES_$(CONFIG)) INSTALL_PREFIX=\"$(prefix)\" -LDFLAGS += $(LDFLAGS_$(CONFIG)) - -ifneq ($(SYSTEM),MINGW32) -PIC_CPPFLAGS = -fPIC -CPPFLAGS += -fPIC -LDFLAGS += -fPIC -endif - -INCLUDES = . include $(GENDIR) -LDFLAGS += -Llibs/$(CONFIG) - -ifeq ($(SYSTEM),Darwin) -ifneq ($(wildcard /usr/local/ssl/include),) -INCLUDES += /usr/local/ssl/include -endif -ifneq ($(wildcard /opt/local/include),) -INCLUDES += /opt/local/include -endif -ifneq ($(wildcard /usr/local/include),) -INCLUDES += /usr/local/include -endif -LIBS = m z -ifneq ($(wildcard /usr/local/ssl/lib),) -LDFLAGS += -L/usr/local/ssl/lib -endif -ifneq ($(wildcard /opt/local/lib),) -LDFLAGS += -L/opt/local/lib -endif -ifneq ($(wildcard /usr/local/lib),) -LDFLAGS += -L/usr/local/lib -endif -endif - -ifeq ($(SYSTEM),Linux) -LIBS = rt m z pthread -LDFLAGS += -pthread -endif - -ifeq ($(SYSTEM),MINGW32) -LIBS = m z pthread -LDFLAGS += -pthread -endif - -ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),) -GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest -else -GTEST_LIB = -lgtest -endif -GTEST_LIB += -lgflags -ifeq ($(V),1) -E = @: -Q = -else -E = @echo -Q = @ -endif - -VERSION = ${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build} - -CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) -CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) - -LDFLAGS += $(ARCH_FLAGS) -LDLIBS += $(addprefix -l, $(LIBS)) -LDLIBSXX += $(addprefix -l, $(LIBSXX)) - -HOST_CPPFLAGS = $(CPPFLAGS) -HOST_CFLAGS = $(CFLAGS) -HOST_CXXFLAGS = $(CXXFLAGS) -HOST_LDFLAGS = $(LDFLAGS) -HOST_LDLIBS = $(LDLIBS) - - -# These are automatically computed variables. -# There shouldn't be any need to change anything from now on. - --include cache.mk - -CACHE_MK = - -HAS_PKG_CONFIG ?= $(shell command -v $(PKG_CONFIG) >/dev/null 2>&1 && echo true || echo false) - -ifeq ($(HAS_PKG_CONFIG), true) -CACHE_MK += HAS_PKG_CONFIG = true, -endif - -PC_TEMPLATE = prefix=$(prefix),\ -exec_prefix=${'\$${prefix}'},\ -includedir=${'\$${prefix}'}/include,\ -libdir=${'\$${exec_prefix}'}/lib,\ -,\ -Name: $(PC_NAME),\ -Description: $(PC_DESCRIPTION),\ -Version: $(VERSION),\ -Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\ -Requires.private: $(PC_REQUIRES_PRIVATE),\ -Libs: -L${'\$${libdir}'} $(PC_LIB),\ -Libs.private: $(PC_LIBS_PRIVATE) - -# gpr .pc file -PC_NAME = gRPC Portable Runtime -PC_DESCRIPTION = gRPC Portable Runtime -PC_CFLAGS = -pthread -PC_REQUIRES_PRIVATE = -PC_LIBS_PRIVATE = -lpthread -PC_LIB = -lgpr -ifneq ($(SYSTEM),Darwin) -PC_LIBS_PRIVATE += -lrt -endif -GPR_PC_FILE := $(PC_TEMPLATE) - -ifeq ($(SYSTEM),MINGW32) -SHARED_EXT = dll -endif -ifeq ($(SYSTEM),Darwin) -SHARED_EXT = dylib -endif -ifeq ($(SHARED_EXT),) -SHARED_EXT = so.$(VERSION) -endif - -ifeq ($(wildcard .git),) -IS_GIT_FOLDER = false -else -IS_GIT_FOLDER = true -endif - -ifeq ($(SYSTEM),Linux) -OPENSSL_REQUIRES_DL = true -endif - -ifeq ($(SYSTEM),Darwin) -OPENSSL_REQUIRES_DL = true -endif - -ifeq ($(HAS_PKG_CONFIG),true) -OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl -OPENSSL_NPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.1 openssl -ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib -PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.0.0-alpha-3 protobuf -else # HAS_PKG_CONFIG - -ifeq ($(SYSTEM),MINGW32) -OPENSSL_LIBS = ssl32 eay32 -else -OPENSSL_LIBS = ssl crypto -endif - -OPENSSL_ALPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) -OPENSSL_NPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/openssl-npn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) -ZLIB_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS) -PROTOBUF_CHECK_CMD = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS) - -ifeq ($(OPENSSL_REQUIRES_DL),true) -OPENSSL_ALPN_CHECK_CMD += -ldl -OPENSSL_NPN_CHECK_CMD += -ldl -endif - -endif # HAS_PKG_CONFIG - -PERFTOOLS_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/perftools.c -lprofiler $(LDFLAGS) - -PROTOC_CHECK_CMD = which protoc > /dev/null -PROTOC_CHECK_VERSION_CMD = protoc --version | grep -q libprotoc.3 -DTRACE_CHECK_CMD = which dtrace > /dev/null -SYSTEMTAP_HEADERS_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/systemtap.c $(LDFLAGS) - -ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) -HAS_SYSTEM_PERFTOOLS ?= $(shell $(PERFTOOLS_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_SYSTEM_PERFTOOLS),true) -DEFINES += GRPC_HAVE_PERFTOOLS -LIBS += profiler -CACHE_MK += HAS_SYSTEM_PERFTOOLS = true, -endif -endif - -HAS_SYSTEM_PROTOBUF_VERIFY = $(shell $(PROTOBUF_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) -HAS_SYSTEM_OPENSSL_ALPN ?= $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) -HAS_SYSTEM_OPENSSL_NPN = true -CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = true, -else -HAS_SYSTEM_OPENSSL_NPN ?= $(shell $(OPENSSL_NPN_CHECK_CMD) 2> /dev/null && echo true || echo false) -endif -ifeq ($(HAS_SYSTEM_OPENSSL_NPN),true) -CACHE_MK += HAS_SYSTEM_OPENSSL_NPN = true, -endif -HAS_SYSTEM_ZLIB ?= $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_SYSTEM_ZLIB),true) -CACHE_MK += HAS_SYSTEM_ZLIB = true, -endif -HAS_SYSTEM_PROTOBUF ?= $(HAS_SYSTEM_PROTOBUF_VERIFY) -ifeq ($(HAS_SYSTEM_PROTOBUF),true) -CACHE_MK += HAS_SYSTEM_PROTOBUF = true, -endif -else -# override system libraries if the config requires a custom compiled library -HAS_SYSTEM_OPENSSL_ALPN = false -HAS_SYSTEM_OPENSSL_NPN = false -HAS_SYSTEM_ZLIB = false -HAS_SYSTEM_PROTOBUF = false -endif - -HAS_PROTOC ?= $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_PROTOC),true) -CACHE_MK += HAS_PROTOC = true, -HAS_VALID_PROTOC ?= $(shell $(PROTOC_CHECK_VERSION_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_VALID_PROTOC),true) -CACHE_MK += HAS_VALID_PROTOC = true, -endif -else -HAS_VALID_PROTOC = false -endif - -# Check for Systemtap (https://sourceware.org/systemtap/), first by making sure <sys/sdt.h> is present -# in the system and secondly by checking for the "dtrace" binary (on Linux, this is part of the Systemtap -# distribution. It's part of the base system on BSD/Solaris machines). -ifndef HAS_SYSTEMTAP -HAS_SYSTEMTAP_HEADERS = $(shell $(SYSTEMTAP_HEADERS_CHECK_CMD) 2> /dev/null && echo true || echo false) -HAS_DTRACE = $(shell $(DTRACE_CHECK_CMD) 2> /dev/null && echo true || echo false) -HAS_SYSTEMTAP = false -ifeq ($(HAS_SYSTEMTAP_HEADERS),true) -ifeq ($(HAS_DTRACE),true) -HAS_SYSTEMTAP = true -endif -endif -endif - -ifeq ($(HAS_SYSTEMTAP),true) -CACHE_MK += HAS_SYSTEMTAP = true, -endif - -# Note that for testing purposes, one can do: -# make HAS_EMBEDDED_OPENSSL_ALPN=false -# to emulate the fact we do not have OpenSSL in the third_party folder. -ifeq ($(wildcard third_party/openssl/ssl/ssl.h),) -HAS_EMBEDDED_OPENSSL_ALPN = false -else -HAS_EMBEDDED_OPENSSL_ALPN = true -endif - -ifeq ($(wildcard third_party/zlib/zlib.h),) -HAS_EMBEDDED_ZLIB = false -else -HAS_EMBEDDED_ZLIB = true -endif - -ifeq ($(wildcard third_party/protobuf/src/google/protobuf/descriptor.pb.h),) -HAS_EMBEDDED_PROTOBUF = false -ifneq ($(HAS_VALID_PROTOC),true) -NO_PROTOC = true -endif -else -HAS_EMBEDDED_PROTOBUF = true -endif - -PC_REQUIRES_GRPC = gpr -PC_LIBS_GRPC = - -ifeq ($(HAS_SYSTEM_ZLIB),false) -ifeq ($(HAS_EMBEDDED_ZLIB),true) -ZLIB_DEP = $(LIBDIR)/$(CONFIG)/zlib/libz.a -CPPFLAGS += -Ithird_party/zlib -LDFLAGS += -L$(LIBDIR)/$(CONFIG)/zlib -else -DEP_MISSING += zlib -endif -else -ifeq ($(HAS_PKG_CONFIG),true) -CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib) -LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib) -PC_REQUIRES_GRPC += zlib -else -PC_LIBS_GRPC += -lz -endif -endif - -OPENSSL_PKG_CONFIG = false - -PC_REQUIRES_SECURE = -PC_LIBS_SECURE = - -ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) -ifeq ($(HAS_PKG_CONFIG),true) -OPENSSL_PKG_CONFIG = true -PC_REQUIRES_SECURE = openssl -CPPFLAGS := $(shell $(PKG_CONFIG) --cflags openssl) $(CPPFLAGS) -LDFLAGS_OPENSSL_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L openssl) -ifeq ($(SYSTEM),Linux) -ifneq ($(LDFLAGS_OPENSSL_PKG_CONFIG),) -LDFLAGS_OPENSSL_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L openssl | sed s/L/Wl,-rpath,/) -endif -endif -LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS) -else -LIBS_SECURE = $(OPENSSL_LIBS) -ifeq ($(OPENSSL_REQUIRES_DL),true) -LIBS_SECURE += dl -PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) -endif -endif -else -ifeq ($(HAS_EMBEDDED_OPENSSL_ALPN),true) -USE_SYSTEM_OPENSSL = false -OPENSSL_DEP = $(LIBDIR)/$(CONFIG)/openssl/libssl.a -OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/openssl/libssl.a $(LIBDIR)/$(CONFIG)/openssl/libcrypto.a -# need to prefix these to ensure overriding system libraries -CPPFLAGS := -Ithird_party/openssl/include $(CPPFLAGS) -LDFLAGS := -L$(LIBDIR)/$(CONFIG)/openssl $(LDFLAGS) -ifeq ($(OPENSSL_REQUIRES_DL),true) -LIBS_SECURE = dl -endif -else -ifeq ($(HAS_SYSTEM_OPENSSL_NPN),true) -USE_SYSTEM_OPENSSL = true -CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0 -LIBS_SECURE = $(OPENSSL_LIBS) -ifeq ($(OPENSSL_REQUIRES_DL),true) -LIBS_SECURE += dl -endif -else -NO_SECURE = true -endif -endif -endif - -ifeq ($(OPENSSL_PKG_CONFIG),true) -LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl) -else -LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) -endif - -# grpc .pc file -PC_NAME = gRPC -PC_DESCRIPTION = high performance general RPC framework -PC_CFLAGS = -PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) -PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) -PC_LIB = -lgrpc -GRPC_PC_FILE := $(PC_TEMPLATE) - -# gprc_unsecure .pc file -PC_NAME = gRPC unsecure -PC_DESCRIPTION = high performance general RPC framework without SSL -PC_CFLAGS = -PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) -PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) -PC_LIB = -lgrpc -GRPC_UNSECURE_PC_FILE := $(PC_TEMPLATE) - -PROTOBUF_PKG_CONFIG = false - -PC_REQUIRES_GRPCXX = -PC_LIBS_GRPCXX = - -ifeq ($(HAS_SYSTEM_PROTOBUF),true) -ifeq ($(HAS_PKG_CONFIG),true) -PROTOBUF_PKG_CONFIG = true -PC_REQUIRES_GRPCXX = protobuf -CPPFLAGS := $(shell $(PKG_CONFIG) --cflags protobuf) $(CPPFLAGS) -LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L protobuf) -ifeq ($(SYSTEM),Linux) -ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),) -LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L protobuf | sed s/L/Wl,-rpath,/) -endif -endif -else -PC_LIBS_GRPCXX = -lprotobuf -endif -else -ifeq ($(HAS_EMBEDDED_PROTOBUF),true) -PROTOBUF_DEP = $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a -CPPFLAGS := -Ithird_party/protobuf/src $(CPPFLAGS) -LDFLAGS := -L$(LIBDIR)/$(CONFIG)/protobuf $(LDFLAGS) -PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc -else -NO_PROTOBUF = true -endif -endif - -LIBS_PROTOBUF = protobuf -LIBS_PROTOC = protoc protobuf - -HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC)) - -ifeq ($(PROTOBUF_PKG_CONFIG),true) -LDLIBS_PROTOBUF += $(shell $(PKG_CONFIG) --libs-only-l protobuf) -else -LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF)) -endif - -# grpc++ .pc file -PC_NAME = gRPC++ -PC_DESCRIPTION = C++ wrapper for gRPC -PC_CFLAGS = -PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) -PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) -PC_LIB = -lgrpc++ -GRPCXX_PC_FILE := $(PC_TEMPLATE) - -# grpc++_unsecure .pc file -PC_NAME = gRPC++ unsecure -PC_DESCRIPTION = C++ wrapper for gRPC without SSL -PC_CFLAGS = -PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) -PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) -PC_LIB = -lgrpc++ -GRPCXX_UNSECURE_PC_FILE := $(PC_TEMPLATE) - -ifeq ($(MAKECMDGOALS),clean) -NO_DEPS = true -endif - -INSTALL_OK = false -ifeq ($(HAS_VALID_PROTOC),true) -ifeq ($(HAS_SYSTEM_PROTOBUF_VERIFY),true) -INSTALL_OK = true -endif -endif - -.SECONDARY = %.pb.h %.pb.cc - -PROTOC_PLUGINS =\ -% for tgt in targets: -% if tgt.build == 'protoc': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor - -ifeq ($(DEP_MISSING),) -all: static shared plugins\ -% for tgt in targets: -% if tgt.build == 'all': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor - -dep_error: - @echo "You shouldn't see this message - all of your dependencies are correct." -else -all: dep_error git_update stop - -dep_error: - @echo - @echo "DEPENDENCY ERROR" - @echo - @echo "You are missing system dependencies that are essential to build grpc," - @echo "and the third_party directory doesn't have them:" - @echo - @echo " $(DEP_MISSING)" - @echo - @echo "Installing the development packages for your system will solve" - @echo "this issue. Please consult INSTALL to get more information." - @echo - @echo "If you need information about why these tests failed, run:" - @echo - @echo " make run_dep_checks" - @echo -endif - -git_update: -ifeq ($(IS_GIT_FOLDER),true) - @echo "Additionally, since you are in a git clone, you can download the" - @echo "missing dependencies in third_party by running the following command:" - @echo - @echo " git submodule update --init" - @echo -endif - -openssl_dep_error: openssl_dep_message git_update stop - -protobuf_dep_error: protobuf_dep_message git_update stop - -protoc_dep_error: protoc_dep_message git_update stop - -openssl_dep_message: - @echo - @echo "DEPENDENCY ERROR" - @echo - @echo "The target you are trying to run requires OpenSSL." - @echo "Your system doesn't have it, and neither does the third_party directory." - @echo - @echo "Please consult INSTALL to get more information." - @echo - @echo "If you need information about why these tests failed, run:" - @echo - @echo " make run_dep_checks" - @echo - -protobuf_dep_message: - @echo - @echo "DEPENDENCY ERROR" - @echo - @echo "The target you are trying to run requires protobuf 3.0.0+" - @echo "Your system doesn't have it, and neither does the third_party directory." - @echo - @echo "Please consult INSTALL to get more information." - @echo - @echo "If you need information about why these tests failed, run:" - @echo - @echo " make run_dep_checks" - @echo - -protoc_dep_message: - @echo - @echo "DEPENDENCY ERROR" - @echo - @echo "The target you are trying to run requires protobuf-compiler 3.0.0+" - @echo "Your system doesn't have it, and neither does the third_party directory." - @echo - @echo "Please consult INSTALL to get more information." - @echo - @echo "If you need information about why these tests failed, run:" - @echo - @echo " make run_dep_checks" - @echo - -systemtap_dep_error: - @echo - @echo "DEPENDENCY ERROR" - @echo - @echo "Under the '$(CONFIG)' configutation, the target you are trying " - @echo "to build requires systemtap 2.7+ (on Linux) or dtrace (on other " - @echo "platforms such as Solaris and *BSD). " - @echo - @echo "Please consult INSTALL to get more information." - @echo - -stop: - @false - -% for tgt in targets: -${tgt.name}: $(BINDIR)/$(CONFIG)/${tgt.name} -% endfor - -run_dep_checks: - $(OPENSSL_ALPN_CHECK_CMD) || true - $(OPENSSL_NPN_CHECK_CMD) || true - $(ZLIB_CHECK_CMD) || true - $(PERFTOOLS_CHECK_CMD) || true - $(PROTOBUF_CHECK_CMD) || true - $(PROTOC_CHECK_VERSION_CMD) || true - -$(LIBDIR)/$(CONFIG)/zlib/libz.a: - $(E) "[MAKE] Building zlib" - $(Q)(cd third_party/zlib ; CC="$(CC)" CFLAGS="$(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(ZLIB_CFLAGS_EXTRA)" ./configure --static) - $(Q)$(MAKE) -C third_party/zlib clean - $(Q)$(MAKE) -C third_party/zlib - $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/zlib - $(Q)cp third_party/zlib/libz.a $(LIBDIR)/$(CONFIG)/zlib - -$(LIBDIR)/$(CONFIG)/openssl/libssl.a: - $(E) "[MAKE] Building openssl for $(SYSTEM)" -ifeq ($(SYSTEM),Darwin) - $(Q)(cd third_party/openssl ; CC="$(CC) $(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_EXTRA)" ./Configure darwin64-x86_64-cc) -else -ifeq ($(SYSTEM),MINGW32) - @echo "We currently don't have a good way to compile OpenSSL in-place under msys." - @echo "Please provide a OpenSSL in your mingw32 system." - @echo - @echo "Note that you can find a compatible version of the libraries here:" - @echo - @echo "http://slproweb.com/products/Win32OpenSSL.html" - @echo - @echo "If you decide to install that one, take the full version. The light" - @echo "version only contains compiled DLLs, without the development files." - @echo - @echo "When installing, chose to copy the OpenSSL dlls to the OpenSSL binaries" - @echo "directory. This way we'll link to them directly." - @echo - @echo "You can then re-start the build the following way:" - @echo - @echo " CPPFLAGS=-I/c/OpenSSL-Win64/include LDFLAGS=-L/c/OpenSSL-Win64 make" - @false -else - $(Q)(cd third_party/openssl ; CC="$(CC) $(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_EXTRA)" ./config no-asm $(OPENSSL_CONFIG_$(CONFIG))) -endif -endif - $(Q)$(MAKE) -C third_party/openssl clean - $(Q)(unset CPPFLAGS; $(MAKE) -C third_party/openssl build_crypto build_ssl) - $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/openssl - $(Q)cp third_party/openssl/libssl.a third_party/openssl/libcrypto.a $(LIBDIR)/$(CONFIG)/openssl - -third_party/protobuf/configure: - $(E) "[AUTOGEN] Preparing protobuf" - $(Q)(cd third_party/protobuf ; autoreconf -f -i -Wall,no-obsolete) - -$(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure - $(E) "[MAKE] Building protobuf" - $(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) - $(Q)$(MAKE) -C third_party/protobuf clean - $(Q)$(MAKE) -C third_party/protobuf - $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/protobuf - $(Q)mkdir -p $(BINDIR)/$(CONFIG)/protobuf - $(Q)cp third_party/protobuf/src/.libs/libprotoc.a $(LIBDIR)/$(CONFIG)/protobuf - $(Q)cp third_party/protobuf/src/.libs/libprotobuf.a $(LIBDIR)/$(CONFIG)/protobuf - $(Q)cp third_party/protobuf/src/protoc $(BINDIR)/$(CONFIG)/protobuf - -static: static_c static_cxx - -static_c: pc_c pc_c_unsecure cache.mk \ -% for lib in libs: -% if lib.build == 'all' and lib.language == 'c': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ -% endif -% endfor - - -static_cxx: pc_cxx pc_cxx_unsecure pc_gpr cache.mk \ -% for lib in libs: -% if lib.build == 'all' and lib.language == 'c++': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ -% endif -% endfor - - -shared: shared_c shared_cxx - -shared_c: pc_c pc_c_unsecure pc_gpr cache.mk\ -% for lib in libs: -% if lib.build == 'all' and lib.language == 'c': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ -% endif -% endfor - - -shared_cxx: pc_cxx pc_cxx_unsecure cache.mk\ -% for lib in libs: -% if lib.build == 'all' and lib.language == 'c++': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ -% endif -% endfor - - -shared_csharp: shared_c \ -% for lib in libs: -% if lib.build == 'all' and lib.language == 'csharp': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ -% endif -% endfor - -grpc_csharp_ext: shared_csharp - -plugins: $(PROTOC_PLUGINS) - -privatelibs: privatelibs_c privatelibs_cxx - -privatelibs_c: \ -% for lib in libs: -% if lib.build == 'private' and lib.language == 'c': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ -% endif -% endfor - -pc_gpr: $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc - -pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc - -pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc - -pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc +%YAML 1.2 +--- | + # GRPC global makefile + # This currently builds C and C++ code. + # This file has been automatically generated from a template file. + # Please look at the templates directory instead. + # This file can be regenerated from the template by running + # tools/buildgen/generate_projects.sh + + # Copyright 2015, Google Inc. + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are + # met: + # + # * Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # * Redistributions in binary form must reproduce the above + # copyright notice, this list of conditions and the following disclaimer + # in the documentation and/or other materials provided with the + # distribution. + # * Neither the name of Google Inc. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + <%! + import re + import os + + proto_re = re.compile('(.*)\\.proto') + + def proto_to_cc(filename): + m = proto_re.match(filename) + if not m: + return filename + return '$(GENDIR)/' + m.group(1) + '.pb.cc $(GENDIR)/' + m.group(1) + '.grpc.pb.cc' + + sources_that_need_openssl = set() + sources_that_don_t_need_openssl = set() + %> + + + # Basic platform detection + HOST_SYSTEM = $(shell uname | cut -f 1 -d_) + ifeq ($(SYSTEM),) + SYSTEM = $(HOST_SYSTEM) + endif + ifeq ($(SYSTEM),MSYS) + SYSTEM = MINGW32 + endif + ifeq ($(SYSTEM),MINGW64) + SYSTEM = MINGW32 + endif + + + ifndef BUILDDIR + BUILDDIR = . + endif + + HAS_GCC = $(shell which gcc > /dev/null 2> /dev/null && echo true || echo false) + HAS_CC = $(shell which cc > /dev/null 2> /dev/null && echo true || echo false) + HAS_CLANG = $(shell which clang > /dev/null 2> /dev/null && echo true || echo false) + + ifeq ($(HAS_CC),true) + DEFAULT_CC = cc + DEFAULT_CXX = c++ + else + ifeq ($(HAS_GCC),true) + DEFAULT_CC = gcc + DEFAULT_CXX = g++ + else + ifeq ($(HAS_CLANG),true) + DEFAULT_CC = clang + DEFAULT_CXX = clang++ + else + DEFAULT_CC = no_c_compiler + DEFAULT_CXX = no_c++_compiler + endif + endif + endif + + + BINDIR = $(BUILDDIR)/bins + OBJDIR = $(BUILDDIR)/objs + LIBDIR = $(BUILDDIR)/libs + GENDIR = $(BUILDDIR)/gens + + # Configurations + + VALID_CONFIG_opt = 1 + CC_opt = $(DEFAULT_CC) + CXX_opt = $(DEFAULT_CXX) + LD_opt = $(DEFAULT_CC) + LDXX_opt = $(DEFAULT_CXX) + CPPFLAGS_opt = -O2 + LDFLAGS_opt = + DEFINES_opt = NDEBUG + + VALID_CONFIG_basicprof = 1 + CC_basicprof = $(DEFAULT_CC) + CXX_basicprof = $(DEFAULT_CXX) + LD_basicprof = $(DEFAULT_CC) + LDXX_basicprof = $(DEFAULT_CXX) + CPPFLAGS_basicprof = -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC + LDFLAGS_basicprof = + DEFINES_basicprof = NDEBUG + + VALID_CONFIG_stapprof = 1 + CC_stapprof = $(DEFAULT_CC) + CXX_stapprof = $(DEFAULT_CXX) + LD_stapprof = $(DEFAULT_CC) + LDXX_stapprof = $(DEFAULT_CXX) + CPPFLAGS_stapprof = -O2 -DGRPC_STAP_PROFILER + LDFLAGS_stapprof = + DEFINES_stapprof = NDEBUG + + VALID_CONFIG_dbg = 1 + CC_dbg = $(DEFAULT_CC) + CXX_dbg = $(DEFAULT_CXX) + LD_dbg = $(DEFAULT_CC) + LDXX_dbg = $(DEFAULT_CXX) + CPPFLAGS_dbg = -O0 + LDFLAGS_dbg = + DEFINES_dbg = _DEBUG DEBUG + + VALID_CONFIG_mutrace = 1 + CC_mutrace = $(DEFAULT_CC) + CXX_mutrace = $(DEFAULT_CXX) + LD_mutrace = $(DEFAULT_CC) + LDXX_mutrace = $(DEFAULT_CXX) + CPPFLAGS_mutrace = -O0 + LDFLAGS_mutrace = -rdynamic + DEFINES_mutrace = _DEBUG DEBUG + + VALID_CONFIG_valgrind = 1 + REQUIRE_CUSTOM_LIBRARIES_valgrind = 1 + CC_valgrind = $(DEFAULT_CC) + CXX_valgrind = $(DEFAULT_CXX) + LD_valgrind = $(DEFAULT_CC) + LDXX_valgrind = $(DEFAULT_CXX) + CPPFLAGS_valgrind = -O0 + OPENSSL_CFLAGS_valgrind = -DPURIFY + LDFLAGS_valgrind = + DEFINES_valgrind = _DEBUG DEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=20 + + VALID_CONFIG_tsan = 1 + REQUIRE_CUSTOM_LIBRARIES_tsan = 1 + CC_tsan = clang + CXX_tsan = clang++ + LD_tsan = clang + LDXX_tsan = clang++ + CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-error=unused-command-line-argument + LDFLAGS_tsan = -fsanitize=thread + DEFINES_tsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=10 + + VALID_CONFIG_asan = 1 + REQUIRE_CUSTOM_LIBRARIES_asan = 1 + CC_asan = clang + CXX_asan = clang++ + LD_asan = clang + LDXX_asan = clang++ + CPPFLAGS_asan = -O0 -fsanitize=address -fno-omit-frame-pointer -Wno-error=unused-command-line-argument + LDFLAGS_asan = -fsanitize=address + DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 + + VALID_CONFIG_msan = 1 + REQUIRE_CUSTOM_LIBRARIES_msan = 1 + CC_msan = clang + CXX_msan = clang++-libc++ + LD_msan = clang + LDXX_msan = clang++-libc++ + CPPFLAGS_msan = -O0 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-error=unused-command-line-argument + OPENSSL_CFLAGS_msan = -DPURIFY + LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 + DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=4 + + VALID_CONFIG_ubsan = 1 + REQUIRE_CUSTOM_LIBRARIES_ubsan = 1 + CC_ubsan = clang + CXX_ubsan = clang++ + LD_ubsan = clang + LDXX_ubsan = clang++ + CPPFLAGS_ubsan = -O1 -fsanitize=undefined -fno-omit-frame-pointer -Wno-error=unused-command-line-argument + OPENSSL_CFLAGS_ubsan = -DPURIFY + LDFLAGS_ubsan = -fsanitize=undefined + DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 + + VALID_CONFIG_gcov = 1 + CC_gcov = gcc + CXX_gcov = g++ + LD_gcov = gcc + LDXX_gcov = g++ + CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage + LDFLAGS_gcov = -fprofile-arcs -ftest-coverage + DEFINES_gcov = _DEBUG DEBUG + + + # General settings. + # You may want to change these depending on your system. + + prefix ?= /usr/local + + PROTOC = protoc + DTRACE = dtrace + CONFIG ?= opt + CC = $(CC_$(CONFIG)) + CXX = $(CXX_$(CONFIG)) + LD = $(LD_$(CONFIG)) + LDXX = $(LDXX_$(CONFIG)) + AR = ar + ifeq ($(SYSTEM),Linux) + STRIP = strip --strip-unneeded + else + ifeq ($(SYSTEM),Darwin) + STRIP = strip -x + else + STRIP = strip + endif + endif + INSTALL = install + RM = rm -f + PKG_CONFIG = pkg-config + + ifndef VALID_CONFIG_$(CONFIG) + $(error Invalid CONFIG value '$(CONFIG)') + endif + + ifeq ($(SYSTEM),Linux) + TMPOUT = /dev/null + else + TMPOUT = `mktemp /tmp/test-out-XXXXXX` + endif + + # Detect if we can use C++11 + CXX11_CHECK_CMD = $(CXX) -std=c++11 -o $(TMPOUT) -c test/build/c++11.cc + HAS_CXX11 = $(shell $(CXX11_CHECK_CMD) 2> /dev/null && echo true || echo false) + + # The HOST compiler settings are used to compile the protoc plugins. + # In most cases, you won't have to change anything, but if you are + # cross-compiling, you can override these variables from GNU make's + # command line: make CC=cross-gcc HOST_CC=gcc + + HOST_CC = $(CC) + HOST_CXX = $(CXX) + HOST_LD = $(LD) + HOST_LDXX = $(LDXX) + + ifdef EXTRA_DEFINES + DEFINES += $(EXTRA_DEFINES) + endif + + CFLAGS += -std=c89 -pedantic + ifeq ($(HAS_CXX11),true) + CXXFLAGS += -std=c++11 + else + CXXFLAGS += -std=c++0x + endif + CPPFLAGS += -g -Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter + LDFLAGS += -g + + CPPFLAGS += $(CPPFLAGS_$(CONFIG)) + DEFINES += $(DEFINES_$(CONFIG)) INSTALL_PREFIX=\"$(prefix)\" + LDFLAGS += $(LDFLAGS_$(CONFIG)) + + ifneq ($(SYSTEM),MINGW32) + PIC_CPPFLAGS = -fPIC + CPPFLAGS += -fPIC + LDFLAGS += -fPIC + endif + + INCLUDES = . include $(GENDIR) + LDFLAGS += -Llibs/$(CONFIG) + + ifeq ($(SYSTEM),Darwin) + ifneq ($(wildcard /usr/local/ssl/include),) + INCLUDES += /usr/local/ssl/include + endif + ifneq ($(wildcard /opt/local/include),) + INCLUDES += /opt/local/include + endif + ifneq ($(wildcard /usr/local/include),) + INCLUDES += /usr/local/include + endif + LIBS = m z + ifneq ($(wildcard /usr/local/ssl/lib),) + LDFLAGS += -L/usr/local/ssl/lib + endif + ifneq ($(wildcard /opt/local/lib),) + LDFLAGS += -L/opt/local/lib + endif + ifneq ($(wildcard /usr/local/lib),) + LDFLAGS += -L/usr/local/lib + endif + endif + + ifeq ($(SYSTEM),Linux) + LIBS = rt m z pthread + LDFLAGS += -pthread + endif + + ifeq ($(SYSTEM),MINGW32) + LIBS = m z pthread + LDFLAGS += -pthread + endif + + GTEST_LIB = -Ithird_party/googletest/include -Ithird_party/googletest third_party/googletest/src/gtest-all.cc + GTEST_LIB += -lgflags + ifeq ($(V),1) + E = @: + Q = + else + E = @echo + Q = @ + endif + + VERSION = ${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build} + + CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) + CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) + + LDFLAGS += $(ARCH_FLAGS) + LDLIBS += $(addprefix -l, $(LIBS)) + LDLIBSXX += $(addprefix -l, $(LIBSXX)) + + HOST_CPPFLAGS = $(CPPFLAGS) + HOST_CFLAGS = $(CFLAGS) + HOST_CXXFLAGS = $(CXXFLAGS) + HOST_LDFLAGS = $(LDFLAGS) + HOST_LDLIBS = $(LDLIBS) + + + # These are automatically computed variables. + # There shouldn't be any need to change anything from now on. + + -include cache.mk + + CACHE_MK = + + HAS_PKG_CONFIG ?= $(shell command -v $(PKG_CONFIG) >/dev/null 2>&1 && echo true || echo false) + + ifeq ($(HAS_PKG_CONFIG), true) + CACHE_MK += HAS_PKG_CONFIG = true, + endif + + PC_TEMPLATE = prefix=$(prefix),\ + exec_prefix=${'\$${prefix}'},\ + includedir=${'\$${prefix}'}/include,\ + libdir=${'\$${exec_prefix}'}/lib,\ + ,\ + Name: $(PC_NAME),\ + Description: $(PC_DESCRIPTION),\ + Version: $(VERSION),\ + Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\ + Requires.private: $(PC_REQUIRES_PRIVATE),\ + Libs: -L${'\$${libdir}'} $(PC_LIB),\ + Libs.private: $(PC_LIBS_PRIVATE) + + # gpr .pc file + PC_NAME = gRPC Portable Runtime + PC_DESCRIPTION = gRPC Portable Runtime + PC_CFLAGS = -pthread + PC_REQUIRES_PRIVATE = + PC_LIBS_PRIVATE = -lpthread + PC_LIB = -lgpr + ifneq ($(SYSTEM),Darwin) + PC_LIBS_PRIVATE += -lrt + endif + GPR_PC_FILE := $(PC_TEMPLATE) + + ifeq ($(SYSTEM),MINGW32) + SHARED_EXT = dll + endif + ifeq ($(SYSTEM),Darwin) + SHARED_EXT = dylib + endif + ifeq ($(SHARED_EXT),) + SHARED_EXT = so.$(VERSION) + endif + + ifeq ($(wildcard .git),) + IS_GIT_FOLDER = false + else + IS_GIT_FOLDER = true + endif + + ifeq ($(SYSTEM),Linux) + OPENSSL_REQUIRES_DL = true + endif + + ifeq ($(SYSTEM),Darwin) + OPENSSL_REQUIRES_DL = true + endif + + ifeq ($(HAS_PKG_CONFIG),true) + OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl + OPENSSL_NPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.1 openssl + ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib + PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.0.0-alpha-3 protobuf + else # HAS_PKG_CONFIG + + ifeq ($(SYSTEM),MINGW32) + OPENSSL_LIBS = ssl32 eay32 + else + OPENSSL_LIBS = ssl crypto + endif + + OPENSSL_ALPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) + OPENSSL_NPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/openssl-npn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) + ZLIB_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS) + PROTOBUF_CHECK_CMD = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS) + + ifeq ($(OPENSSL_REQUIRES_DL),true) + OPENSSL_ALPN_CHECK_CMD += -ldl + OPENSSL_NPN_CHECK_CMD += -ldl + endif + + endif # HAS_PKG_CONFIG + + PERFTOOLS_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/perftools.c -lprofiler $(LDFLAGS) + + PROTOC_CHECK_CMD = which protoc > /dev/null + PROTOC_CHECK_VERSION_CMD = protoc --version | grep -q libprotoc.3 + DTRACE_CHECK_CMD = which dtrace > /dev/null + SYSTEMTAP_HEADERS_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/systemtap.c $(LDFLAGS) + ZOOKEEPER_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o $(TMPOUT) test/build/zookeeper.c $(LDFLAGS) -lzookeeper_mt + + ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) + HAS_SYSTEM_PERFTOOLS ?= $(shell $(PERFTOOLS_CHECK_CMD) 2> /dev/null && echo true || echo false) + ifeq ($(HAS_SYSTEM_PERFTOOLS),true) + DEFINES += GRPC_HAVE_PERFTOOLS + LIBS += profiler + CACHE_MK += HAS_SYSTEM_PERFTOOLS = true, + endif + endif + + HAS_SYSTEM_PROTOBUF_VERIFY = $(shell $(PROTOBUF_CHECK_CMD) 2> /dev/null && echo true || echo false) + ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) + HAS_SYSTEM_OPENSSL_ALPN ?= $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false) + ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) + HAS_SYSTEM_OPENSSL_NPN = true + CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = true, + else + HAS_SYSTEM_OPENSSL_NPN ?= $(shell $(OPENSSL_NPN_CHECK_CMD) 2> /dev/null && echo true || echo false) + endif + ifeq ($(HAS_SYSTEM_OPENSSL_NPN),true) + CACHE_MK += HAS_SYSTEM_OPENSSL_NPN = true, + endif + HAS_SYSTEM_ZLIB ?= $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false) + ifeq ($(HAS_SYSTEM_ZLIB),true) + CACHE_MK += HAS_SYSTEM_ZLIB = true, + endif + HAS_SYSTEM_PROTOBUF ?= $(HAS_SYSTEM_PROTOBUF_VERIFY) + ifeq ($(HAS_SYSTEM_PROTOBUF),true) + CACHE_MK += HAS_SYSTEM_PROTOBUF = true, + endif + else + # override system libraries if the config requires a custom compiled library + HAS_SYSTEM_OPENSSL_ALPN = false + HAS_SYSTEM_OPENSSL_NPN = false + HAS_SYSTEM_ZLIB = false + HAS_SYSTEM_PROTOBUF = false + endif + + HAS_PROTOC ?= $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false) + ifeq ($(HAS_PROTOC),true) + CACHE_MK += HAS_PROTOC = true, + HAS_VALID_PROTOC ?= $(shell $(PROTOC_CHECK_VERSION_CMD) 2> /dev/null && echo true || echo false) + ifeq ($(HAS_VALID_PROTOC),true) + CACHE_MK += HAS_VALID_PROTOC = true, + endif + else + HAS_VALID_PROTOC = false + endif + + # Check for Systemtap (https://sourceware.org/systemtap/), first by making sure <sys/sdt.h> is present + # in the system and secondly by checking for the "dtrace" binary (on Linux, this is part of the Systemtap + # distribution. It's part of the base system on BSD/Solaris machines). + ifndef HAS_SYSTEMTAP + HAS_SYSTEMTAP_HEADERS = $(shell $(SYSTEMTAP_HEADERS_CHECK_CMD) 2> /dev/null && echo true || echo false) + HAS_DTRACE = $(shell $(DTRACE_CHECK_CMD) 2> /dev/null && echo true || echo false) + HAS_SYSTEMTAP = false + ifeq ($(HAS_SYSTEMTAP_HEADERS),true) + ifeq ($(HAS_DTRACE),true) + HAS_SYSTEMTAP = true + endif + endif + endif + + ifeq ($(HAS_SYSTEMTAP),true) + CACHE_MK += HAS_SYSTEMTAP = true, + endif + + HAS_ZOOKEEPER = $(shell $(ZOOKEEPER_CHECK_CMD) 2> /dev/null && echo true || echo false) + + # Note that for testing purposes, one can do: + # make HAS_EMBEDDED_OPENSSL_ALPN=false + # to emulate the fact we do not have OpenSSL in the third_party folder. + ifeq ($(wildcard third_party/openssl/ssl/ssl.h),) + HAS_EMBEDDED_OPENSSL_ALPN = false + else + HAS_EMBEDDED_OPENSSL_ALPN = true + endif + + ifeq ($(wildcard third_party/zlib/zlib.h),) + HAS_EMBEDDED_ZLIB = false + else + HAS_EMBEDDED_ZLIB = true + endif + + ifeq ($(wildcard third_party/protobuf/src/google/protobuf/descriptor.pb.h),) + HAS_EMBEDDED_PROTOBUF = false + ifneq ($(HAS_VALID_PROTOC),true) + NO_PROTOC = true + endif + else + HAS_EMBEDDED_PROTOBUF = true + endif + + PC_REQUIRES_GRPC = gpr + PC_LIBS_GRPC = + + ifeq ($(HAS_SYSTEM_ZLIB),false) + ifeq ($(HAS_EMBEDDED_ZLIB),true) + ZLIB_DEP = $(LIBDIR)/$(CONFIG)/zlib/libz.a + CPPFLAGS += -Ithird_party/zlib + LDFLAGS += -L$(LIBDIR)/$(CONFIG)/zlib + else + DEP_MISSING += zlib + endif + else + ifeq ($(HAS_PKG_CONFIG),true) + CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib) + LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib) + PC_REQUIRES_GRPC += zlib + else + PC_LIBS_GRPC += -lz + endif + endif + + OPENSSL_PKG_CONFIG = false + + PC_REQUIRES_SECURE = + PC_LIBS_SECURE = + + ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) + ifeq ($(HAS_PKG_CONFIG),true) + OPENSSL_PKG_CONFIG = true + PC_REQUIRES_SECURE = openssl + CPPFLAGS := $(shell $(PKG_CONFIG) --cflags openssl) $(CPPFLAGS) + LDFLAGS_OPENSSL_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L openssl) + ifeq ($(SYSTEM),Linux) + ifneq ($(LDFLAGS_OPENSSL_PKG_CONFIG),) + LDFLAGS_OPENSSL_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L openssl | sed s/L/Wl,-rpath,/) + endif + endif + LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS) + else + LIBS_SECURE = $(OPENSSL_LIBS) + ifeq ($(OPENSSL_REQUIRES_DL),true) + LIBS_SECURE += dl + PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) + endif + endif + else + ifeq ($(HAS_EMBEDDED_OPENSSL_ALPN),true) + USE_SYSTEM_OPENSSL = false + OPENSSL_DEP = $(LIBDIR)/$(CONFIG)/openssl/libssl.a + OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/openssl/libssl.a $(LIBDIR)/$(CONFIG)/openssl/libcrypto.a + # need to prefix these to ensure overriding system libraries + CPPFLAGS := -Ithird_party/openssl/include $(CPPFLAGS) + LDFLAGS := -L$(LIBDIR)/$(CONFIG)/openssl $(LDFLAGS) + ifeq ($(OPENSSL_REQUIRES_DL),true) + LIBS_SECURE = dl + endif + else + ifeq ($(HAS_SYSTEM_OPENSSL_NPN),true) + USE_SYSTEM_OPENSSL = true + CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0 + LIBS_SECURE = $(OPENSSL_LIBS) + ifeq ($(OPENSSL_REQUIRES_DL),true) + LIBS_SECURE += dl + endif + else + NO_SECURE = true + endif + endif + endif + + ifeq ($(OPENSSL_PKG_CONFIG),true) + LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl) + else + LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) + endif + + # grpc .pc file + PC_NAME = gRPC + PC_DESCRIPTION = high performance general RPC framework + PC_CFLAGS = + PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) + PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) + PC_LIB = -lgrpc + GRPC_PC_FILE := $(PC_TEMPLATE) + + # gprc_unsecure .pc file + PC_NAME = gRPC unsecure + PC_DESCRIPTION = high performance general RPC framework without SSL + PC_CFLAGS = + PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) + PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) + PC_LIB = -lgrpc + GRPC_UNSECURE_PC_FILE := $(PC_TEMPLATE) + + # gprc_zookeeper .pc file + PC_NAME = gRPC zookeeper + PC_DESCRIPTION = gRPC's zookeeper plugin + PC_CFLAGS = + PC_REQUIRES_PRIVATE = + PC_LIBS_PRIVATE = -lzookeeper_mt + GRPC_ZOOKEEPER_PC_FILE := $(PC_TEMPLATE) + + PROTOBUF_PKG_CONFIG = false + + PC_REQUIRES_GRPCXX = + PC_LIBS_GRPCXX = + + CPPFLAGS := -Ithird_party/googletest/include $(CPPFLAGS) + + ifeq ($(HAS_SYSTEM_PROTOBUF),true) + ifeq ($(HAS_PKG_CONFIG),true) + PROTOBUF_PKG_CONFIG = true + PC_REQUIRES_GRPCXX = protobuf + CPPFLAGS := $(shell $(PKG_CONFIG) --cflags protobuf) $(CPPFLAGS) + LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L protobuf) + ifeq ($(SYSTEM),Linux) + ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),) + LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L protobuf | sed s/L/Wl,-rpath,/) + endif + endif + else + PC_LIBS_GRPCXX = -lprotobuf + endif + else + ifeq ($(HAS_EMBEDDED_PROTOBUF),true) + PROTOBUF_DEP = $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a + CPPFLAGS := -Ithird_party/protobuf/src $(CPPFLAGS) + LDFLAGS := -L$(LIBDIR)/$(CONFIG)/protobuf $(LDFLAGS) + PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc + else + NO_PROTOBUF = true + endif + endif + + LIBS_PROTOBUF = protobuf + LIBS_PROTOC = protoc protobuf + + HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC)) + + ifeq ($(PROTOBUF_PKG_CONFIG),true) + LDLIBS_PROTOBUF += $(shell $(PKG_CONFIG) --libs-only-l protobuf) + else + LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF)) + endif + + # grpc++ .pc file + PC_NAME = gRPC++ + PC_DESCRIPTION = C++ wrapper for gRPC + PC_CFLAGS = + PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) + PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) + PC_LIB = -lgrpc++ + GRPCXX_PC_FILE := $(PC_TEMPLATE) + + # grpc++_unsecure .pc file + PC_NAME = gRPC++ unsecure + PC_DESCRIPTION = C++ wrapper for gRPC without SSL + PC_CFLAGS = + PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) + PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) + PC_LIB = -lgrpc++ + GRPCXX_UNSECURE_PC_FILE := $(PC_TEMPLATE) + + ifeq ($(MAKECMDGOALS),clean) + NO_DEPS = true + endif + + INSTALL_OK = false + ifeq ($(HAS_VALID_PROTOC),true) + ifeq ($(HAS_SYSTEM_PROTOBUF_VERIFY),true) + INSTALL_OK = true + endif + endif + + .SECONDARY = %.pb.h %.pb.cc + + PROTOC_PLUGINS =\ + % for tgt in targets: + % if tgt.build == 'protoc': + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor + + ifeq ($(DEP_MISSING),) + all: static shared plugins\ + % for tgt in targets: + % if tgt.build == 'all': + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor + + dep_error: + @echo "You shouldn't see this message - all of your dependencies are correct." + else + all: dep_error git_update stop + + dep_error: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "You are missing system dependencies that are essential to build grpc," + @echo "and the third_party directory doesn't have them:" + @echo + @echo " $(DEP_MISSING)" + @echo + @echo "Installing the development packages for your system will solve" + @echo "this issue. Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + endif + + git_update: + ifeq ($(IS_GIT_FOLDER),true) + @echo "Additionally, since you are in a git clone, you can download the" + @echo "missing dependencies in third_party by running the following command:" + @echo + @echo " git submodule update --init" + @echo + endif + + openssl_dep_error: openssl_dep_message git_update stop + + protobuf_dep_error: protobuf_dep_message git_update stop + + protoc_dep_error: protoc_dep_message git_update stop + + openssl_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires OpenSSL." + @echo "Your system doesn't have it, and neither does the third_party directory." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + + protobuf_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires protobuf 3.0.0+" + @echo "Your system doesn't have it, and neither does the third_party directory." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + + protoc_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires protobuf-compiler 3.0.0+" + @echo "Your system doesn't have it, and neither does the third_party directory." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + + systemtap_dep_error: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "Under the '$(CONFIG)' configutation, the target you are trying " + @echo "to build requires systemtap 2.7+ (on Linux) or dtrace (on other " + @echo "platforms such as Solaris and *BSD). " + @echo + @echo "Please consult INSTALL to get more information." + @echo + + stop: + @false + + % for tgt in targets: + ${tgt.name}: $(BINDIR)/$(CONFIG)/${tgt.name} + % endfor + + run_dep_checks: + $(OPENSSL_ALPN_CHECK_CMD) || true + $(OPENSSL_NPN_CHECK_CMD) || true + $(ZLIB_CHECK_CMD) || true + $(PERFTOOLS_CHECK_CMD) || true + $(PROTOBUF_CHECK_CMD) || true + $(PROTOC_CHECK_VERSION_CMD) || true + $(ZOOKEEPER_CHECK_CMD) || true + + $(LIBDIR)/$(CONFIG)/zlib/libz.a: + $(E) "[MAKE] Building zlib" + $(Q)(cd third_party/zlib ; CC="$(CC)" CFLAGS="$(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(ZLIB_CFLAGS_EXTRA)" ./configure --static) + $(Q)$(MAKE) -C third_party/zlib clean + $(Q)$(MAKE) -C third_party/zlib + $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/zlib + $(Q)cp third_party/zlib/libz.a $(LIBDIR)/$(CONFIG)/zlib + + $(LIBDIR)/$(CONFIG)/openssl/libssl.a: + $(E) "[MAKE] Building openssl for $(SYSTEM)" + ifeq ($(SYSTEM),Darwin) + $(Q)(cd third_party/openssl ; CC="$(CC) $(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_EXTRA)" ./Configure darwin64-x86_64-cc) + else + ifeq ($(SYSTEM),MINGW32) + @echo "We currently don't have a good way to compile OpenSSL in-place under msys." + @echo "Please provide a OpenSSL in your mingw32 system." + @echo + @echo "Note that you can find a compatible version of the libraries here:" + @echo + @echo "http://slproweb.com/products/Win32OpenSSL.html" + @echo + @echo "If you decide to install that one, take the full version. The light" + @echo "version only contains compiled DLLs, without the development files." + @echo + @echo "When installing, chose to copy the OpenSSL dlls to the OpenSSL binaries" + @echo "directory. This way we'll link to them directly." + @echo + @echo "You can then re-start the build the following way:" + @echo + @echo " CPPFLAGS=-I/c/OpenSSL-Win64/include LDFLAGS=-L/c/OpenSSL-Win64 make" + @false + else + $(Q)(cd third_party/openssl ; CC="$(CC) $(PIC_CPPFLAGS) -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_EXTRA)" ./config no-asm $(OPENSSL_CONFIG_$(CONFIG))) + endif + endif + $(Q)$(MAKE) -j 1 -C third_party/openssl clean + $(Q)(unset CPPFLAGS; $(MAKE) -j 1 -C third_party/openssl build_crypto build_ssl) + $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/openssl + $(Q)cp third_party/openssl/libssl.a third_party/openssl/libcrypto.a $(LIBDIR)/$(CONFIG)/openssl + + third_party/protobuf/configure: + $(E) "[AUTOGEN] Preparing protobuf" + $(Q)(cd third_party/protobuf ; autoreconf -f -i -Wall,no-obsolete) + + $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure + $(E) "[MAKE] Building protobuf" + $(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) + $(Q)$(MAKE) -C third_party/protobuf clean + $(Q)$(MAKE) -C third_party/protobuf + $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/protobuf + $(Q)mkdir -p $(BINDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/.libs/libprotoc.a $(LIBDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/.libs/libprotobuf.a $(LIBDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/protoc $(BINDIR)/$(CONFIG)/protobuf + + static: static_c static_cxx + + static_c: pc_c pc_c_unsecure cache.mk pc_gpr pc_c_zookeeper\ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c' and not lib.get('external_deps', None): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor + static_zookeeper_libs + + + static_cxx: pc_cxx pc_cxx_unsecure pc_gpr cache.mk \ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c++': + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor + + + shared: shared_c shared_cxx + + shared_c: pc_c pc_c_unsecure pc_gpr cache.mk pc_c_zookeeper\ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c' and not lib.get('external_deps', None): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ + % endif + % endfor + shared_zookeeper_libs + + shared_cxx: pc_cxx pc_cxx_unsecure cache.mk\ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c++': + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ + % endif + % endfor + + + shared_csharp: shared_c \ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'csharp': + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ + % endif + % endfor + + ifeq ($(HAS_ZOOKEEPER),true) + static_zookeeper_libs:\ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c' and 'zookeeper' in lib.get('external_deps', []): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor + + shared_zookeeper_libs:\ + % for lib in libs: + % if lib.build == 'all' and lib.language == 'c' and 'zookeeper' in lib.get('external_deps', []): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ + % endif + % endfor + + else + + static_zookeeper_libs: + + shared_zookeeper_libs: + + endif + + grpc_csharp_ext: shared_csharp + + plugins: $(PROTOC_PLUGINS) + + privatelibs: privatelibs_c privatelibs_cxx + + privatelibs_c: \ + % for lib in libs: + % if lib.build == 'private' and lib.language == 'c' and not lib.get('external_deps', None): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor -pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc + pc_gpr: $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc -privatelibs_cxx: \ -% for lib in libs: -% if lib.build == 'private' and lib.language == 'c++': - $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ -% endif -% endfor + pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc + pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc + + ifeq ($(HAS_ZOOKEEPER),true) + pc_c_zookeeper: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_zookeeper.pc + else + pc_c_zookeeper: + endif -buildtests: buildtests_c buildtests_cxx + pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc -buildtests_c: privatelibs_c\ -% for tgt in targets: -% if tgt.build == 'test' and not tgt.language == 'c++': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor + pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc + privatelibs_cxx: \ + % for lib in libs: + % if lib.build == 'private' and lib.language == 'c++' and not lib.get('external_deps', None): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor -buildtests_cxx: privatelibs_cxx\ -% for tgt in targets: -% if tgt.build == 'test' and tgt.language == 'c++': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor + ifeq ($(HAS_ZOOKEEPER),true) + privatelibs_zookeeper: \ + % for lib in libs: + % if lib.build == 'private' and lib.language == 'c++' and zookeeper in lib.get('external_deps', []): + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ + % endif + % endfor -test: test_c test_cxx + else + privatelibs_zookeeper: + endif -flaky_test: flaky_test_c flaky_test_cxx -test_c: buildtests_c -% for tgt in targets: -% if tgt.build == 'test' and tgt.get('run', True) and not tgt.language == 'c++' and not tgt.get('flaky', False): - $(E) "[RUN] Testing ${tgt.name}" - $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) -% endif -% endfor + buildtests: buildtests_c buildtests_cxx buildtests_zookeeper + buildtests_c: privatelibs_c\ + % for tgt in targets: + % if tgt.build == 'test' and not tgt.language == 'c++' and not tgt.get('external_deps', None): + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor -flaky_test_c: buildtests_c -% for tgt in targets: -% if tgt.build == 'test' and tgt.get('run', True) and not tgt.language == 'c++' and tgt.get('flaky', False): - $(E) "[RUN] Testing ${tgt.name}" - $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) -% endif -% endfor + buildtests_cxx: buildtests_zookeeper privatelibs_cxx\ + % for tgt in targets: + % if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None): + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor -test_cxx: buildtests_cxx -% for tgt in targets: -% if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and not tgt.get('flaky', False): - $(E) "[RUN] Testing ${tgt.name}" - $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) -% endif -% endfor + ifeq ($(HAS_ZOOKEEPER),true) + buildtests_zookeeper: privatelibs_zookeeper\ + % for tgt in targets: + % if tgt.build == 'test' and tgt.language == 'c++' and 'zookeeper' in tgt.get('external_deps', []): + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor -flaky_test_cxx: buildtests_cxx -% for tgt in targets: -% if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and tgt.get('flaky', False): - $(E) "[RUN] Testing ${tgt.name}" - $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) -% endif -% endfor - - -test_python: static_c - $(E) "[RUN] Testing python code" - $(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG) - - -tools: tools_c tools_cxx - - -tools_c: privatelibs_c\ -% for tgt in targets: -% if tgt.build == 'tool' and not tgt.language=='c++': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor - - -tools_cxx: privatelibs_cxx\ -% for tgt in targets: -% if tgt.build == 'tool' and tgt.language=='c++': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor - - -buildbenchmarks: privatelibs\ -% for tgt in targets: -% if tgt.build == 'benchmark': - $(BINDIR)/$(CONFIG)/${tgt.name}\ -% endif -% endfor - - -benchmarks: buildbenchmarks - -strip: strip-static strip-shared - -strip-static: strip-static_c strip-static_cxx - -strip-shared: strip-shared_c strip-shared_cxx - - -# TODO(nnoble): the strip target is stripping in-place, instead -# of copying files in a temporary folder. -# This prevents proper debugging after running make install. - -strip-static_c: static_c -ifeq ($(CONFIG),opt) -% for lib in libs: -% if lib.language == "c": -% if lib.build == "all": - $(E) "[STRIP] Stripping lib${lib.name}.a" - $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a -% endif -% endif -% endfor -endif - -strip-static_cxx: static_cxx -ifeq ($(CONFIG),opt) -% for lib in libs: -% if lib.language == "c++": -% if lib.build == "all": - $(E) "[STRIP] Stripping lib${lib.name}.a" - $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a -% endif -% endif -% endfor -endif - -strip-shared_c: shared_c -ifeq ($(CONFIG),opt) -% for lib in libs: -% if lib.language == "c": -% if lib.build == "all": - $(E) "[STRIP] Stripping lib${lib.name}.so" - $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) -% endif -% endif -% endfor -endif - -strip-shared_cxx: shared_cxx -ifeq ($(CONFIG),opt) -% for lib in libs: -% if lib.language == "c++": -% if lib.build == "all": - $(E) "[STRIP] Stripping lib${lib.name}.so" - $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) -% endif -% endif -% endfor -endif - -strip-shared_csharp: shared_csharp -ifeq ($(CONFIG),opt) -% for lib in libs: -% if lib.language == "csharp": -% if lib.build == "all": - $(E) "[STRIP] Stripping lib${lib.name}.so" - $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) -% endif -% endif -% endfor -endif - -cache.mk:: - $(E) "[MAKE] Generating $@" - $(Q) echo "$(CACHE_MK)" | tr , '\n' >$@ - -$(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc: - $(E) "[MAKE] Generating $@" - $(Q) mkdir -p $(@D) - $(Q) echo "$(GPR_PC_FILE)" | tr , '\n' >$@ - -$(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc: - $(E) "[MAKE] Generating $@" - $(Q) mkdir -p $(@D) - $(Q) echo "$(GRPC_PC_FILE)" | tr , '\n' >$@ - -$(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc: - $(E) "[MAKE] Generating $@" - $(Q) mkdir -p $(@D) - $(Q) echo "$(GRPC_UNSECURE_PC_FILE)" | tr , '\n' >$@ - -$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc: - $(E) "[MAKE] Generating $@" - $(Q) mkdir -p $(@D) - $(Q) echo "$(GRPCXX_PC_FILE)" | tr , '\n' >$@ - -$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc: - $(E) "[MAKE] Generating $@" - $(Q) mkdir -p $(@D) - $(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@ - -% for p in protos: -ifeq ($(NO_PROTOC),true) -$(GENDIR)/${p}.pb.cc: protoc_dep_error -$(GENDIR)/${p}.grpc.pb.cc: protoc_dep_error -else -$(GENDIR)/${p}.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) - $(E) "[PROTOC] Generating protobuf CC file from $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(PROTOC) --cpp_out=$(GENDIR) $< - -$(GENDIR)/${p}.grpc.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) - $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(PROTOC) --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(BINDIR)/$(CONFIG)/grpc_cpp_plugin $< -endif - -% endfor - -ifeq ($(CONFIG),stapprof) -src/core/profiling/stap_timers.c: $(GENDIR)/src/core/profiling/stap_probes.h -ifeq ($(HAS_SYSTEMTAP),true) -$(GENDIR)/src/core/profiling/stap_probes.h: src/core/profiling/stap_probes.d - $(E) "[DTRACE] Compiling $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(DTRACE) -C -h -s $< -o $@ -else -$(GENDIR)/src/core/profiling/stap_probes.h: systemtap_dep_error stop -endif -endif - -$(OBJDIR)/$(CONFIG)/%.o : %.c - $(E) "[C] Compiling $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< - -$(OBJDIR)/$(CONFIG)/%.o : $(GENDIR)/%.pb.cc - $(E) "[CXX] Compiling $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< - -$(OBJDIR)/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc - $(E) "[HOSTCXX] Compiling $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< - -$(OBJDIR)/$(CONFIG)/%.o : %.cc - $(E) "[CXX] Compiling $<" - $(Q) mkdir -p `dirname $@` - $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< - -install: install_c install_cxx install-plugins install-certs verify-install - -install_c: install-headers_c install-static_c install-shared_c - -install_cxx: install-headers_cxx install-static_cxx install-shared_cxx - -install_csharp: install-shared_csharp install_c - -install_grpc_csharp_ext: install_csharp - -install-headers: install-headers_c install-headers_cxx - -install-headers_c: - $(E) "[INSTALL] Installing public C headers" - $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 - $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 - -install-headers_cxx: - $(E) "[INSTALL] Installing public C++ headers" - $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 - $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 - -install-static: install-static_c install-static_cxx - -install-static_c: static_c strip-static_c install-pkg-config_c -% for lib in libs: -% if lib.language == "c": -% if lib.build == "all": - $(E) "[INSTALL] Installing lib${lib.name}.a" - $(Q) $(INSTALL) -d $(prefix)/lib - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a -% endif -% endif -% endfor - -install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx -% for lib in libs: -% if lib.language == "c++": -% if lib.build == "all": - $(E) "[INSTALL] Installing lib${lib.name}.a" - $(Q) $(INSTALL) -d $(prefix)/lib - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a -% endif -% endif -% endfor - -<%def name="install_shared(lang_filter)">\ -% for lib in libs: -% if lib.language == lang_filter: -% if lib.build == "all": -ifeq ($(SYSTEM),MINGW32) - $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)" - $(Q) $(INSTALL) -d $(prefix)/lib - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT) - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a -else - $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)" - $(Q) $(INSTALL) -d $(prefix)/lib - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT) -ifneq ($(SYSTEM),Darwin) - $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so.${settings.version.major} - $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so -endif -endif -% endif -% endif -% endfor -ifneq ($(SYSTEM),MINGW32) -ifneq ($(SYSTEM),Darwin) - $(Q) ldconfig || true -endif -endif -</%def> - -install-shared_c: shared_c strip-shared_c install-pkg-config_c -${install_shared("c")} - -install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx -${install_shared("c++")} - -install-shared_csharp: shared_csharp strip-shared_csharp -${install_shared("csharp")} - -install-plugins: $(PROTOC_PLUGINS) -ifeq ($(SYSTEM),MINGW32) - $(Q) false -else - $(E) "[INSTALL] Installing grpc protoc plugins" -% for tgt in targets: -% if tgt.build == 'protoc': - $(Q) $(INSTALL) -d $(prefix)/bin - $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/${tgt.name} $(prefix)/bin/${tgt.name} -% endif -% endfor -endif - -install-pkg-config_c: pc_gpr pc_c pc_c_unsecure - $(E) "[INSTALL] Installing C pkg-config files" - $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc - -install-pkg-config_cxx: pc_cxx pc_cxx_unsecure - $(E) "[INSTALL] Installing C++ pkg-config files" - $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc - $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc - -install-certs: etc/roots.pem - $(E) "[INSTALL] Installing root certificates" - $(Q) $(INSTALL) -d $(prefix)/share/grpc - $(Q) $(INSTALL) etc/roots.pem $(prefix)/share/grpc/roots.pem - -verify-install: -ifeq ($(INSTALL_OK),true) - @echo "Your system looks ready to go." - @echo -else - @echo "We couldn't find protoc 3.0.0+ installed on your system. While this" - @echo "won't prevent grpc from working, you won't be able to compile" - @echo "and run any meaningful code with it." - @echo - @echo - @echo "Please download and install protobuf 3.0.0+ from:" - @echo - @echo " https://github.com/google/protobuf/releases" - @echo - @echo "Once you've done so, or if you think this message is in error," - @echo "you can re-run this check by doing:" - @echo - @echo " make verify-install" -endif - -clean: - $(E) "[CLEAN] Cleaning build directories." - $(Q) $(RM) -rf $(OBJDIR) $(LIBDIR) $(BINDIR) $(GENDIR) cache.mk - - -# The various libraries - -% for lib in libs: -${makelib(lib)} -% endfor - - -# All of the test targets, and protoc plugins - -% for tgt in targets: -${maketarget(tgt)} -% endfor - -<%def name="makelib(lib)"> -LIB${lib.name.upper()}_SRC = \\ - -% for src in lib.src: - ${proto_to_cc(src)} \\ - -% endfor - -% if "public_headers" in lib: -% if lib.language == "c++": -PUBLIC_HEADERS_CXX += \\ - -% else: -PUBLIC_HEADERS_C += \\ - -% endif -% for hdr in lib.public_headers: - ${hdr} \\ - -% endfor -% endif - -LIB${lib.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC)))) - -## If the library requires OpenSSL, let's add some restrictions. -% if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check': -ifeq ($(NO_SECURE),true) - -# You can't build secure libraries if you don't have OpenSSL. - -$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: openssl_dep_error - -% if lib.build == "all": -ifeq ($(SYSTEM),MINGW32) -$(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): openssl_dep_error -else -$(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): openssl_dep_error -endif -% endif - -else - -% if lib.language == 'c++': -ifeq ($(NO_PROTOBUF),true) - -# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. - -$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error - -% if lib.build == "all": -ifeq ($(SYSTEM),MINGW32) -$(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error -else -$(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error -endif -% endif - -else -% endif - -$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP) $(OPENSSL_DEP)\ -## The else here corresponds to the if secure earlier. -% else: -% if lib.language == 'c++': -ifeq ($(NO_PROTOBUF),true) - -# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. - -$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error - -% if lib.build == "all": -ifeq ($(SYSTEM),MINGW32) -$(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error -else -$(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error -endif -% endif - -else - -% endif -$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP)\ -% endif -% if lib.language == 'c++': - $(PROTOBUF_DEP)\ -% endif - $(LIB${lib.name.upper()}_OBJS) - $(E) "[AR] Creating $@" - $(Q) mkdir -p `dirname $@` - $(Q) rm -f $(LIBDIR)/$(CONFIG)/lib${lib.name}.a - $(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS) -% if lib.get('baselib', False): -% if lib.get('secure', 'check') == 'yes': - $(Q) rm -rf tmp-merge-${lib.name} - $(Q) mkdir tmp-merge-${lib.name} - $(Q) ( cd tmp-merge-${lib.name} ; $(AR) x ../$(LIBDIR)/$(CONFIG)/lib${lib.name}.a ) - $(Q) for l in $(OPENSSL_MERGE_LIBS) ; do ( cd tmp-merge-${lib.name} ; <%text>ar x ../$${l}</%text> ) ; done - $(Q) rm -f $(LIBDIR)/$(CONFIG)/lib${lib.name}.a tmp-merge-${lib.name}/__.SYMDEF* - $(Q) ar rcs $(LIBDIR)/$(CONFIG)/lib${lib.name}.a tmp-merge-${lib.name}/* - $(Q) rm -rf tmp-merge-${lib.name} -% endif -% endif -ifeq ($(SYSTEM),Darwin) - $(Q) ranlib $(LIBDIR)/$(CONFIG)/lib${lib.name}.a -endif - -<% - - if lib.language == 'c++': - ld = '$(LDXX)' - else: - ld = '$(LD)' - - out_base = '$(LIBDIR)/$(CONFIG)/' + lib.name - out_libbase = '$(LIBDIR)/$(CONFIG)/lib' + lib.name - - common = '$(LIB' + lib.name.upper() + '_OBJS) $(LDLIBS)' - - libs = '' - lib_deps = ' $(ZLIB_DEP)' - mingw_libs = '' - mingw_lib_deps = ' $(ZLIB_DEP)' - if lib.language == 'c++': - lib_deps += ' $(PROTOBUF_DEP)' - mingw_lib_deps += ' $(PROTOBUF_DEP)' - for dep in lib.get('deps', []): - libs = libs + ' -l' + dep - lib_deps = lib_deps + ' $(LIBDIR)/$(CONFIG)/lib' + dep + '.$(SHARED_EXT)' - mingw_libs = mingw_libs + ' -l' + dep + '-imp' - mingw_lib_deps = mingw_lib_deps + ' $(LIBDIR)/$(CONFIG)/' + dep + '.$(SHARED_EXT)' - - security = lib.get('secure', 'check') - if security == 'yes': - common = common + ' $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE)' - - if security in ['yes', 'check']: - for src in lib.src: - if not proto_re.match(src): - sources_that_need_openssl.add(src) - else: - for src in lib.src: - sources_that_don_t_need_openssl.add(src) - - if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check': - lib_deps = lib_deps + ' $(OPENSSL_DEP)' - mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)' - - if lib.language == 'c++': - common = common + ' $(LDLIBSXX) $(LDLIBS_PROTOBUF)' -%> - -% if lib.build == "all": -ifeq ($(SYSTEM),MINGW32) -${out_base}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${mingw_lib_deps} - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=${out_base}.def -Wl,--out-implib=${out_libbase}-imp.a -o ${out_base}.$(SHARED_EXT) ${common}${mingw_libs} -else -${out_libbase}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${lib_deps} - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` -ifeq ($(SYSTEM),Darwin) - $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name lib${lib.name}.$(SHARED_EXT) -dynamiclib -o ${out_libbase}.$(SHARED_EXT) ${common}${libs} -else - $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} -o ${out_libbase}.$(SHARED_EXT) ${common}${libs} - $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so.${settings.version.major} - $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so -endif -endif -% endif -% if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check': -## If the lib was secure, we have to close the Makefile's if that tested -## the presence of OpenSSL. - -endif -% endif -% if lib.language == 'c++': -## If the lib was C++, we have to close the Makefile's if that tested -## the presence of protobuf 3.0.0+ - -endif -% endif - -% if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check': -ifneq ($(NO_SECURE),true) -% endif -ifneq ($(NO_DEPS),true) --include $(LIB${lib.name.upper()}_OBJS:.o=.dep) -endif -% if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check': -endif -% endif -% for src in lib.src: -% if not proto_re.match(src) and any(proto_re.match(src2) for src2 in lib.src): -$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in lib.src if proto_re.match(src2))} -% endif -% endfor -</%def> - -<%def name="maketarget(tgt)"><% has_no_sources = not tgt.src %> -% if not has_no_sources: -${tgt.name.upper()}_SRC = \\ - -% for src in tgt.src: - ${proto_to_cc(src)} \\ - -% endfor - -${tgt.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC)))) -% endif -% if tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check': -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/${tgt.name}: openssl_dep_error - -else - -% endif -## -## We're not trying to add a dependency on building zlib and openssl here, -## as it's already done in the libraries. We're assuming that the build -## trickles down, and that a secure target requires a secure version of -## a library. -## -## That simplifies the codegen a bit, but prevents a fully defined Makefile. -## I can live with that. -## -% if tgt.build == 'protoc' or tgt.language == 'c++': - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. - -$(BINDIR)/$(CONFIG)/${tgt.name}: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/${tgt.name}: \ -% if not has_no_sources: -$(PROTOBUF_DEP) $(${tgt.name.upper()}_OBJS)\ -% endif -% else: -$(BINDIR)/$(CONFIG)/${tgt.name}: \ -% if not has_no_sources: -$(${tgt.name.upper()}_OBJS)\ -% endif -% endif -% for dep in tgt.deps: - $(LIBDIR)/$(CONFIG)/lib${dep}.a\ -% endfor - -% if tgt.language == "c++": -## C++ targets specificies. -% if tgt.build == 'protoc': - $(E) "[HOSTLD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) \ -% if not has_no_sources: -$(${tgt.name.upper()}_OBJS)\ -% endif -% else: - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) \ -% if not has_no_sources: -$(${tgt.name.upper()}_OBJS)\ -% endif -% endif -% else: -## C-only targets specificities. - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) \ -% if not has_no_sources: -$(${tgt.name.upper()}_OBJS)\ -% endif -% endif -% for dep in tgt.deps: - $(LIBDIR)/$(CONFIG)/lib${dep}.a\ -% endfor -% if tgt.language == "c++": -% if tgt.build == 'protoc': - $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC)\ -% else: - $(LDLIBSXX) $(LDLIBS_PROTOBUF)\ -% endif -% endif -% if tgt.build == 'protoc': - $(HOST_LDLIBS)\ -% else: - $(LDLIBS)\ -% endif -% if tgt.build == 'protoc': - $(HOST_LDLIBS_PROTOC)\ -% elif tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check': - $(LDLIBS_SECURE)\ -% endif -% if tgt.language == 'c++' and tgt.build == 'test': - $(GTEST_LIB)\ -% elif tgt.language == 'c++' and tgt.build == 'benchmark': - $(GTEST_LIB)\ -% endif - -o $(BINDIR)/$(CONFIG)/${tgt.name} -% if tgt.build == 'protoc' or tgt.language == 'c++': - -endif -% endif -% if tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check': - -endif -% endif - -% for src in tgt.src: -$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: \ -% for dep in tgt.deps: - $(LIBDIR)/$(CONFIG)/lib${dep}.a\ -% endfor - -% endfor -% if not has_no_sources: -deps_${tgt.name}: $(${tgt.name.upper()}_OBJS:.o=.dep) -% endif - -% if not has_no_sources: -% if tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check': -ifneq ($(NO_SECURE),true) -% endif -ifneq ($(NO_DEPS),true) --include $(${tgt.name.upper()}_OBJS:.o=.dep) -endif -% if tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check': -endif -% endif -% endif -</%def> - -ifneq ($(OPENSSL_DEP),) -# This is to ensure the embedded OpenSSL is built beforehand, properly -# installing headers to their final destination on the drive. We need this -# otherwise parallel compilation will fail if a source is compiled first. -% for src in sorted(sources_that_need_openssl): -% if src not in sources_that_don_t_need_openssl: -${src}: $(OPENSSL_DEP) -% endif -% endfor -endif - -.PHONY: all strip tools \ -dep_error openssl_dep_error openssl_dep_message git_update stop \ -buildtests buildtests_c buildtests_cxx \ -test test_c test_cxx \ -install install_c install_cxx \ -install-headers install-headers_c install-headers_cxx \ -install-shared install-shared_c install-shared_cxx \ -install-static install-static_c install-static_cxx \ -strip strip-shared strip-static \ -strip_c strip-shared_c strip-static_c \ -strip_cxx strip-shared_cxx strip-static_cxx \ -dep_c dep_cxx bins_dep_c bins_dep_cxx \ -clean + else + buildtests_zookeeper: + endif + + + test: test_c test_cxx test_zookeeper + + flaky_test: flaky_test_c flaky_test_cxx flaky_test_zookeeper + + test_c: buildtests_c + % for tgt in targets: + % 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): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + + flaky_test_c: buildtests_c + % for tgt in targets: + % 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): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + + test_cxx: test_zookeeper buildtests_cxx + % for tgt in targets: + % 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): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + + flaky_test_cxx: buildtests_cxx + % for tgt in targets: + % 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): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + + ifeq ($(HAS_ZOOKEEPER),true) + test_zookeeper: buildtests_zookeeper + % for tgt in targets: + % if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and not tgt.get('flaky', False) and 'zookeeper' in tgt.get('external_deps', []): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + + flaky_test_zookeeper: buildtests_zookeeper + % for tgt in targets: + % if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++' and tgt.get('flaky', False) and 'zookeeper' in tgt.get('external_deps', []): + $(E) "[RUN] Testing ${tgt.name}" + $(Q) $(BINDIR)/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 ) + % endif + % endfor + + else + test_zookeeper: + flaky_test_zookeeper: + endif + + + test_python: static_c + $(E) "[RUN] Testing python code" + $(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG) + + + tools: tools_c tools_cxx + + + tools_c: privatelibs_c\ + % for tgt in targets: + % if tgt.build == 'tool' and not tgt.language=='c++': + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor + + + tools_cxx: privatelibs_cxx\ + % for tgt in targets: + % if tgt.build == 'tool' and tgt.language=='c++': + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor + + + buildbenchmarks: privatelibs\ + % for tgt in targets: + % if tgt.build == 'benchmark': + $(BINDIR)/$(CONFIG)/${tgt.name}\ + % endif + % endfor + + + benchmarks: buildbenchmarks + + strip: strip-static strip-shared + + strip-static: strip-static_c strip-static_cxx + + strip-shared: strip-shared_c strip-shared_cxx + + + # TODO(nnoble): the strip target is stripping in-place, instead + # of copying files in a temporary folder. + # This prevents proper debugging after running make install. + + strip-static_c: static_c + ifeq ($(CONFIG),opt) + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if not lib.get('external_deps', None): + $(E) "[STRIP] Stripping lib${lib.name}.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a + % endif + % endif + % endif + % endfor + ifeq ($(HAS_ZOOKEEPER),true) + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if 'zookeeper' in lib.get('external_deps', []): + $(E) "[STRIP] Stripping lib${lib.name}.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a + % endif + % endif + % endif + % endfor + endif + endif + + strip-static_cxx: static_cxx + ifeq ($(CONFIG),opt) + % for lib in libs: + % if lib.language == "c++": + % if lib.build == "all": + $(E) "[STRIP] Stripping lib${lib.name}.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a + % endif + % endif + % endfor + endif + + strip-shared_c: shared_c + ifeq ($(CONFIG),opt) + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if not lib.get('external_deps', None): + $(E) "[STRIP] Stripping lib${lib.name}.so" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) + % endif + % endif + % endif + % endfor + ifeq ($(HAS_ZOOKEEPER),true) + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if 'zookeeper' in lib.get('external_deps', []): + $(E) "[STRIP] Stripping lib${lib.name}.so" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) + % endif + % endif + % endif + % endfor + endif + endif + + strip-shared_cxx: shared_cxx + ifeq ($(CONFIG),opt) + % for lib in libs: + % if lib.language == "c++": + % if lib.build == "all": + $(E) "[STRIP] Stripping lib${lib.name}.so" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) + % endif + % endif + % endfor + endif + + strip-shared_csharp: shared_csharp + ifeq ($(CONFIG),opt) + % for lib in libs: + % if lib.language == "csharp": + % if lib.build == "all": + $(E) "[STRIP] Stripping lib${lib.name}.so" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) + % endif + % endif + % endfor + endif + + cache.mk:: + $(E) "[MAKE] Generating $@" + $(Q) echo "$(CACHE_MK)" | tr , '\n' >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GPR_PC_FILE)" | tr , '\n' >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPC_PC_FILE)" | tr , '\n' >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPC_UNSECURE_PC_FILE)" | tr , '\n' >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_zookeeper.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPC_ZOOKEEPER_PC_FILE)" >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPCXX_PC_FILE)" | tr , '\n' >$@ + + $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@ + + % for p in protos: + ifeq ($(NO_PROTOC),true) + $(GENDIR)/${p}.pb.cc: protoc_dep_error + $(GENDIR)/${p}.grpc.pb.cc: protoc_dep_error + else + $(GENDIR)/${p}.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) --cpp_out=$(GENDIR) $< + + $(GENDIR)/${p}.grpc.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(BINDIR)/$(CONFIG)/grpc_cpp_plugin $< + endif + + % endfor + + ifeq ($(CONFIG),stapprof) + src/core/profiling/stap_timers.c: $(GENDIR)/src/core/profiling/stap_probes.h + ifeq ($(HAS_SYSTEMTAP),true) + $(GENDIR)/src/core/profiling/stap_probes.h: src/core/profiling/stap_probes.d + $(E) "[DTRACE] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(DTRACE) -C -h -s $< -o $@ + else + $(GENDIR)/src/core/profiling/stap_probes.h: systemtap_dep_error stop + endif + endif + + $(OBJDIR)/$(CONFIG)/%.o : %.c + $(E) "[C] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + + $(OBJDIR)/$(CONFIG)/%.o : $(GENDIR)/%.pb.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + + $(OBJDIR)/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc + $(E) "[HOSTCXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + + $(OBJDIR)/$(CONFIG)/%.o : %.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + + install: install_c install_cxx install-plugins install-certs verify-install + + install_c: install-headers_c install-static_c install-shared_c + + install_cxx: install-headers_cxx install-static_cxx install-shared_cxx + + install_csharp: install-shared_csharp install_c + + install_grpc_csharp_ext: install_csharp + + install-headers: install-headers_c install-headers_cxx + + install-headers_c: + $(E) "[INSTALL] Installing public C headers" + $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 + $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 + + install-headers_cxx: + $(E) "[INSTALL] Installing public C++ headers" + $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 + $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 + + install-static: install-static_c install-static_cxx + + install-static_c: static_c strip-static_c install-pkg-config_c + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if not lib.get('external_deps', None): + $(E) "[INSTALL] Installing lib${lib.name}.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a + % endif + % endif + % endif + % endfor + ifeq ($(HAS_ZOOKEEPER),true) + % for lib in libs: + % if lib.language == "c": + % if lib.build == "all": + % if 'zookeeper' in lib.get('external_deps', []): + $(E) "[INSTALL] Installing lib${lib.name}.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a + % endif + % endif + % endif + % endfor + endif + + install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx + % for lib in libs: + % if lib.language == "c++": + % if lib.build == "all": + $(E) "[INSTALL] Installing lib${lib.name}.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a + % endif + % endif + % endfor + + <%def name="install_shared(lang_filter)">\ + % for lib in libs: + % if lib.language == lang_filter: + % if lib.build == "all": + % if not lib.get('external_deps', None): + ifeq ($(SYSTEM),MINGW32) + $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a + else + $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT) + ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so.${settings.version.major} + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so + endif + endif + % endif + % endif + % endif + % endfor + ifeq ($(HAS_ZOOKEEPER),true) + % for lib in libs: + % if lib.language == lang_filter: + % if lib.build == "all": + % if 'zookeeper' in lib.get('external_deps', []): + ifeq ($(SYSTEM),MINGW32) + $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a + else + $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT) + ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so.${settings.version.major} + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so + endif + endif + % endif + % endif + % endif + % endfor + endif + ifneq ($(SYSTEM),MINGW32) + ifneq ($(SYSTEM),Darwin) + $(Q) ldconfig || true + endif + endif + </%def> + + install-shared_c: shared_c strip-shared_c install-pkg-config_c + ${install_shared("c")} + + install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx + ${install_shared("c++")} + + install-shared_csharp: shared_csharp strip-shared_csharp + ${install_shared("csharp")} + + install-plugins: $(PROTOC_PLUGINS) + ifeq ($(SYSTEM),MINGW32) + $(Q) false + else + $(E) "[INSTALL] Installing grpc protoc plugins" + % for tgt in targets: + % if tgt.build == 'protoc': + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/${tgt.name} $(prefix)/bin/${tgt.name} + % endif + % endfor + endif + + install-pkg-config_c: pc_gpr pc_c pc_c_unsecure pc_c_zookeeper + $(E) "[INSTALL] Installing C pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc + ifeq ($(HAS_ZOOKEEPER),true) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_zookeeper.pc $(prefix)/lib/pkgconfig/grpc_zookeeper.pc + endif + + install-pkg-config_cxx: pc_cxx pc_cxx_unsecure + $(E) "[INSTALL] Installing C++ pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc + + install-certs: etc/roots.pem + $(E) "[INSTALL] Installing root certificates" + $(Q) $(INSTALL) -d $(prefix)/share/grpc + $(Q) $(INSTALL) etc/roots.pem $(prefix)/share/grpc/roots.pem + + verify-install: + ifeq ($(INSTALL_OK),true) + @echo "Your system looks ready to go." + @echo + else + @echo "We couldn't find protoc 3.0.0+ installed on your system. While this" + @echo "won't prevent grpc from working, you won't be able to compile" + @echo "and run any meaningful code with it." + @echo + @echo + @echo "Please download and install protobuf 3.0.0+ from:" + @echo + @echo " https://github.com/google/protobuf/releases" + @echo + @echo "Once you've done so, or if you think this message is in error," + @echo "you can re-run this check by doing:" + @echo + @echo " make verify-install" + endif + + clean: + $(E) "[CLEAN] Cleaning build directories." + $(Q) $(RM) -rf $(OBJDIR) $(LIBDIR) $(BINDIR) $(GENDIR) cache.mk + + + # The various libraries + + % for lib in libs: + ${makelib(lib)} + % endfor + + + # All of the test targets, and protoc plugins + + % for tgt in targets: + ${maketarget(tgt)} + % endfor + + <%def name="makelib(lib)"> + LIB${lib.name.upper()}_SRC = \\ + + % for src in lib.src: + ${proto_to_cc(src)} \\ + + % endfor + + % if "public_headers" in lib: + % if lib.language == "c++": + PUBLIC_HEADERS_CXX += \\ + + % else: + PUBLIC_HEADERS_C += \\ + + % endif + % for hdr in lib.public_headers: + ${hdr} \\ + + % endfor + % endif + + LIB${lib.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC)))) + + ## If the library requires OpenSSL, let's add some restrictions. + % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check': + ifeq ($(NO_SECURE),true) + + # You can't build secure libraries if you don't have OpenSSL. + + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: openssl_dep_error + + % if lib.build == "all": + ifeq ($(SYSTEM),MINGW32) + $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): openssl_dep_error + else + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): openssl_dep_error + endif + % endif + + else + + % if lib.language == 'c++': + ifeq ($(NO_PROTOBUF),true) + + # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error + + % if lib.build == "all": + ifeq ($(SYSTEM),MINGW32) + $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error + else + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error + endif + % endif + + else + % endif + + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP) $(OPENSSL_DEP)\ + ## The else here corresponds to the if secure earlier. + % else: + % if lib.language == 'c++': + ifeq ($(NO_PROTOBUF),true) + + # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error + + % if lib.build == "all": + ifeq ($(SYSTEM),MINGW32) + $(LIBDIR)/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error + else + $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error + endif + % endif + + else + + % endif + $(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP)\ + % endif + % if lib.language == 'c++': + $(PROTOBUF_DEP)\ + % endif + $(LIB${lib.name.upper()}_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/lib${lib.name}.a + $(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS) + % if lib.get('baselib', False): + % if lib.get('secure', 'check') == True: + $(Q) rm -rf tmp-merge-${lib.name} + $(Q) mkdir tmp-merge-${lib.name} + $(Q) ( cd tmp-merge-${lib.name} ; $(AR) x ../$(LIBDIR)/$(CONFIG)/lib${lib.name}.a ) + $(Q) for l in $(OPENSSL_MERGE_LIBS) ; do ( cd tmp-merge-${lib.name} ; <%text>ar x ../$${l}</%text> ) ; done + $(Q) rm -f $(LIBDIR)/$(CONFIG)/lib${lib.name}.a tmp-merge-${lib.name}/__.SYMDEF* + $(Q) ar rcs $(LIBDIR)/$(CONFIG)/lib${lib.name}.a tmp-merge-${lib.name}/* + $(Q) rm -rf tmp-merge-${lib.name} + % endif + % endif + ifeq ($(SYSTEM),Darwin) + $(Q) ranlib $(LIBDIR)/$(CONFIG)/lib${lib.name}.a + endif + + <% + + if lib.language == 'c++': + ld = '$(LDXX)' + else: + ld = '$(LD)' + + out_base = '$(LIBDIR)/$(CONFIG)/' + lib.name + out_libbase = '$(LIBDIR)/$(CONFIG)/lib' + lib.name + + common = '$(LIB' + lib.name.upper() + '_OBJS) $(LDLIBS)' + + libs = '' + lib_deps = ' $(ZLIB_DEP)' + mingw_libs = '' + mingw_lib_deps = ' $(ZLIB_DEP)' + if lib.language == 'c++': + lib_deps += ' $(PROTOBUF_DEP)' + mingw_lib_deps += ' $(PROTOBUF_DEP)' + for dep in lib.get('deps', []): + libs = libs + ' -l' + dep + lib_deps = lib_deps + ' $(LIBDIR)/$(CONFIG)/lib' + dep + '.$(SHARED_EXT)' + mingw_libs = mingw_libs + ' -l' + dep + '-imp' + mingw_lib_deps = mingw_lib_deps + ' $(LIBDIR)/$(CONFIG)/' + dep + '.$(SHARED_EXT)' + + security = lib.get('secure', 'check') + if security == True: + common = common + ' $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE)' + + if security in [True, 'check']: + for src in lib.src: + if not proto_re.match(src): + sources_that_need_openssl.add(src) + else: + for src in lib.src: + sources_that_don_t_need_openssl.add(src) + + if 'zookeeper' in lib.get('external_deps', []): + libs = libs + ' -lzookeeper_mt' + + if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check': + lib_deps = lib_deps + ' $(OPENSSL_DEP)' + mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)' + + if lib.language == 'c++': + common = common + ' $(LDLIBSXX) $(LDLIBS_PROTOBUF)' + %> + + % if lib.build == "all": + ifeq ($(SYSTEM),MINGW32) + ${out_base}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${mingw_lib_deps} + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=${out_base}.def -Wl,--out-implib=${out_libbase}-imp.a -o ${out_base}.$(SHARED_EXT) ${common}${mingw_libs} + else + ${out_libbase}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${lib_deps} + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + ifeq ($(SYSTEM),Darwin) + $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name lib${lib.name}.$(SHARED_EXT) -dynamiclib -o ${out_libbase}.$(SHARED_EXT) ${common}${libs} + else + $(Q) ${ld} $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} -o ${out_libbase}.$(SHARED_EXT) ${common}${libs} + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so.${settings.version.major} + $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so + endif + endif + % endif + % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check': + ## If the lib was secure, we have to close the Makefile's if that tested + ## the presence of OpenSSL. + + endif + % endif + % if lib.language == 'c++': + ## If the lib was C++, we have to close the Makefile's if that tested + ## the presence of protobuf 3.0.0+ + + endif + % endif + + % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check': + ifneq ($(NO_SECURE),true) + % endif + ifneq ($(NO_DEPS),true) + -include $(LIB${lib.name.upper()}_OBJS:.o=.dep) + endif + % if lib.get('secure', 'check') == True or lib.get('secure', 'check') == 'check': + endif + % endif + % for src in lib.src: + % if not proto_re.match(src) and any(proto_re.match(src2) for src2 in lib.src): + $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in lib.src if proto_re.match(src2))} + % endif + % endfor + </%def> + + <%def name="maketarget(tgt)"><% has_no_sources = not tgt.src %> + % if not has_no_sources: + ${tgt.name.upper()}_SRC = \\ + + % for src in tgt.src: + ${proto_to_cc(src)} \\ + + % endfor + + ${tgt.name.upper()}_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC)))) + % endif + % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check': + ifeq ($(NO_SECURE),true) + + # You can't build secure targets if you don't have OpenSSL. + + $(BINDIR)/$(CONFIG)/${tgt.name}: openssl_dep_error + + else + + % endif + ## + ## We're not trying to add a dependency on building zlib and openssl here, + ## as it's already done in the libraries. We're assuming that the build + ## trickles down, and that a secure target requires a secure version of + ## a library. + ## + ## That simplifies the codegen a bit, but prevents a fully defined Makefile. + ## I can live with that. + ## + % if tgt.build == 'protoc' or tgt.language == 'c++': + + ifeq ($(NO_PROTOBUF),true) + + # You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + + $(BINDIR)/$(CONFIG)/${tgt.name}: protobuf_dep_error + + else + + $(BINDIR)/$(CONFIG)/${tgt.name}: \ + % if not has_no_sources: + $(PROTOBUF_DEP) $(${tgt.name.upper()}_OBJS)\ + % endif + % else: + $(BINDIR)/$(CONFIG)/${tgt.name}: \ + % if not has_no_sources: + $(${tgt.name.upper()}_OBJS)\ + % endif + % endif + % for dep in tgt.deps: + $(LIBDIR)/$(CONFIG)/lib${dep}.a\ + % endfor + + % if tgt.language == "c++": + ## C++ targets specificies. + % if tgt.build == 'protoc': + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) \ + % if not has_no_sources: + $(${tgt.name.upper()}_OBJS)\ + % endif + % else: + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) \ + % if not has_no_sources: + $(${tgt.name.upper()}_OBJS)\ + % endif + % endif + % else: + ## C-only targets specificities. + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) \ + % if not has_no_sources: + $(${tgt.name.upper()}_OBJS)\ + % endif + % endif + % for dep in tgt.deps: + $(LIBDIR)/$(CONFIG)/lib${dep}.a\ + % endfor + % if 'zookeeper' in tgt.get('external_deps', []): + -lzookeeper_mt\ + % endif + % if tgt.language == "c++": + % if tgt.build == 'protoc': + $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC)\ + % else: + $(LDLIBSXX) $(LDLIBS_PROTOBUF)\ + % endif + % endif + % if tgt.build == 'protoc': + $(HOST_LDLIBS)\ + % else: + $(LDLIBS)\ + % endif + % if tgt.build == 'protoc': + $(HOST_LDLIBS_PROTOC)\ + % elif tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check': + $(LDLIBS_SECURE)\ + % endif + % if tgt.language == 'c++' and tgt.build == 'test': + $(GTEST_LIB)\ + % elif tgt.language == 'c++' and tgt.build == 'benchmark': + $(GTEST_LIB)\ + % endif + -o $(BINDIR)/$(CONFIG)/${tgt.name} + % if tgt.build == 'protoc' or tgt.language == 'c++': + + endif + % endif + % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check': + + endif + % endif + + % for src in tgt.src: + $(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: \ + % for dep in tgt.deps: + $(LIBDIR)/$(CONFIG)/lib${dep}.a\ + % endfor + + % endfor + % if not has_no_sources: + deps_${tgt.name}: $(${tgt.name.upper()}_OBJS:.o=.dep) + % endif + + % if not has_no_sources: + % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check': + ifneq ($(NO_SECURE),true) + % endif + ifneq ($(NO_DEPS),true) + -include $(${tgt.name.upper()}_OBJS:.o=.dep) + endif + % if tgt.get('secure', 'check') == True or tgt.get('secure', 'check') == 'check': + endif + % endif + % endif + </%def> + + ifneq ($(OPENSSL_DEP),) + # This is to ensure the embedded OpenSSL is built beforehand, properly + # installing headers to their final destination on the drive. We need this + # otherwise parallel compilation will fail if a source is compiled first. + % for src in sorted(sources_that_need_openssl): + % if src not in sources_that_don_t_need_openssl: + ${src}: $(OPENSSL_DEP) + % endif + % endfor + endif + + .PHONY: all strip tools \ + dep_error openssl_dep_error openssl_dep_message git_update stop \ + buildtests buildtests_c buildtests_cxx \ + test test_c test_cxx \ + install install_c install_cxx \ + install-headers install-headers_c install-headers_cxx \ + install-shared install-shared_c install-shared_cxx \ + install-static install-static_c install-static_cxx \ + strip strip-shared strip-static \ + strip_c strip-shared_c strip-static_c \ + strip_cxx strip-shared_cxx strip-static_cxx \ + dep_c dep_cxx bins_dep_c bins_dep_cxx \ + clean diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template index d675a1a7f0..060961f401 100644 --- a/templates/gRPC.podspec.template +++ b/templates/gRPC.podspec.template @@ -1,155 +1,157 @@ -# GRPC CocoaPods podspec -# This file has been automatically generated from a template file. -# Please look at the templates directory instead. -# This file can be regenerated from the template by running -# tools/buildgen/generate_projects.sh - -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -<%! -bad_header_names = ('time.h', 'string.h') -def fix_header_name(name): - split_name = name.split('/') - if split_name[-1] in bad_header_names: - split_name[-1] = 'grpc_' + split_name[-1] - if split_name[0] == 'include': - split_name = split_name[1:] - return '/'.join(split_name) - -def grpc_files(libs): - out = [] - for lib in libs: - if lib.name in ("grpc", "gpr"): - out.extend(fix_header_name(h) for h in lib.get('headers', [])) - out.extend(fix_header_name(h) for h in lib.get('public_headers', [])) - out.extend(lib.get('src', [])) - return out; - -def grpc_private_headers(libs): - out = [] - for lib in libs: - if lib.name in ("grpc", "gpr"): - out.extend(lib.get('headers', [])) - return out -%> -Pod::Spec.new do |s| - s.name = 'gRPC' - s.version = '0.7.0' - s.summary = 'gRPC client library for iOS/OSX' - s.homepage = 'http://www.grpc.io' - s.license = 'New BSD' - s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } - - # s.source = { :git => 'https://github.com/grpc/grpc.git', - # :tag => 'release-0_10_0-objectivec-0.6.0' } - - s.ios.deployment_target = '6.0' - s.osx.deployment_target = '10.8' - s.requires_arc = true - - objc_dir = 'src/objective-c' - - # Reactive Extensions library for iOS. - s.subspec 'RxLibrary' do |ss| - src_dir = "#{objc_dir}/RxLibrary" - ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" - ss.private_header_files = "#{src_dir}/private/*.h" - ss.header_mappings_dir = "#{objc_dir}" - end - - # Core cross-platform gRPC library, written in C. - s.subspec 'C-Core' do |ss| - ss.source_files = ${(',\n' + 22*' ').join('\'%s\'' % f for f in grpc_files(libs))} - - ss.private_header_files = ${(',\n' + 30*' ').join('\'%s\'' % f for f in grpc_private_headers(libs))} - - ss.header_mappings_dir = '.' - - ss.requires_arc = false - ss.libraries = 'z' - ss.dependency 'OpenSSL', '~> 1.0.200' - - # ss.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' - end - - # This is a workaround for Cocoapods Issue #1437. - # It renames time.h and string.h to grpc_time.h and grpc_string.h. - # It needs to be here (top-level) instead of in the C-Core subspec because Cocoapods doesn't run - # prepare_command's of subspecs. +%YAML 1.2 +--- | + # GRPC CocoaPods podspec + # This file has been automatically generated from a template file. + # Please look at the templates directory instead. + # This file can be regenerated from the template by running + # tools/buildgen/generate_projects.sh + + # Copyright 2015, Google Inc. + # All rights reserved. # - # TODO(jcanizales): Try out others' solutions at Issue #1437. - s.prepare_command = <<-CMD - # Move contents of include up a level to avoid manually specifying include paths - cp -r "include/grpc" "." - - DIR_TIME="grpc/support" - BAD_TIME="$DIR_TIME/time.h" - GOOD_TIME="$DIR_TIME/grpc_time.h" - grep -rl "$BAD_TIME" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g - if [ -f "$BAD_TIME" ]; - then - mv -f "$BAD_TIME" "$GOOD_TIME" - fi - - DIR_STRING="src/core/support" - BAD_STRING="$DIR_STRING/string.h" - GOOD_STRING="$DIR_STRING/grpc_string.h" - grep -rl "$BAD_STRING" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g - if [ -f "$BAD_STRING" ]; - then - mv -f "$BAD_STRING" "$GOOD_STRING" - fi - CMD - - # Objective-C wrapper around the core gRPC library. - s.subspec 'GRPCClient' do |ss| - src_dir = "#{objc_dir}/GRPCClient" - ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" - ss.private_header_files = "#{src_dir}/private/*.h" - ss.header_mappings_dir = "#{objc_dir}" - - ss.dependency 'gRPC/C-Core' - ss.dependency 'gRPC/RxLibrary' - - # Certificates, to be able to establish TLS connections: - ss.resource_bundles = { 'gRPCCertificates' => ['etc/roots.pem'] } - end - - # RPC library for ProtocolBuffers, based on gRPC - s.subspec 'ProtoRPC' do |ss| - src_dir = "#{objc_dir}/ProtoRPC" - ss.source_files = "#{src_dir}/*.{h,m}" - ss.header_mappings_dir = "#{objc_dir}" - - ss.dependency 'gRPC/GRPCClient' - ss.dependency 'gRPC/RxLibrary' - ss.dependency 'Protobuf', '~> 3.0.0-alpha-3' + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are + # met: + # + # * Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # * Redistributions in binary form must reproduce the above + # copyright notice, this list of conditions and the following disclaimer + # in the documentation and/or other materials provided with the + # distribution. + # * Neither the name of Google Inc. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + <%! + bad_header_names = ('time.h', 'string.h') + def fix_header_name(name): + split_name = name.split('/') + if split_name[-1] in bad_header_names: + split_name[-1] = 'grpc_' + split_name[-1] + if split_name[0] == 'include': + split_name = split_name[1:] + return '/'.join(split_name) + + def grpc_files(libs): + out = [] + for lib in libs: + if lib.name in ("grpc", "gpr"): + out.extend(fix_header_name(h) for h in lib.get('headers', [])) + out.extend(fix_header_name(h) for h in lib.get('public_headers', [])) + out.extend(lib.get('src', [])) + return out; + + def grpc_private_headers(libs): + out = [] + for lib in libs: + if lib.name in ("grpc", "gpr"): + out.extend(lib.get('headers', [])) + return out + %> + Pod::Spec.new do |s| + s.name = 'gRPC' + s.version = '0.7.0' + s.summary = 'gRPC client library for iOS/OSX' + s.homepage = 'http://www.grpc.io' + s.license = 'New BSD' + s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } + + # s.source = { :git => 'https://github.com/grpc/grpc.git', + # :tag => 'release-0_10_0-objectivec-0.6.0' } + + s.ios.deployment_target = '6.0' + s.osx.deployment_target = '10.8' + s.requires_arc = true + + objc_dir = 'src/objective-c' + + # Reactive Extensions library for iOS. + s.subspec 'RxLibrary' do |ss| + src_dir = "#{objc_dir}/RxLibrary" + ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" + ss.private_header_files = "#{src_dir}/private/*.h" + ss.header_mappings_dir = "#{objc_dir}" + end + + # Core cross-platform gRPC library, written in C. + s.subspec 'C-Core' do |ss| + ss.source_files = ${(',\n' + 22*' ').join('\'%s\'' % f for f in grpc_files(libs))} + + ss.private_header_files = ${(',\n' + 30*' ').join('\'%s\'' % f for f in grpc_private_headers(libs))} + + ss.header_mappings_dir = '.' + + ss.requires_arc = false + ss.libraries = 'z' + ss.dependency 'OpenSSL', '~> 1.0.200' + + # ss.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' + end + + # This is a workaround for Cocoapods Issue #1437. + # It renames time.h and string.h to grpc_time.h and grpc_string.h. + # It needs to be here (top-level) instead of in the C-Core subspec because Cocoapods doesn't run + # prepare_command's of subspecs. + # + # TODO(jcanizales): Try out others' solutions at Issue #1437. + s.prepare_command = <<-CMD + # Move contents of include up a level to avoid manually specifying include paths + cp -r "include/grpc" "." + + DIR_TIME="grpc/support" + BAD_TIME="$DIR_TIME/time.h" + GOOD_TIME="$DIR_TIME/grpc_time.h" + grep -rl "$BAD_TIME" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g + if [ -f "$BAD_TIME" ]; + then + mv -f "$BAD_TIME" "$GOOD_TIME" + fi + + DIR_STRING="src/core/support" + BAD_STRING="$DIR_STRING/string.h" + GOOD_STRING="$DIR_STRING/grpc_string.h" + grep -rl "$BAD_STRING" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g + if [ -f "$BAD_STRING" ]; + then + mv -f "$BAD_STRING" "$GOOD_STRING" + fi + CMD + + # Objective-C wrapper around the core gRPC library. + s.subspec 'GRPCClient' do |ss| + src_dir = "#{objc_dir}/GRPCClient" + ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" + ss.private_header_files = "#{src_dir}/private/*.h" + ss.header_mappings_dir = "#{objc_dir}" + + ss.dependency 'gRPC/C-Core' + ss.dependency 'gRPC/RxLibrary' + + # Certificates, to be able to establish TLS connections: + ss.resource_bundles = { 'gRPCCertificates' => ['etc/roots.pem'] } + end + + # RPC library for ProtocolBuffers, based on gRPC + s.subspec 'ProtoRPC' do |ss| + src_dir = "#{objc_dir}/ProtoRPC" + ss.source_files = "#{src_dir}/*.{h,m}" + ss.header_mappings_dir = "#{objc_dir}" + + ss.dependency 'gRPC/GRPCClient' + ss.dependency 'gRPC/RxLibrary' + ss.dependency 'Protobuf', '~> 3.0.0-alpha-3' + end end -end diff --git a/templates/src/core/surface/version.c.template b/templates/src/core/surface/version.c.template index 936341c3cf..3e6840460f 100644 --- a/templates/src/core/surface/version.c.template +++ b/templates/src/core/surface/version.c.template @@ -1,41 +1,43 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* This file is autogenerated from: - templates/src/core/surface/version.c.template */ - -#include <grpc/grpc.h> - -const char *grpc_version_string(void) { - return "${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build}"; -} +%YAML 1.2 +--- | + /* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + /* This file is autogenerated from: + templates/src/core/surface/version.c.template */ + + #include <grpc/grpc.h> + + const char *grpc_version_string(void) { + return "${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build}"; + } diff --git a/templates/tools/doxygen/Doxyfile.c++.internal.template b/templates/tools/doxygen/Doxyfile.c++.internal.template index abaf52440a..c77f1f2d95 100644 --- a/templates/tools/doxygen/Doxyfile.c++.internal.template +++ b/templates/tools/doxygen/Doxyfile.c++.internal.template @@ -1,2 +1,4 @@ -<%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ -${gen_doxyfile(['grpc++'], 'C++', libs, True)} +%YAML 1.2 +--- | + <%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ + ${gen_doxyfile(['grpc++'], 'C++', libs, True)} diff --git a/templates/tools/doxygen/Doxyfile.c++.template b/templates/tools/doxygen/Doxyfile.c++.template index 6cedfa5fe5..04f7045e5a 100644 --- a/templates/tools/doxygen/Doxyfile.c++.template +++ b/templates/tools/doxygen/Doxyfile.c++.template @@ -1,2 +1,4 @@ -<%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ -${gen_doxyfile(['grpc++'], 'C++', libs, False)} +%YAML 1.2 +--- | + <%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ + ${gen_doxyfile(['grpc++'], 'C++', libs, False)} diff --git a/templates/tools/doxygen/Doxyfile.core.internal.template b/templates/tools/doxygen/Doxyfile.core.internal.template index 8d7963aa85..05be9d81aa 100644 --- a/templates/tools/doxygen/Doxyfile.core.internal.template +++ b/templates/tools/doxygen/Doxyfile.core.internal.template @@ -1,2 +1,4 @@ -<%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ -${gen_doxyfile(['grpc', 'gpr'], 'Core', libs, True)} +%YAML 1.2 +--- | + <%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ + ${gen_doxyfile(['grpc', 'gpr'], 'Core', libs, True)} diff --git a/templates/tools/doxygen/Doxyfile.core.template b/templates/tools/doxygen/Doxyfile.core.template index 69b189fdfd..8004294ec1 100644 --- a/templates/tools/doxygen/Doxyfile.core.template +++ b/templates/tools/doxygen/Doxyfile.core.template @@ -1,2 +1,4 @@ -<%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ -${gen_doxyfile(['grpc', 'gpr'], 'Core', libs, False)} +%YAML 1.2 +--- | + <%namespace file="Doxyfile.include" import="gen_doxyfile"/>\ + ${gen_doxyfile(['grpc', 'gpr'], 'Core', libs, False)} diff --git a/templates/tools/run_tests/sources_and_headers.json.template b/templates/tools/run_tests/sources_and_headers.json.template index 1c0e04283a..6f51ed7323 100644 --- a/templates/tools/run_tests/sources_and_headers.json.template +++ b/templates/tools/run_tests/sources_and_headers.json.template @@ -1,33 +1,35 @@ -<%! -import json -import os - -def proto_headers(src): - out = [] - for f in src: - name, ext = os.path.splitext(f) - if ext == '.proto': - out.extend(fmt % name for fmt in ['%s.grpc.pb.h', '%s.pb.h']) - return out - -def no_protos(src): - out = [] - for f in src: - if os.path.splitext(f)[1] != '.proto': - out.append(f) - return out -%> - -${json.dumps([{"name": tgt.name, - "language": tgt.language, - "src": sorted( - no_protos(tgt.src) + - tgt.get('public_headers', []) + - tgt.get('headers', [])), - "headers": sorted( - tgt.get('public_headers', []) + - tgt.get('headers', []) + - proto_headers(tgt.src)), - "deps": sorted(tgt.get('deps', []))} - for tgt in (targets + libs)], - sort_keys=True, indent=2)} +%YAML 1.2 +--- | + <%! + import json + import os + + def proto_headers(src): + out = [] + for f in src: + name, ext = os.path.splitext(f) + if ext == '.proto': + out.extend(fmt % name for fmt in ['%s.grpc.pb.h', '%s.pb.h']) + return out + + def no_protos(src): + out = [] + for f in src: + if os.path.splitext(f)[1] != '.proto': + out.append(f) + return out + %> + + ${json.dumps([{"name": tgt.name, + "language": tgt.language, + "src": sorted( + no_protos(tgt.src) + + tgt.get('public_headers', []) + + tgt.get('headers', [])), + "headers": sorted( + tgt.get('public_headers', []) + + tgt.get('headers', []) + + proto_headers(tgt.src)), + "deps": sorted(tgt.get('deps', []))} + for tgt in (targets + libs)], + sort_keys=True, indent=2)} diff --git a/templates/tools/run_tests/tests.json.template b/templates/tools/run_tests/tests.json.template index ffbf843235..655976ac86 100644 --- a/templates/tools/run_tests/tests.json.template +++ b/templates/tools/run_tests/tests.json.template @@ -1,12 +1,15 @@ -<%! -import json -%> - -${json.dumps([{"name": tgt.name, - "language": tgt.language, - "platforms": tgt.platforms, - "ci_platforms": tgt.ci_platforms, - "flaky": tgt.flaky} - for tgt in targets - if tgt.get('run', True) and tgt.build == 'test'], - sort_keys=True, indent=2)} +%YAML 1.2 +--- | + <%! + import json + %> + + ${json.dumps([{"name": tgt.name, + "language": tgt.language, + "platforms": tgt.platforms, + "ci_platforms": tgt.ci_platforms, + "exclude_configs": tgt.get("exclude_configs", []), + "flaky": tgt.flaky} + for tgt in targets + if tgt.get('run', True) and tgt.build == 'test'], + sort_keys=True, indent=2)} diff --git a/templates/vsprojects/Grpc.mak.template b/templates/vsprojects/Grpc.mak.template deleted file mode 100644 index 9d2f676d38..0000000000 --- a/templates/vsprojects/Grpc.mak.template +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -<%! - import re -%>\ -<%namespace file="packages.include" import="get_openssl,get_zlib"/>\ -<%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\ -<% - build_from_project_file = set(['gpr', - 'gpr_test_util', - 'grpc', - 'grpc_test_util', - 'grpc_test_util_unsecure', - 'grpc_unsecure', - 'grpc++', - 'grpc++_unsecure' - ]) - buildable_targets = [ target for target in targets + libs - if target.build in ['all', 'test', 'private', 'tool', 'benchmark'] and - target.language in ['c', 'c++'] and - all([(src.endswith('.c') or src.endswith('.cc') or src.endswith('.proto')) for src in target.src]) and - 'windows' in target.get('platforms', ['windows']) ] - c_test_targets = [ target for target in buildable_targets if target.build == 'test' and not target.language == 'c++' ] - cxx_test_targets = [ target for target in buildable_targets if target.build == 'test' and target.language == 'c++' ] -%>\ -# NMake file to build secondary gRPC targets on Windows. -# Use grpc.sln to solution to build the gRPC libraries. - -OUT_DIR=test_bin - -CC=cl.exe /nologo -LINK=link.exe /nologo -LIBTOOL=lib.exe /nologo /nodefaultlib - -REPO_ROOT=.. -OPENSSL_INCLUDES = .\packages\${get_openssl()}\build\native\include -ZLIB_INCLUDES = .\packages\${get_zlib()}\build\native\include -INCLUDES=/I$(REPO_ROOT) /I$(REPO_ROOT)\include /I$(OPENSSL_INCLUDES) /I$(ZLIB_INCLUDES) - -GFLAGS_INCLUDES = .\..\third_party\gflags\include -GTEST_INCLUDES = .\..\third_party\gtest\include -PROTOBUF_INCLUDES = .\..\third_party\protobuf\src -CXX_INCLUDES=/I$(GFLAGS_INCLUDES) /I$(GTEST_INCLUDES) /I$(PROTOBUF_INCLUDES) - -#_SCL_SECURE_NO_WARNINGS supresses a ton of "potentially unsafe use of std lib" warnings -DEFINES=/D WIN32 /D _LIB /D _USE_32BIT_TIME_T /D _UNICODE /D UNICODE /D _CRT_SECURE_NO_WARNINGS /D _SCL_SECURE_NO_WARNINGS - -#important options: /TC vs. /TP: compile as C vs. compile as C++ -CFLAGS=/c $(INCLUDES) /Z7 /W3 /WX- /sdl $(DEFINES) /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TC /analyze- -CXXFLAGS=/c $(INCLUDES) $(CXX_INCLUDES) /Z7 /W3 /WX- /sdl $(DEFINES) /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP /analyze- - -LFLAGS=/DEBUG /INCREMENTAL /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 - -OPENSSL_LIBS=.\packages\${get_openssl()}\build\native\lib\v120\Win32\Debug\static\ssleay32.lib .\packages\${get_openssl()}\build\native\lib\v120\Win32\Debug\static\libeay32.lib -WINSOCK_LIBS=ws2_32.lib -GENERAL_LIBS=advapi32.lib comdlg32.lib gdi32.lib kernel32.lib odbc32.lib odbccp32.lib ole32.lib oleaut32.lib shell32.lib user32.lib uuid.lib winspool.lib -ZLIB_LIBS=.\packages\${get_zlib()}\build\native\lib\v120\Win32\Debug\static\cdecl\zlib.lib -LIBS=$(OPENSSL_LIBS) $(ZLIB_LIBS) $(GENERAL_LIBS) $(WINSOCK_LIBS) - -#shlwapi.lib provides PathMatchSpec() for gflags in windows -GFLAGS_LIBS=.\..\third_party\gflags\lib\Debug\gflags.lib shlwapi.lib -GTEST_LIBS=.\..\third_party\gtest\msvc\gtest\Debug\gtestd.lib -PROTOBUF_LIBS=.\..\third_party\protobuf\vsprojects\Debug\libprotobuf.lib -CXX_LIBS=$(GFLAGS_LIBS) $(GTEST_LIBS) $(PROTOBUF_LIBS) - -all: buildtests - -tools: - -tools_c: - -tools_cxx: - -$(OUT_DIR): - mkdir $(OUT_DIR) - -build_libs: \ -% for target in buildable_targets: -% if target.build == 'private' or target.build == 'all': -% if target.name in build_from_project_file: -build_${target.name} \ -% else: -Debug\${target.name}.lib \ -% endif -% endif -% endfor - -buildtests: buildtests_c buildtests_cxx - -buildtests_c: \ -% for target in c_test_targets: -${target.name}.exe \ -% endfor - - echo All C tests built. - -buildtests_cxx: \ -% for target in cxx_test_targets: -${target.name}.exe \ -% endfor - - echo All C++ tests built. - -% for target in buildable_targets: - -## replace all .proto includes with .pb.cc / .grpc.pb.cc -%if target.src: -%for source in target.src: -%if source.endswith(".proto"): -<% - src_name_parts = source.split(".") - target.src.append(src_name_parts[0] + ".pb.cc") - target.src.append(src_name_parts[0] + ".grpc.pb.cc") -%>\ -%endif -%endfor -%endif -## remove all .proto includes -<% - target.src = [item for item in target.src if not re.search('([^/]+)\.proto$', item)] -%>\ -%if target.name in build_from_project_file: -build_${target.name}: - msbuild grpc.sln /t:${target.name} /p:Configuration=Debug /p:Linkage-grpc_dependencies_zlib=static -%else: -%if target.build == 'private': -Debug\${target.name}.lib: \ -%else: -${target.name}.exe: \ -%for dep in target.get('deps', []): -%if dep in build_from_project_file: -build_${dep} \ -%else: -Debug\${dep}.lib \ -%endif -%endfor -%endif -$(OUT_DIR) - echo Building ${target.name} -%if target.language == 'c++': - $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ \ -%else: - $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ \ -%endif -%for source in target.src: -$(REPO_ROOT)\${to_windows_path(source)} \ -%endfor -%if not target.src: -$(REPO_ROOT)\${to_windows_path('vsprojects/dummy.c')} \ -%endif - -%if target.build == 'private': - $(LIBTOOL) /OUT:"Debug\${target.name}.lib" \ -%else: - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\${target.name}.exe" \ -%for dep in target.get('deps', []): -Debug\${dep}.lib \ -%endfor -%if target.language == 'c++': -$(CXX_LIBS) \ -%endif -$(LIBS) \ -%endif -%if not target.src: -$(OUT_DIR)\dummy.obj \ -%else: -%for source in target.src: -%if re.search('([^/]+)\.c{1,2}$', source): -$(OUT_DIR)\${re.search('([^/]+)\.c{1,2}$', source).group(1)}.obj \ -%endif -%endfor -%endif - -%if target.build != 'private': -${target.name}: ${target.name}.exe - echo Running ${target.name} - $(OUT_DIR)\${target.name}.exe -%endif -%endif -% endfor diff --git a/templates/vsprojects/buildtests_c.sln.template b/templates/vsprojects/buildtests_c.sln.template new file mode 100644 index 0000000000..eb314a3097 --- /dev/null +++ b/templates/vsprojects/buildtests_c.sln.template @@ -0,0 +1,7 @@ +%YAML 1.2 +--- | + <%namespace file="sln_defs.include" import="gen_solution"/>\ + <% + solution_projects = [p for p in vsprojects if p.build != 'protoc' and p.language in ['c', 'c++'] and not (p.language == 'c++' and p.build in ['private', 'test'])] + %>\ + ${gen_solution(solution_projects, use_dlls='yes')} diff --git a/templates/vsprojects/cpptest.props.template b/templates/vsprojects/cpptest.props.template new file mode 100644 index 0000000000..14169d6ddf --- /dev/null +++ b/templates/vsprojects/cpptest.props.template @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <ItemDefinitionGroup> + <ClCompile> + <AdditionalIncludeDirectories>$(SolutionDir)\..;$(SolutionDir)\..\include;$(SolutionDir)\..\third_party\protobuf\src;$(SolutionDir)\..\third_party\gtest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <WarningLevel>EnableAllWarnings</WarningLevel> + </ClCompile> + <Link> + <AdditionalDependencies>grpc++_test_util.lib;grpc_test_util.lib;gpr_test_util.lib;gtestd.lib;gflags.lib;shlwapi.lib;gpr.lib;grpc.lib;grpc++.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\gtest\msvc\gtest\Debug;$(SolutionDir)\..\third_party\gflags\lib\Debug;$(SolutionDir)\..\Debug;$(SolutionDir)\..\packages\grpc.dependencies.openssl.${vspackages_dict['grpc.dependencies.openssl'].version}\build\native\lib\$(PlatformToolset)\$(Platform)\$(Configuration)\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemGroup /> +</Project> diff --git a/templates/vsprojects/global.props.template b/templates/vsprojects/global.props.template new file mode 100644 index 0000000000..1e906bbf2b --- /dev/null +++ b/templates/vsprojects/global.props.template @@ -0,0 +1,16 @@ +%YAML 1.2 +--- | + <?xml version="1.0" encoding="utf-8"?> + <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <ItemDefinitionGroup> + <ClCompile> + <AdditionalIncludeDirectories>$(SolutionDir)\..;$(SolutionDir)\..\include;$(SolutionDir)\..\third_party\protobuf\src;${';'.join('$(SolutionDir)\\packages\\%s.%s\\build\\native\\include' % (p.name, p.version) for p in vspackages)};%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32_WINNT=0x600;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <WarningLevel>EnableAllWarnings</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup /> + </Project> diff --git a/templates/vsprojects/gpr/gpr.vcxproj.filters.template b/templates/vsprojects/gpr/gpr.vcxproj.filters.template deleted file mode 100644 index 779a36bf0f..0000000000 --- a/templates/vsprojects/gpr/gpr.vcxproj.filters.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ -${gen_filters('gpr', libs)} diff --git a/templates/vsprojects/gpr/gpr.vcxproj.template b/templates/vsprojects/gpr/gpr.vcxproj.template deleted file mode 100644 index ca217c2762..0000000000 --- a/templates/vsprojects/gpr/gpr.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('gpr', libs)} diff --git a/templates/vsprojects/gpr_test_util/gpr_test_util.vcxproj.template b/templates/vsprojects/gpr_test_util/gpr_test_util.vcxproj.template deleted file mode 100644 index d412d646e7..0000000000 --- a/templates/vsprojects/gpr_test_util/gpr_test_util.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('gpr_test_util', libs)}
\ No newline at end of file diff --git a/templates/vsprojects/grpc++/grpc++.vcxproj.filters.template b/templates/vsprojects/grpc++/grpc++.vcxproj.filters.template deleted file mode 100644 index 70e0a6c13b..0000000000 --- a/templates/vsprojects/grpc++/grpc++.vcxproj.filters.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ -${gen_filters('grpc++', libs)} diff --git a/templates/vsprojects/grpc++/grpc++.vcxproj.template b/templates/vsprojects/grpc++/grpc++.vcxproj.template deleted file mode 100644 index 5f13591b2d..0000000000 --- a/templates/vsprojects/grpc++/grpc++.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc++', libs)}
\ No newline at end of file diff --git a/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters.template b/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters.template index 465a3d76f5..99f707ad41 100644 --- a/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters.template +++ b/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ -${gen_filters('grpc++_unsecure', libs)} +%YAML 1.2 +--- | + <%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ + ${gen_filters('grpc++_unsecure', libs)} diff --git a/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.template b/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.template index 62016ccc0a..a6a7b2c108 100644 --- a/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.template +++ b/templates/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc++_unsecure', libs)}
\ No newline at end of file +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc++_unsecure', libs)} diff --git a/templates/vsprojects/grpc.sln.template b/templates/vsprojects/grpc.sln.template index 5c5e28c885..dbbb2c2ad1 100644 --- a/templates/vsprojects/grpc.sln.template +++ b/templates/vsprojects/grpc.sln.template @@ -1,5 +1,7 @@ -<%namespace file="sln_defs.include" import="gen_solution"/>\ -<% -solution_projects = [p for p in vsprojects if p.build != 'protoc' and p.language in ['c', 'c++']] -%>\ -${gen_solution(solution_projects, use_dlls='yes')}
\ No newline at end of file +%YAML 1.2 +--- | + <%namespace file="sln_defs.include" import="gen_solution"/>\ + <% + solution_projects = [p for p in vsprojects if p.build not in ['protoc', 'test'] and p.language in ['c', 'c++'] and p.vs_proj_dir == '.' and not (p.build == 'private' and p.language == 'c++')] + %>\ + ${gen_solution(solution_projects, use_dlls='yes')} diff --git a/templates/vsprojects/grpc/grpc.vcxproj.filters.template b/templates/vsprojects/grpc/grpc.vcxproj.filters.template deleted file mode 100644 index 9607d23324..0000000000 --- a/templates/vsprojects/grpc/grpc.vcxproj.filters.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ -${gen_filters('grpc', libs)} diff --git a/templates/vsprojects/grpc/grpc.vcxproj.template b/templates/vsprojects/grpc/grpc.vcxproj.template deleted file mode 100644 index a19214e0a4..0000000000 --- a/templates/vsprojects/grpc/grpc.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc', libs, packages=['openssl','zlib'])}
\ No newline at end of file diff --git a/templates/vsprojects/grpc/packages.config.template b/templates/vsprojects/grpc/packages.config.template deleted file mode 100644 index 66ac90eb08..0000000000 --- a/templates/vsprojects/grpc/packages.config.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../packages.include" import="gen_packages_config"/>\ -${gen_packages_config(['openssl','zlib'])}
\ No newline at end of file diff --git a/templates/vsprojects/grpc_cpp_plugin/grpc_cpp_plugin.vcxproj.template b/templates/vsprojects/grpc_cpp_plugin/grpc_cpp_plugin.vcxproj.template index 49ab1b7385..980bc589e4 100644 --- a/templates/vsprojects/grpc_cpp_plugin/grpc_cpp_plugin.vcxproj.template +++ b/templates/vsprojects/grpc_cpp_plugin/grpc_cpp_plugin.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_cpp_plugin', targets, configuration_type='Application')} +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc_cpp_plugin', targets)} diff --git a/templates/vsprojects/grpc_csharp_ext.sln.template b/templates/vsprojects/grpc_csharp_ext.sln.template index eb33ce2eb6..1013d7bd97 100644 --- a/templates/vsprojects/grpc_csharp_ext.sln.template +++ b/templates/vsprojects/grpc_csharp_ext.sln.template @@ -1,5 +1,7 @@ -<%namespace file="sln_defs.include" import="gen_solution"/>\ -<% -solution_projects = [p for p in vsprojects if p.build == 'all' and p.language in ['c', 'csharp']] -%>\ -${gen_solution(solution_projects, use_dlls='only')}
\ No newline at end of file +%YAML 1.2 +--- | + <%namespace file="sln_defs.include" import="gen_solution"/>\ + <% + solution_projects = [p for p in vsprojects if p.build == 'all' and p.language in ['c', 'csharp']] + %>\ + ${gen_solution(solution_projects, use_dlls='only')} diff --git a/templates/vsprojects/grpc_csharp_ext/grpc_csharp_ext.vcxproj.template b/templates/vsprojects/grpc_csharp_ext/grpc_csharp_ext.vcxproj.template deleted file mode 100644 index 25b02b8c82..0000000000 --- a/templates/vsprojects/grpc_csharp_ext/grpc_csharp_ext.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_csharp_ext', libs, configuration_type = 'DynamicLibrary', props=['zlib-dll'], packages=['openssl','zlib'])} diff --git a/templates/vsprojects/grpc_csharp_ext/packages.config.template b/templates/vsprojects/grpc_csharp_ext/packages.config.template deleted file mode 100644 index 4953b6451c..0000000000 --- a/templates/vsprojects/grpc_csharp_ext/packages.config.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../packages.include" import="gen_packages_config"/>\ -${gen_packages_config(['openssl','zlib'])}
\ No newline at end of file diff --git a/templates/vsprojects/grpc_csharp_plugin/grpc_csharp_plugin.vcxproj.template b/templates/vsprojects/grpc_csharp_plugin/grpc_csharp_plugin.vcxproj.template index 9d94e27c3a..2c677d7f75 100644 --- a/templates/vsprojects/grpc_csharp_plugin/grpc_csharp_plugin.vcxproj.template +++ b/templates/vsprojects/grpc_csharp_plugin/grpc_csharp_plugin.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_csharp_plugin', targets, configuration_type='Application')} +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc_csharp_plugin', targets)} diff --git a/templates/vsprojects/grpc_objective_c_plugin/grpc_objective_c_plugin.vcxproj.template b/templates/vsprojects/grpc_objective_c_plugin/grpc_objective_c_plugin.vcxproj.template index 794c7310c5..a31f3e383a 100644 --- a/templates/vsprojects/grpc_objective_c_plugin/grpc_objective_c_plugin.vcxproj.template +++ b/templates/vsprojects/grpc_objective_c_plugin/grpc_objective_c_plugin.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_objective_c_plugin', targets, configuration_type='Application')} +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc_objective_c_plugin', targets)} diff --git a/templates/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj.template b/templates/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj.template deleted file mode 100644 index 409e88f289..0000000000 --- a/templates/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_plugin_support', libs)} diff --git a/templates/vsprojects/grpc_protoc_plugins.sln.template b/templates/vsprojects/grpc_protoc_plugins.sln.template index 1c171f4f94..06f182b601 100644 --- a/templates/vsprojects/grpc_protoc_plugins.sln.template +++ b/templates/vsprojects/grpc_protoc_plugins.sln.template @@ -1,5 +1,7 @@ -<%namespace file="sln_defs.include" import="gen_solution"/>\ -<% -solution_projects = [p for p in vsprojects if p.build == 'protoc'] -%>\ -${gen_solution(solution_projects)}
\ No newline at end of file +%YAML 1.2 +--- | + <%namespace file="sln_defs.include" import="gen_solution"/>\ + <% + solution_projects = [p for p in vsprojects if p.build == 'protoc'] + %>\ + ${gen_solution(solution_projects)} diff --git a/templates/vsprojects/grpc_python_plugin/grpc_python_plugin.vcxproj.template b/templates/vsprojects/grpc_python_plugin/grpc_python_plugin.vcxproj.template index 977e015d6d..c2ef396842 100644 --- a/templates/vsprojects/grpc_python_plugin/grpc_python_plugin.vcxproj.template +++ b/templates/vsprojects/grpc_python_plugin/grpc_python_plugin.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_python_plugin', targets, configuration_type='Application')} +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc_python_plugin', targets)} diff --git a/templates/vsprojects/grpc_ruby_plugin/grpc_ruby_plugin.vcxproj.template b/templates/vsprojects/grpc_ruby_plugin/grpc_ruby_plugin.vcxproj.template index ecf42ae04e..e7c094f5f9 100644 --- a/templates/vsprojects/grpc_ruby_plugin/grpc_ruby_plugin.vcxproj.template +++ b/templates/vsprojects/grpc_ruby_plugin/grpc_ruby_plugin.vcxproj.template @@ -1,2 +1,4 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_ruby_plugin', targets, configuration_type='Application')} +%YAML 1.2 +--- | + <%namespace file="../vcxproj_defs.include" import="gen_project"/>\ + ${gen_project('grpc_ruby_plugin', targets)} diff --git a/templates/vsprojects/grpc_test_util/grpc_test_util.vcxproj.template b/templates/vsprojects/grpc_test_util/grpc_test_util.vcxproj.template deleted file mode 100644 index 3781023837..0000000000 --- a/templates/vsprojects/grpc_test_util/grpc_test_util.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_test_util', libs)}
\ No newline at end of file diff --git a/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters.template b/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters.template deleted file mode 100644 index aef6465915..0000000000 --- a/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj.filters_defs.include" import="gen_filters"/>\ -${gen_filters('grpc_unsecure', libs)} diff --git a/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.template b/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.template deleted file mode 100644 index fd827d191a..0000000000 --- a/templates/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../vcxproj_defs.include" import="gen_project"/>\ -${gen_project('grpc_unsecure', libs, packages=['zlib'])}
\ No newline at end of file diff --git a/templates/vsprojects/grpc_unsecure/packages.config.template b/templates/vsprojects/grpc_unsecure/packages.config.template deleted file mode 100644 index 1337b5df2b..0000000000 --- a/templates/vsprojects/grpc_unsecure/packages.config.template +++ /dev/null @@ -1,2 +0,0 @@ -<%namespace file="../packages.include" import="gen_packages_config"/>\ -${gen_packages_config(['zlib'])}
\ No newline at end of file diff --git a/templates/vsprojects/openssl.props.template b/templates/vsprojects/openssl.props.template new file mode 100644 index 0000000000..32c3604405 --- /dev/null +++ b/templates/vsprojects/openssl.props.template @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <ItemDefinitionGroup>
+ <Link>
+ <AdditionalDependencies>ssleay32.lib;libeay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(SolutionDir)\packages\grpc.dependencies.openssl.${vspackages_dict['grpc.dependencies.openssl'].version}\build\native\lib\$(PlatformToolset)\$(Platform)\$(Configuration)\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup />
+</Project>
diff --git a/templates/vsprojects/packages.include b/templates/vsprojects/packages.include index 2eba362179..f3c57634f9 100644 --- a/templates/vsprojects/packages.include +++ b/templates/vsprojects/packages.include @@ -1,54 +1,53 @@ -<%! - openssl_pkg_name = "grpc.dependencies.openssl" - openssl_pkg_version = "1.0.2.2" - zlib_pkg_name = "grpc.dependencies.zlib" - zlib_pkg_version = "1.2.8.9" -%>\ -<%def name="get_openssl()">${openssl_pkg_name}.${openssl_pkg_version}</%def>\ -<%def name="get_zlib()">${zlib_pkg_name}.${zlib_pkg_version}</%def>\ +<%def name="get_name(vspackages, package)">${''.join('%s.%s' % (p.name, p.version) for p in vspackages if p.name == package)}</%def> <%def name="gen_packages_config(packages)">\ <?xml version="1.0" encoding="utf-8"?> <packages> - % if 'openssl' in packages: - <package id="${openssl_pkg_name}" version="${openssl_pkg_version}" targetFramework="Native" /> - <package id="${openssl_pkg_name}.redist" version="${openssl_pkg_version}" targetFramework="Native" /> - % endif - % if 'zlib' in packages: - <package id="${zlib_pkg_name}" version="${zlib_pkg_version}" targetFramework="Native" /> - <package id="${zlib_pkg_name}.redist" version="${zlib_pkg_version}" targetFramework="Native" /> - % endif + % for package in vspackages: + % if packages == 'all' or package.name in packages: + <package id="${package.name}" version="${package.version}" targetFramework="Native" /> + % if package.redist: + <package id="${package.name}.redist" version="${package.version}" targetFramework="Native" /> + % endif + % endif + % endfor </packages> </%def>\ -<%def name="gen_package_props(packages)">\ -% if 'openssl' in packages: - <Import Project="..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.props" Condition="Exists('..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.props')" /> -% endif +<%def name="gen_package_props(packages, repo_root)">\ + % for package in vspackages: + % if packages == 'all' or package.name in packages: + % if package.props: + <Import Project="${repo_root}\vsprojects\packages\${package.name}.${package.version}\build\native\${package.name}.props" Condition="Exists('${repo_root}\vsprojects\packages\${package.name}.${package.version}\build\native\${package.version}.props')" /> + % endif + % endif + % endfor </%def>\ -<%def name="gen_package_targets(packages)">\ - % if 'zlib' in packages: - <Import Project="..\packages\${zlib_pkg_name}.redist.${zlib_pkg_version}\build\native\${zlib_pkg_name}.redist.targets" Condition="Exists('..\packages\${zlib_pkg_name}.redist.${zlib_pkg_version}\build\native\${zlib_pkg_name}.redist.targets')" /> - <Import Project="..\packages\${zlib_pkg_name}.${zlib_pkg_version}\build\native\${zlib_pkg_name}.targets" Condition="Exists('..\packages\${zlib_pkg_name}.${zlib_pkg_version}\build\native\${zlib_pkg_name}.targets')" /> - %endif - % if 'openssl' in packages: - <Import Project="..\packages\${openssl_pkg_name}.redist.${openssl_pkg_version}\build\native\${openssl_pkg_name}.redist.targets" Condition="Exists('..\packages\${openssl_pkg_name}.redist.${openssl_pkg_version}\build\native\${openssl_pkg_name}.redist.targets')" /> - <Import Project="..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.targets" Condition="Exists('..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.targets')" /> - % endif +<%def name="gen_package_targets(packages, repo_root)">\ + % for package in vspackages: + % if packages == 'all' or package.name in packages: + % if package.redist: + <Import Project="${repo_root}\vsprojects\packages\${package.name}.redist.${package.version}\build\native\${package.name}.redist.targets" Condition="Exists('${repo_root}\vsprojects\packages\${package.name}.redist.${package.version}\build\native\grpc.dependencies\${package.name}.targets')" /> + % endif + <Import Project="${repo_root}\vsprojects\packages\${package.name}.${package.version}\build\native\${package.name}.targets" Condition="Exists('${repo_root}\vsprojects\packages\${package.name}.${package.version}\build\native\grpc.dependencies\${package.name}.targets')" /> + % endif + % endfor </%def>\ -<%def name="gen_package_ensure(packages)">\ - % if packages: +<%def name="check_file_inner(file)"><Error Condition="!Exists('${file}')" Text="$([System.String]::Format('$(ErrorText)', '${file}')" /></%def>\ +<%def name="check_file(file, repo_root, package)">${check_file_inner(file % {'root':repo_root, 'name':package.name, 'version':package.version})}</%def>\ +<%def name="gen_package_ensure(packages, repo_root)">\ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> - % if 'zlib' in packages: - <Error Condition="!Exists('..\packages\${zlib_pkg_name}.redist.${zlib_pkg_version}\build\native\${zlib_pkg_name}.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\${zlib_pkg_name}.redist.${zlib_pkg_version}\build\native\${zlib_pkg_name}.redist.targets'))" /> - <Error Condition="!Exists('..\packages\${zlib_pkg_name}.${zlib_pkg_version}\build\native\${zlib_pkg_name}.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\${zlib_pkg_name}.${zlib_pkg_version}\build\native\${zlib_pkg_name}.targets'))" /> - %endif - % if 'openssl' in packages: - <Error Condition="!Exists('..\packages\${openssl_pkg_name}.redist.${openssl_pkg_version}\build\native\${openssl_pkg_name}.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\${openssl_pkg_name}.redist.${openssl_pkg_version}\build\native\${openssl_pkg_name}.redist.targets'))" /> - <Error Condition="!Exists('..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.props'))" /> - <Error Condition="!Exists('..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\${openssl_pkg_name}.${openssl_pkg_version}\build\native\${openssl_pkg_name}.targets'))" /> - %endif + % for package in vspackages: + % if packages == 'all' or package.name in packages: + % if package.redist: + ${check_file('%(root)s\\vsprojects\\packages\\%(name)s.redist.%(version)s\\build\\native\\%(name)s.redist.targets', repo_root, package)} + % endif + % if package.props: + ${check_file('%(root)s\\vsprojects\\packages\\%(name)s.%(version)s\\build\\native\\%(name)s.props', repo_root, package)} + % endif + ${check_file('%(root)s\\vsprojects\\packages\\%(name)s.%(version)s\\build\\native\\%(name)s.targets', repo_root, package)} + % endif + % endfor </Target> - %endif </%def>\ diff --git a/templates/vsprojects/protobuf.props.template b/templates/vsprojects/protobuf.props.template new file mode 100644 index 0000000000..48f9431c1c --- /dev/null +++ b/templates/vsprojects/protobuf.props.template @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <ItemDefinitionGroup>
+ <Link>
+ <AdditionalDependencies>libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\protobuf\cmake\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup />
+</Project>
diff --git a/templates/vsprojects/protoc.props.template b/templates/vsprojects/protoc.props.template new file mode 100644 index 0000000000..a869005dae --- /dev/null +++ b/templates/vsprojects/protoc.props.template @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <ItemDefinitionGroup>
+ <Link>
+ <AdditionalDependencies>libprotoc.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\protobuf\cmake\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup />
+</Project>
diff --git a/templates/vsprojects/sln_defs.include b/templates/vsprojects/sln_defs.include index 224f2cd1d5..a0489411c6 100644 --- a/templates/vsprojects/sln_defs.include +++ b/templates/vsprojects/sln_defs.include @@ -14,7 +14,7 @@ MinimumVisualStudioVersion = 10.0.40219.1 cpp_proj_type = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}" %>\ % for project in solution_projects: -Project("${cpp_proj_type}") = "${project.name}", "${project.name}\${project.name}.vcxproj", "${project.vs_project_guid}" +Project("${cpp_proj_type}") = "${project.name}", "vcxproj\${project.vs_proj_dir}\${project.name}\${project.name}.vcxproj", "${project.vs_project_guid}" ProjectSection(myProperties) = preProject % if project.is_library: lib = "True" @@ -53,7 +53,7 @@ Global ${project.vs_project_guid}.Debug|x64.ActiveCfg = Debug|x64 ${project.vs_project_guid}.Release|Win32.ActiveCfg = Release|Win32 ${project.vs_project_guid}.Release|x64.ActiveCfg = Release|x64 - % if project.get('dll', 'no') != 'only': + % if project.get('dll', False) != 'only': ${project.vs_project_guid}.Debug|Win32.Build.0 = Debug|Win32 ${project.vs_project_guid}.Debug|x64.Build.0 = Debug|x64 ${project.vs_project_guid}.Release|Win32.Build.0 = Release|Win32 @@ -61,7 +61,7 @@ Global % endif % endif % if use_dlls == 'yes': - % if project.get('dll', 'no') == 'no': + % if project.get('dll', False) == False: ${project.vs_project_guid}.Debug-DLL|Win32.ActiveCfg = Debug|Win32 ${project.vs_project_guid}.Debug-DLL|Win32.Build.0 = Debug|Win32 ${project.vs_project_guid}.Debug-DLL|x64.ActiveCfg = Debug|x64 @@ -82,7 +82,7 @@ Global % endif % endif % if use_dlls == 'only': - % if project.get('dll', 'no') == 'yes': + % if project.get('dll', False) == True: ${project.vs_project_guid}.Debug|Win32.ActiveCfg = Debug-DLL|Win32 ${project.vs_project_guid}.Debug|Win32.Build.0 = Debug-DLL|Win32 ${project.vs_project_guid}.Debug|x64.ActiveCfg = Debug-DLL|x64 diff --git a/templates/vsprojects/vcxproj.filters_defs.include b/templates/vsprojects/vcxproj.filters_defs.include index 787d66eeff..d1ebb56709 100644 --- a/templates/vsprojects/vcxproj.filters_defs.include +++ b/templates/vsprojects/vcxproj.filters_defs.include @@ -5,7 +5,7 @@ def calc_to_filter(path): return '\\'.join(path.split('/')[:-1]) %>\ -<%def name="get_repo_root()">..\..</%def>\ +<%def name="get_repo_root(proj)">${'..\..\..' + ('\..' if proj.vs_proj_dir != '.' else '')}</%def>\ <%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\ <%def name="to_filter(path)">${calc_to_filter(path)}</%def>\ <%def name="filter_to_guid(proj, filter)">${re.sub('(........)(....)(....)(....)', r'\1-\2-\3-\4-', hashlib.md5(''.join([filter, proj])).hexdigest())}</%def>\ @@ -17,7 +17,7 @@ % if project.get('src',[]): <ItemGroup> % for src_name in project.src: - <ClCompile Include="${get_repo_root()}\${to_windows_path(src_name)}"> + <ClCompile Include="${get_repo_root(project)}\${to_windows_path(src_name)}"> <Filter>${to_filter(src_name)}</Filter> </ClCompile> % endfor @@ -26,7 +26,7 @@ % if project.get('public_headers',[]): <ItemGroup> % for public_header in project.public_headers: - <ClInclude Include="${get_repo_root()}\${to_windows_path(public_header)}"> + <ClInclude Include="${get_repo_root(project)}\${to_windows_path(public_header)}"> <Filter>${to_filter(public_header)}</Filter> </ClInclude> % endfor @@ -35,7 +35,7 @@ % if project.get('headers',[]): <ItemGroup> % for header in project.headers: - <ClInclude Include="${get_repo_root()}\${to_windows_path(header)}"> + <ClInclude Include="${get_repo_root(project)}\${to_windows_path(header)}"> <Filter>${to_filter(header)}</Filter> </ClInclude> % endfor diff --git a/templates/vsprojects/vcxproj.template b/templates/vsprojects/vcxproj.template new file mode 100644 index 0000000000..ecf113b4a8 --- /dev/null +++ b/templates/vsprojects/vcxproj.template @@ -0,0 +1,18 @@ +%YAML 1.2 +--- +foreach: vsprojects +output_name: ${selected.vs_proj_dir}/${selected.name}/${selected.name}.vcxproj +template: | + <%namespace file="vcxproj_defs.include" import="gen_project"/>\ + ${gen_project(selected.name, vsprojects)} +--- +foreach: vsprojects +output_name: ${selected.vs_proj_dir}/${selected.name}/${selected.name}.vcxproj.filters +template: | + <%namespace file="vcxproj.filters_defs.include" import="gen_filters"/>\ + ${gen_filters(selected.name, vsprojects)} +--- +output_name: grpc/packages.config +template: | + <%namespace file="packages.include" import="gen_packages_config"/>\ + ${gen_packages_config('all')} diff --git a/templates/vsprojects/vcxproj_defs.include b/templates/vsprojects/vcxproj_defs.include index 507c9a5204..17fbf56232 100644 --- a/templates/vsprojects/vcxproj_defs.include +++ b/templates/vsprojects/vcxproj_defs.include @@ -1,8 +1,7 @@ <%namespace file="packages.include" import="gen_package_props,gen_package_targets,gen_package_ensure"/>\ -<%def name="get_repo_root()">..\..</%def>\ <%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\ <%def name="get_subsystem(is_library)">${'Windows' if is_library else 'Console'}</%def>\ -<%def name="gen_project(name, collection, configuration_type = None, project_guid = None, props = [], packages = [])">\ +<%def name="gen_project(name, collection)">\ <% target = None for p in vsprojects: @@ -11,31 +10,36 @@ for t in collection: if t.name == name: target = t - if not configuration_type and target: - print target.name - if target.build == 'test' or target.build == 'tool': - configuration_type = 'Application' - if not configuration_type: - configuration_type = 'StaticLibrary' - if not project_guid: - project_guid = project.vs_project_guid + props = project.vs_props + packages = project.vs_packages + configuration_type = project.vs_config_type + project_guid = project.vs_project_guid if target.build == 'test' and target.language == 'c++': props.extend(['cpptest']) if configuration_type == 'Application': if target.build == 'protoc': - props.extend(['protoc']) + props.extend(['protoc', 'protobuf']) else: - props.extend(['winsock', 'protobuf', 'zlib', 'openssl']) + if target.language == 'c++': + props.extend(['protobuf']) + props.extend(['winsock', 'zlib']) + packages.extend(['grpc.dependencies.zlib']) + if target.get('secure', 'check'): + props.extend(['openssl']) + packages.extend(['grpc.dependencies.openssl']) else: props.extend(['winsock']) props.extend(['global']) - dll = project.get('dll', 'no') + props = sorted(list(set(props))) + packages = sorted(list(set(packages))) + dll = project.get('dll', False) + repo_root = '..\..\..' + ('\..' if project.vs_proj_dir != '.' else '') %>\ <?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> -${gen_package_props(packages)}\ +${gen_package_props(packages, repo_root)}\ <ItemGroup Label="ProjectConfigurations"> -% if dll == 'yes': +% if dll and dll != 'only': <ProjectConfiguration Include="Debug-DLL|Win32"> <Configuration>Debug-DLL</Configuration> <Platform>Win32</Platform> @@ -94,7 +98,7 @@ ${gen_package_props(packages)}\ <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> -% if dll == 'yes': +% if dll and dll != 'only': <PropertyGroup Condition="'$(Configuration)'=='Debug-DLL'" Label="Configuration"> <ConfigurationType>${configuration_type}</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> @@ -113,31 +117,24 @@ ${gen_package_props(packages)}\ <ImportGroup Label="PropertySheets"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> % for prop in props: - <Import Project="..\${prop}.props" /> + <Import Project="${repo_root}\vsprojects\${prop}.props" /> % endfor </ImportGroup> <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)'=='Debug'"> +% for config in ['Debug', 'Release']:# + (['Debug-DLL', 'Release-DLL'] if dll and dll != 'only' else []): + <PropertyGroup Condition="'$(Configuration)'=='${config}'"> <TargetName>${name}</TargetName> - % if "zlib" in packages: - <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib> - <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib> - % endif - % if "openssl" in packages: - <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl> - % endif - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)'=='Release'"> - <TargetName>${name}</TargetName> - % if "zlib" in packages: - <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib> - <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib> - % endif - % if "openssl" in packages: - <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl> - % endif + % for package in vspackages: + % if packages == 'all' or package.name in packages: + % if package.get('linkage', None) is not None: + <Linkage-${package.name.replace('.', '_')}>${package.linkage}</Linkage-${package.name.replace('.', '_')}> + % endif + <Configuration-${package.name.replace('.', '_')}>Debug</Configuration-${package.name.replace('.', '_')}> + % endif + % endfor </PropertyGroup> - % if dll == 'yes': +% endfor + % if dll and dll != 'only': <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-DLL|Win32'"> <ClCompile> <PrecompiledHeader>NotUsing</PrecompiledHeader> @@ -270,14 +267,14 @@ ${gen_package_props(packages)}\ % if project.get('public_headers',[]): <ItemGroup> % for public_header in project.public_headers: - <ClInclude Include="${get_repo_root()}\${to_windows_path(public_header)}" /> + <ClInclude Include="${repo_root}\${to_windows_path(public_header)}" /> % endfor </ItemGroup> % endif % if project.get('headers',[]): <ItemGroup> % for header in project.headers: - <ClInclude Include="${get_repo_root()}\${to_windows_path(header)}" /> + <ClInclude Include="${repo_root}\${to_windows_path(header)}" /> % endfor </ItemGroup> % endif @@ -286,30 +283,30 @@ ${gen_package_props(packages)}\ % for src_name in project.src: % if src_name.endswith(".proto"): <% src_name_parts = src_name.split(".") %>\ - <ClCompile Include="${get_repo_root()}\${to_windows_path(src_name_parts[0] + ".pb.cc")}"> + <ClCompile Include="${repo_root}\${to_windows_path(src_name_parts[0] + ".pb.cc")}"> </ClCompile> - <ClInclude Include="${get_repo_root()}\${to_windows_path(src_name_parts[0] + ".pb.h")}"> + <ClInclude Include="${repo_root}\${to_windows_path(src_name_parts[0] + ".pb.h")}"> </ClInclude> - <ClCompile Include="${get_repo_root()}\${to_windows_path(src_name_parts[0] + ".grpc.pb.cc")}"> + <ClCompile Include="${repo_root}\${to_windows_path(src_name_parts[0] + ".grpc.pb.cc")}"> </ClCompile> - <ClInclude Include="${get_repo_root()}\${to_windows_path(src_name_parts[0] + ".grpc.pb.h")}"> + <ClInclude Include="${repo_root}\${to_windows_path(src_name_parts[0] + ".grpc.pb.h")}"> </ClInclude> % else: - <ClCompile Include="${get_repo_root()}\${to_windows_path(src_name)}"> + <ClCompile Include="${repo_root}\${to_windows_path(src_name)}"> </ClCompile> % endif % endfor </ItemGroup> % elif configuration_type != 'StaticLibrary': <ItemGroup> - <ClCompile Include="${get_repo_root()}\${to_windows_path('vsprojects/dummy.c')}"> + <ClCompile Include="${repo_root}\${to_windows_path('vsprojects/dummy.c')}"> </ClCompile> </ItemGroup> % endif % if project.get('deps',[]): <ItemGroup> % for dep in project.deps: - <ProjectReference Include="..\${dep}\${dep}.vcxproj"> + <ProjectReference Include="${repo_root}\vsprojects\vcxproj\${vsproject_dict[dep].vs_proj_dir}\${dep}\${dep}.vcxproj"> <Project>${vsproject_dict[dep].vs_project_guid}</Project> </ProjectReference> % endfor @@ -322,8 +319,8 @@ ${gen_package_props(packages)}\ %endif <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> -${gen_package_targets(packages)}\ +${gen_package_targets(packages, repo_root)}\ </ImportGroup> -${gen_package_ensure(packages)}\ +${gen_package_ensure(packages, repo_root)}\ </Project> </%def>\ diff --git a/templates/vsprojects/winsock.props.template b/templates/vsprojects/winsock.props.template new file mode 100644 index 0000000000..7db6731bd3 --- /dev/null +++ b/templates/vsprojects/winsock.props.template @@ -0,0 +1,14 @@ +%YAML 1.2 +--- | + <?xml version="1.0" encoding="utf-8"?> + <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <ItemDefinitionGroup> + <Link> + <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup /> + </Project>
\ No newline at end of file diff --git a/templates/vsprojects/zlib-dll.props.template b/templates/vsprojects/zlib-dll.props.template new file mode 100644 index 0000000000..eb83ca7c0a --- /dev/null +++ b/templates/vsprojects/zlib-dll.props.template @@ -0,0 +1,15 @@ +%YAML 1.2 +--- | + <?xml version="1.0" encoding="utf-8"?> + <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <ItemDefinitionGroup> + <Link> + <AdditionalDependencies>zlib.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)\packages\grpc.dependencies.zlib.${vspackages_dict['grpc.dependencies.zlib'].version}\build\native\lib\$(PlatformToolset)\$(Platform)\$(Configuration)\dynamic\cdecl;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemGroup /> + </Project> diff --git a/templates/vsprojects/zlib.props.template b/templates/vsprojects/zlib.props.template new file mode 100644 index 0000000000..d14a3942b7 --- /dev/null +++ b/templates/vsprojects/zlib.props.template @@ -0,0 +1,15 @@ +%YAML 1.2 +--- | + <?xml version="1.0" encoding="utf-8"?> + <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <ItemDefinitionGroup> + <Link> + <AdditionalDependencies>zlib.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)\packages\grpc.dependencies.zlib.${vspackages_dict['grpc.dependencies.zlib'].version}\build\native\lib\$(PlatformToolset)\$(Platform)\$(Configuration)\static\cdecl;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemGroup /> + </Project> |