From e9bcf7eb519424f2fd1c2b789781c33616052c23 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2020 09:59:27 +0200 Subject: [PATCH 1/3] make: GTEST_LIB no longer useful --- templates/Makefile.template | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/templates/Makefile.template b/templates/Makefile.template index 581367e0a63..66bb8e5b639 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -320,8 +320,7 @@ USE_BUILT_PROTOC = false endif - GTEST_LIB = -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googletest third_party/googletest/googletest/src/gtest-all.cc -Ithird_party/googletest/googlemock/include -Ithird_party/googletest/googlemock third_party/googletest/googlemock/src/gmock-all.cc - GTEST_LIB += -lgflags -std=c++11 + # V=1 can be used to print commands run by make ifeq ($(V),1) E = @: Q = @@ -1540,11 +1539,6 @@ % 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 % if tgt.build == 'fuzzer': -lFuzzer\ % endif From 7388266aa79bd61f58d5db043ae38b0b2102e8ba Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2020 09:50:12 +0200 Subject: [PATCH 2/3] simplify the way dependencies are included in Makefile --- templates/Makefile.template | 309 +++++++----------------------------- 1 file changed, 59 insertions(+), 250 deletions(-) diff --git a/templates/Makefile.template b/templates/Makefile.template index 66bb8e5b639..b9999a60f43 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -125,7 +125,7 @@ LIBDIR = $(BUILDDIR_ABSOLUTE)/libs GENDIR = $(BUILDDIR_ABSOLUTE)/gens - # Configurations + # Configurations (as defined under "configs" section in build_handwritten.yaml) % for name, args in configs.iteritems(): VALID_CONFIG_${name} = 1 @@ -358,12 +358,6 @@ 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 - ifeq ($(SYSTEM),MINGW32) EXECUTABLE_SUFFIX = .exe SHARED_EXT_CORE = dll @@ -399,107 +393,7 @@ IS_GIT_FOLDER = true endif - ifeq ($(HAS_PKG_CONFIG),true) - OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl - ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib - PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.12.0 protobuf - CARES_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.11.0 libcares - else # HAS_PKG_CONFIG - - ifeq ($(SYSTEM),MINGW32) - OPENSSL_LIBS = ssl32 eay32 - else - OPENSSL_LIBS = ssl crypto - endif - - OPENSSL_ALPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) - BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) ${defaults.boringssl.CPPFLAGS} $(CFLAGS) ${defaults.boringssl.CFLAGS} -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS) - ZLIB_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS) - PROTOBUF_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS) - CARES_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/c-ares.c -lcares $(LDFLAGS) - - endif # HAS_PKG_CONFIG - - PERFTOOLS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -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) $(CPPFLAGS) $(CFLAGS) -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) - CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = 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 - HAS_SYSTEM_CARES ?= $(shell $(CARES_CHECK_CMD) 2> /dev/null && echo true || echo false) - ifeq ($(HAS_SYSTEM_CARES),true) - CACHE_MK += HAS_SYSTEM_CARES = true, - endif - else - # override system libraries if the config requires a custom compiled library - HAS_SYSTEM_OPENSSL_ALPN = false - HAS_SYSTEM_ZLIB = false - HAS_SYSTEM_PROTOBUF = false - HAS_SYSTEM_CARES = 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 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/boringssl-with-bazel/src/include/openssl/ssl.h),) - HAS_EMBEDDED_OPENSSL_ALPN = false - else - CAN_COMPILE_EMBEDDED_OPENSSL ?= $(shell $(BORINGSSL_COMPILE_CHECK_CMD) 2> /dev/null && echo true || echo false) - HAS_EMBEDDED_OPENSSL_ALPN = $(CAN_COMPILE_EMBEDDED_OPENSSL) - endif + # Setup zlib dependency ifeq ($(wildcard third_party/zlib/zlib.h),) HAS_EMBEDDED_ZLIB = false @@ -507,34 +401,11 @@ 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 - - ifeq ($(wildcard third_party/cares/cares/ares.h),) - HAS_EMBEDDED_CARES = false - else - HAS_EMBEDDED_CARES = true - endif - - PC_REQUIRES_GRPC = - PC_LIBS_GRPC = - - ifeq ($(HAS_SYSTEM_ZLIB),false) - ifeq ($(HAS_EMBEDDED_ZLIB), true) - EMBED_ZLIB ?= true - else - DEP_MISSING += zlib - EMBED_ZLIB ?= broken - endif - else + # for zlib, we support building both from submodule + # and from system-installed zlib. In some builds, + # embedding zlib is not desirable. + # By default we use the system zlib (to match legacy behavior) EMBED_ZLIB ?= false - endif ifeq ($(EMBED_ZLIB),true) ZLIB_DEP = $(LIBDIR)/$(CONFIG)/libz.a @@ -542,35 +413,41 @@ ZLIB_MERGE_OBJS = $(LIBZ_OBJS) CPPFLAGS += -Ithird_party/zlib else - ifeq ($(HAS_PKG_CONFIG),true) - CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib) - LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib) - LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l zlib)) - PC_REQUIRES_GRPC += zlib - else - PC_LIBS_GRPC += -lz LIBS += z endif - endif - CARES_PKG_CONFIG = false + # Setup c-ares dependency - ifeq ($(HAS_SYSTEM_CARES),false) - ifeq ($(HAS_EMBEDDED_CARES), true) + ifeq ($(wildcard third_party/cares/cares/ares.h),) + HAS_EMBEDDED_CARES = false + else + HAS_EMBEDDED_CARES = true + endif + + ifeq ($(HAS_EMBEDDED_CARES),true) EMBED_CARES ?= true else + # only building with c-ares from submodule is supported DEP_MISSING += cares EMBED_CARES ?= broken endif - else - EMBED_CARES ?= false + + ifeq ($(EMBED_CARES),true) + CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a + CARES_MERGE_OBJS = $(LIBARES_OBJS) + CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a + CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS) endif + # Setup address_sorting dependency + ADDRESS_SORTING_DEP = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a ADDRESS_SORTING_MERGE_OBJS = $(LIBADDRESS_SORTING_OBJS) ADDRESS_SORTING_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a CPPFLAGS := -Ithird_party/address_sorting/include $(CPPFLAGS) + # Setup abseil dependency + GRPC_ABSEIL_DEP = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a GRPC_ABSEIL_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a ifeq ($(HOST_IS_X86_64),true) @@ -579,98 +456,64 @@ ABSL_RANDOM_HWAES_FLAGS = endif + # Setup re2 dependency + RE2_DEP = $(LIBDIR)/$(CONFIG)/libre2.a RE2_MERGE_OBJS = $(LIBRE2_OBJS) RE2_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libre2.a + # Setup upb dependency + UPB_DEP = $(LIBDIR)/$(CONFIG)/libupb.a UPB_MERGE_OBJS = $(LIBUPB_OBJS) UPB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libupb.a - ifeq ($(EMBED_CARES),true) - CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a - CARES_MERGE_OBJS = $(LIBARES_OBJS) - CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a - CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS) - else - ifeq ($(HAS_PKG_CONFIG),true) - PC_REQUIRES_GRPC += libcares - CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libcares) - LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libcares) - LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l libcares)) + # Setup boringssl dependency + + ifeq ($(wildcard third_party/boringssl-with-bazel/src/include/openssl/ssl.h),) + HAS_EMBEDDED_OPENSSL = false else - PC_LIBS_GRPC += -lcares - LIBS += cares + HAS_EMBEDDED_OPENSSL = true endif - endif - - OPENSSL_PKG_CONFIG = false - PC_REQUIRES_SECURE = - PC_LIBS_SECURE = - - ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) - EMBED_OPENSSL ?= false - NO_SECURE ?= false - else # HAS_SYSTEM_OPENSSL_ALPN=false - ifneq ($(HAS_EMBEDDED_OPENSSL_ALPN),false) - EMBED_OPENSSL ?= $(HAS_EMBEDDED_OPENSSL_ALPN) - NO_SECURE ?= false - else # HAS_EMBEDDED_OPENSSL_ALPN=false - NO_SECURE ?= true - endif # HAS_EMBEDDED_OPENSSL_ALPN - endif # HAS_SYSTEM_OPENSSL_ALPN + ifeq ($(HAS_EMBEDDED_OPENSSL),true) + EMBED_OPENSSL ?= true + else + # only support building boringssl from submodule + DEP_MISSING += openssl + EMBED_OPENSSL ?= broken + endif - OPENSSL_DEP := - OPENSSL_MERGE_LIBS := - ifeq ($(NO_SECURE),false) ifeq ($(EMBED_OPENSSL),true) OPENSSL_DEP += $(LIBDIR)/$(CONFIG)/libboringssl.a OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/libboringssl.a OPENSSL_MERGE_OBJS += $(LIBBORINGSSL_OBJS) # need to prefix these to ensure overriding system libraries - CPPFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CPPFLAGS) - else ifneq ($(EMBED_OPENSSL),false) - OPENSSL_DEP += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a - OPENSSL_MERGE_LIBS += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a - OPENSSL_MERGE_OBJS += $(wildcard $(EMBED_OPENSSL)/grpc_obj/*.o) - # need to prefix these to ensure overriding system libraries - CPPFLAGS := -I$(EMBED_OPENSSL)/include $(CPPFLAGS) - else # EMBED_OPENSSL=false - 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 # LDFLAGS_OPENSSL_PKG_CONFIG='' - endif # System=Linux - LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS) - else # HAS_PKG_CONFIG=false - LIBS_SECURE = $(OPENSSL_LIBS) - endif # HAS_PKG_CONFIG + CPPFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CPPFLAGS) ifeq ($(DISABLE_ALPN),true) CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0 LIBS_SECURE = $(OPENSSL_LIBS) endif # DISABLE_ALPN - PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) endif # EMBED_OPENSSL - endif # NO_SECURE + + LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) - ifeq ($(OPENSSL_PKG_CONFIG),true) - LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl) + # Setup protobuf dependency + + # we only support building protobuf from submodule + HAS_SYSTEM_PROTOBUF = false + HAS_PROTOC = false + HAS_VALID_PROTOC = false + 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 - LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) + HAS_EMBEDDED_PROTOBUF = true endif - PROTOBUF_PKG_CONFIG = false - - PC_REQUIRES_GRPCXX = - PC_LIBS_GRPCXX = - - CPPFLAGS := -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googlemock/include $(CPPFLAGS) + PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG) PROTOC_PLUGINS_ALL =\ % for tgt in filtered_targets: @@ -679,50 +522,20 @@ % endif % endfor - PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG) - - ifeq ($(HAS_SYSTEM_PROTOBUF),true) - ifeq ($(HAS_PKG_CONFIG),true) - PROTOBUF_PKG_CONFIG = true - PC_REQUIRES_GRPCXX = protobuf - CPPFLAGS := $(CPPFLAGS) $(shell $(PKG_CONFIG) --cflags protobuf) - 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 - PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) - 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) - ifneq ($(USE_BUILT_PROTOC),false) PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) else - PROTOC_PLUGINS = - PROTOC_PLUGINS_DIR = $(prefix)/bin - endif - 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 ifeq ($(MAKECMDGOALS),clean) NO_DEPS = true @@ -847,12 +660,7 @@ % endfor run_dep_checks: - $(OPENSSL_ALPN_CHECK_CMD) || true - $(ZLIB_CHECK_CMD) || true - $(PERFTOOLS_CHECK_CMD) || true - $(PROTOBUF_CHECK_CMD) || true - $(PROTOC_CHECK_VERSION_CMD) || true - $(CARES_CHECK_CMD) || true + @echo "run_dep_checks target has been deprecated." third_party/protobuf/configure: $(E) "[AUTOGEN] Preparing protobuf" @@ -1596,6 +1404,7 @@ # end of build recipe for target "${tgt.name}" + # TODO(jtattermusch): is there a way to get around this hack? 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 From f62e2207a7f56e305bd5d9eabcd7f7d125e1f643 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2020 11:09:09 +0200 Subject: [PATCH 3/3] regenerate makefile --- Makefile | 310 +++++++++++-------------------------------------------- 1 file changed, 59 insertions(+), 251 deletions(-) diff --git a/Makefile b/Makefile index afeb11e1f3a..63d270e7ec6 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ OBJDIR = $(BUILDDIR_ABSOLUTE)/objs LIBDIR = $(BUILDDIR_ABSOLUTE)/libs GENDIR = $(BUILDDIR_ABSOLUTE)/gens -# Configurations +# Configurations (as defined under "configs" section in build_handwritten.yaml) VALID_CONFIG_opt = 1 CC_opt = $(DEFAULT_CC) @@ -446,8 +446,7 @@ ARFLAGS += $(GRPC_CROSS_AROPTS) # e.g., rc --target=elf32-little USE_BUILT_PROTOC = false endif -GTEST_LIB = -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googletest third_party/googletest/googletest/src/gtest-all.cc -Ithird_party/googletest/googlemock/include -Ithird_party/googletest/googlemock third_party/googletest/googlemock/src/gmock-all.cc -GTEST_LIB += -lgflags -std=c++11 +# V=1 can be used to print commands run by make ifeq ($(V),1) E = @: Q = @@ -488,12 +487,6 @@ HOST_LDLIBS += $(LDLIBS) 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 - ifeq ($(SYSTEM),MINGW32) EXECUTABLE_SUFFIX = .exe SHARED_EXT_CORE = dll @@ -529,107 +522,7 @@ else IS_GIT_FOLDER = true endif -ifeq ($(HAS_PKG_CONFIG),true) -OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl -ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib -PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.12.0 protobuf -CARES_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.11.0 libcares -else # HAS_PKG_CONFIG - -ifeq ($(SYSTEM),MINGW32) -OPENSSL_LIBS = ssl32 eay32 -else -OPENSSL_LIBS = ssl crypto -endif - -OPENSSL_ALPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) -BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(CFLAGS) -g -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS) -ZLIB_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS) -PROTOBUF_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS) -CARES_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/c-ares.c -lcares $(LDFLAGS) - -endif # HAS_PKG_CONFIG - -PERFTOOLS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -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) $(CPPFLAGS) $(CFLAGS) -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) -CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = 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 -HAS_SYSTEM_CARES ?= $(shell $(CARES_CHECK_CMD) 2> /dev/null && echo true || echo false) -ifeq ($(HAS_SYSTEM_CARES),true) -CACHE_MK += HAS_SYSTEM_CARES = true, -endif -else -# override system libraries if the config requires a custom compiled library -HAS_SYSTEM_OPENSSL_ALPN = false -HAS_SYSTEM_ZLIB = false -HAS_SYSTEM_PROTOBUF = false -HAS_SYSTEM_CARES = 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 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/boringssl-with-bazel/src/include/openssl/ssl.h),) -HAS_EMBEDDED_OPENSSL_ALPN = false -else -CAN_COMPILE_EMBEDDED_OPENSSL ?= $(shell $(BORINGSSL_COMPILE_CHECK_CMD) 2> /dev/null && echo true || echo false) -HAS_EMBEDDED_OPENSSL_ALPN = $(CAN_COMPILE_EMBEDDED_OPENSSL) -endif +# Setup zlib dependency ifeq ($(wildcard third_party/zlib/zlib.h),) HAS_EMBEDDED_ZLIB = false @@ -637,34 +530,11 @@ 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 - -ifeq ($(wildcard third_party/cares/cares/ares.h),) -HAS_EMBEDDED_CARES = false -else -HAS_EMBEDDED_CARES = true -endif - -PC_REQUIRES_GRPC = -PC_LIBS_GRPC = - -ifeq ($(HAS_SYSTEM_ZLIB),false) -ifeq ($(HAS_EMBEDDED_ZLIB), true) -EMBED_ZLIB ?= true -else -DEP_MISSING += zlib -EMBED_ZLIB ?= broken -endif -else +# for zlib, we support building both from submodule +# and from system-installed zlib. In some builds, +# embedding zlib is not desirable. +# By default we use the system zlib (to match legacy behavior) EMBED_ZLIB ?= false -endif ifeq ($(EMBED_ZLIB),true) ZLIB_DEP = $(LIBDIR)/$(CONFIG)/libz.a @@ -672,35 +542,41 @@ ZLIB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libz.a ZLIB_MERGE_OBJS = $(LIBZ_OBJS) CPPFLAGS += -Ithird_party/zlib else -ifeq ($(HAS_PKG_CONFIG),true) -CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib) -LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib) -LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l zlib)) -PC_REQUIRES_GRPC += zlib -else -PC_LIBS_GRPC += -lz LIBS += z endif -endif -CARES_PKG_CONFIG = false +# Setup c-ares dependency + +ifeq ($(wildcard third_party/cares/cares/ares.h),) +HAS_EMBEDDED_CARES = false +else +HAS_EMBEDDED_CARES = true +endif -ifeq ($(HAS_SYSTEM_CARES),false) -ifeq ($(HAS_EMBEDDED_CARES), true) +ifeq ($(HAS_EMBEDDED_CARES),true) EMBED_CARES ?= true else +# only building with c-ares from submodule is supported DEP_MISSING += cares EMBED_CARES ?= broken endif -else -EMBED_CARES ?= false + +ifeq ($(EMBED_CARES),true) +CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a +CARES_MERGE_OBJS = $(LIBARES_OBJS) +CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a +CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS) endif +# Setup address_sorting dependency + ADDRESS_SORTING_DEP = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a ADDRESS_SORTING_MERGE_OBJS = $(LIBADDRESS_SORTING_OBJS) ADDRESS_SORTING_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a CPPFLAGS := -Ithird_party/address_sorting/include $(CPPFLAGS) +# Setup abseil dependency + GRPC_ABSEIL_DEP = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a GRPC_ABSEIL_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a ifeq ($(HOST_IS_X86_64),true) @@ -709,144 +585,80 @@ else ABSL_RANDOM_HWAES_FLAGS = endif +# Setup re2 dependency + RE2_DEP = $(LIBDIR)/$(CONFIG)/libre2.a RE2_MERGE_OBJS = $(LIBRE2_OBJS) RE2_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libre2.a +# Setup upb dependency + UPB_DEP = $(LIBDIR)/$(CONFIG)/libupb.a UPB_MERGE_OBJS = $(LIBUPB_OBJS) UPB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libupb.a -ifeq ($(EMBED_CARES),true) -CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a -CARES_MERGE_OBJS = $(LIBARES_OBJS) -CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a -CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS) -else -ifeq ($(HAS_PKG_CONFIG),true) -PC_REQUIRES_GRPC += libcares -CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libcares) -LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libcares) -LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l libcares)) +# Setup boringssl dependency + +ifeq ($(wildcard third_party/boringssl-with-bazel/src/include/openssl/ssl.h),) +HAS_EMBEDDED_OPENSSL = false else -PC_LIBS_GRPC += -lcares -LIBS += cares +HAS_EMBEDDED_OPENSSL = true endif -endif - -OPENSSL_PKG_CONFIG = false -PC_REQUIRES_SECURE = -PC_LIBS_SECURE = - -ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) -EMBED_OPENSSL ?= false -NO_SECURE ?= false -else # HAS_SYSTEM_OPENSSL_ALPN=false -ifneq ($(HAS_EMBEDDED_OPENSSL_ALPN),false) -EMBED_OPENSSL ?= $(HAS_EMBEDDED_OPENSSL_ALPN) -NO_SECURE ?= false -else # HAS_EMBEDDED_OPENSSL_ALPN=false -NO_SECURE ?= true -endif # HAS_EMBEDDED_OPENSSL_ALPN -endif # HAS_SYSTEM_OPENSSL_ALPN +ifeq ($(HAS_EMBEDDED_OPENSSL),true) +EMBED_OPENSSL ?= true +else +# only support building boringssl from submodule +DEP_MISSING += openssl +EMBED_OPENSSL ?= broken +endif -OPENSSL_DEP := -OPENSSL_MERGE_LIBS := -ifeq ($(NO_SECURE),false) ifeq ($(EMBED_OPENSSL),true) OPENSSL_DEP += $(LIBDIR)/$(CONFIG)/libboringssl.a OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/libboringssl.a OPENSSL_MERGE_OBJS += $(LIBBORINGSSL_OBJS) # need to prefix these to ensure overriding system libraries -CPPFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CPPFLAGS) -else ifneq ($(EMBED_OPENSSL),false) -OPENSSL_DEP += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a -OPENSSL_MERGE_LIBS += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a -OPENSSL_MERGE_OBJS += $(wildcard $(EMBED_OPENSSL)/grpc_obj/*.o) -# need to prefix these to ensure overriding system libraries -CPPFLAGS := -I$(EMBED_OPENSSL)/include $(CPPFLAGS) -else # EMBED_OPENSSL=false -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 # LDFLAGS_OPENSSL_PKG_CONFIG='' -endif # System=Linux -LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS) -else # HAS_PKG_CONFIG=false -LIBS_SECURE = $(OPENSSL_LIBS) -endif # HAS_PKG_CONFIG +CPPFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CPPFLAGS) ifeq ($(DISABLE_ALPN),true) CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0 LIBS_SECURE = $(OPENSSL_LIBS) endif # DISABLE_ALPN -PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) endif # EMBED_OPENSSL -endif # NO_SECURE -ifeq ($(OPENSSL_PKG_CONFIG),true) -LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl) -else LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) -endif - -PROTOBUF_PKG_CONFIG = false -PC_REQUIRES_GRPCXX = -PC_LIBS_GRPCXX = - -CPPFLAGS := -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googlemock/include $(CPPFLAGS) - -PROTOC_PLUGINS_ALL = $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(BINDIR)/$(CONFIG)/grpc_csharp_plugin $(BINDIR)/$(CONFIG)/grpc_node_plugin $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(BINDIR)/$(CONFIG)/grpc_php_plugin $(BINDIR)/$(CONFIG)/grpc_python_plugin $(BINDIR)/$(CONFIG)/grpc_ruby_plugin -PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG) +# Setup protobuf dependency -ifeq ($(HAS_SYSTEM_PROTOBUF),true) -ifeq ($(HAS_PKG_CONFIG),true) -PROTOBUF_PKG_CONFIG = true -PC_REQUIRES_GRPCXX = protobuf -CPPFLAGS := $(CPPFLAGS) $(shell $(PKG_CONFIG) --cflags protobuf) -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 +# we only support building protobuf from submodule +HAS_SYSTEM_PROTOBUF = false +HAS_PROTOC = false +HAS_VALID_PROTOC = false +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 -PC_LIBS_GRPCXX = -lprotobuf +HAS_EMBEDDED_PROTOBUF = true endif -PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) -else + +PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG) + +PROTOC_PLUGINS_ALL = $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(BINDIR)/$(CONFIG)/grpc_csharp_plugin $(BINDIR)/$(CONFIG)/grpc_node_plugin $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(BINDIR)/$(CONFIG)/grpc_php_plugin $(BINDIR)/$(CONFIG)/grpc_python_plugin $(BINDIR)/$(CONFIG)/grpc_ruby_plugin ifeq ($(HAS_EMBEDDED_PROTOBUF),true) PROTOBUF_DEP = $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a CPPFLAGS := -Ithird_party/protobuf/src $(CPPFLAGS) LDFLAGS := -L$(LIBDIR)/$(CONFIG)/protobuf $(LDFLAGS) -ifneq ($(USE_BUILT_PROTOC),false) PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) else -PROTOC_PLUGINS = -PROTOC_PLUGINS_DIR = $(prefix)/bin -endif -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 ifeq ($(MAKECMDGOALS),clean) NO_DEPS = true @@ -969,12 +781,7 @@ grpc_python_plugin: $(BINDIR)/$(CONFIG)/grpc_python_plugin grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin run_dep_checks: - $(OPENSSL_ALPN_CHECK_CMD) || true - $(ZLIB_CHECK_CMD) || true - $(PERFTOOLS_CHECK_CMD) || true - $(PROTOBUF_CHECK_CMD) || true - $(PROTOC_CHECK_VERSION_CMD) || true - $(CARES_CHECK_CMD) || true + @echo "run_dep_checks target has been deprecated." third_party/protobuf/configure: $(E) "[AUTOGEN] Preparing protobuf" @@ -4778,6 +4585,7 @@ endif +# TODO(jtattermusch): is there a way to get around this hack? 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