Makefile: remove support for building protobuf, C++ libraries and executables

pull/24000/head
Jan Tattermusch 4 years ago
parent 8d9b37362c
commit cbf97fa716
  1. 365
      templates/Makefile.template

@ -27,14 +27,6 @@
def is_absl_lib(target_name):
return target_name.startswith("absl/");
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()
@ -65,8 +57,8 @@
# Currently it is necessary because some dependencies are marked as "build: private" in build.yaml
# (which itself is correct, as they are not "public" libraries from our perspective and cmake
# needs to have them marked as such)
filtered_libs = [lib for lib in libs if lib.build in ['all', 'protoc'] or lib.name in ['ares', 'boringssl', 're2', 'upb', 'z']]
filtered_targets = [tgt for tgt in targets if tgt.build in ['all', 'protoc']]
filtered_libs = [lib for lib in libs if (lib.build in ['all'] and lib.language != 'c++') or lib.name in ['ares', 'boringssl', 're2', 'upb', 'z']]
filtered_targets = [tgt for tgt in targets if tgt.build in ['all'] and lib.language != 'c++']
%>
comma := ,
@ -149,7 +141,6 @@
prefix ?= /usr/local
PROTOC ?= protoc
DTRACE ?= dtrace
CONFIG ?= opt
# Doing X ?= Y is the same as:
@ -498,45 +489,6 @@
LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE))
# 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
HAS_EMBEDDED_PROTOBUF = true
endif
PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG)
PROTOC_PLUGINS_ALL =\
% for tgt in filtered_targets:
% if tgt.build == 'protoc':
$(BINDIR)/$(CONFIG)/${tgt.name}\
% endif
% endfor
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
PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL)
else
NO_PROTOBUF = true
endif
LIBS_PROTOBUF = protobuf
LIBS_PROTOC = protoc protobuf
HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC))
LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF))
ifeq ($(MAKECMDGOALS),clean)
NO_DEPS = true
endif
@ -544,7 +496,7 @@
.SECONDARY = %.pb.h %.pb.cc
ifeq ($(DEP_MISSING),)
all: static shared plugins\
all: static shared\
% for tgt in filtered_targets:
% if tgt.build == 'all':
$(BINDIR)/$(CONFIG)/${tgt.name}\
@ -585,10 +537,6 @@
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"
@ -604,34 +552,6 @@
@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.12.0+"
@echo "Your system doesn't have it, and neither does the third_party directory."
@echo
@echo "Please consult BUILDING.md 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.12.0+"
@echo "Your system doesn't have it, and neither does the third_party directory."
@echo
@echo "Please consult BUILDING.md 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"
@ -662,21 +582,6 @@
run_dep_checks:
@echo "run_dep_checks target has been deprecated."
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)mkdir -p $(LIBDIR)/$(CONFIG)/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 $(PROTOBUF_CONFIG_OPTS))
$(Q)$(MAKE) -C third_party/protobuf clean
$(Q)$(MAKE) -C third_party/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: cache.mk \
@ -741,8 +646,6 @@
grpc_csharp_ext: shared_csharp
plugins: $(PROTOC_PLUGINS)
privatelibs: privatelibs_c privatelibs_cxx
privatelibs_c: \
@ -861,32 +764,6 @@
$(E) "[MAKE] Generating $@"
$(Q) echo "$(CACHE_MK)" | 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
<%
pluginflags=""
%>
% if p in ["src/proto/grpc/testing/compiler_test", "src/proto/grpc/testing/echo"]:
<%
pluginflags="generate_mock_code=true:"
%>
% endif
$(GENDIR)/${p}.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) ${' '.join('$(GENDIR)/%s.pb.cc' % q for q in proto_deps.get(p, []))}
$(E) "[PROTOC] Generating protobuf CC file from $<"
$(Q) mkdir -p `dirname $@`
$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
$(GENDIR)/${p}.grpc.pb.cc: ${p}.proto $(GENDIR)/${p}.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) ${' '.join('$(GENDIR)/%s.pb.cc $(GENDIR)/%s.grpc.pb.cc' % (q,q) for q in proto_deps.get(p, []))}
$(E) "[GRPC] Generating gRPC's protobuf service CC file from $<"
$(Q) mkdir -p `dirname $@`
$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=${pluginflags}$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
endif
% endfor
ifeq ($(CONFIG),stapprof)
src/core/profiling/stap_timers.c: $(GENDIR)/src/core/profiling/stap_probes.h
ifeq ($(HAS_SYSTEMTAP),true)
@ -988,18 +865,12 @@
%>
${makelib(grpc_abseil_lib)}
# All of the test targets, and protoc plugins
% for tgt in filtered_targets:
${maketarget(tgt)}
% endfor
<%def name="makelib(lib)">
# start of build recipe for library "${lib.name}" (generated by makelib(lib) template function)
LIB${lib.name.upper()}_SRC = \\
% for src in lib.src:
${proto_to_cc(src)} \\
${src} \\
% endfor
@ -1039,37 +910,9 @@
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":
$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}): protobuf_dep_error
% endif
else
% endif
$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(RE2_DEP) $(UPB_DEP) $(GRPC_ABSEIL_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":
$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)${lib.name}$(SHARED_VERSION_${lang_to_var[lib.language]}).$(SHARED_EXT_${lang_to_var[lib.language]}): protobuf_dep_error
% endif
else
% endif
$(LIBDIR)/$(CONFIG)/lib${lib.name}.a: \
% if lib.name not in ['z', 'ares', 'address_sorting', 're2', 'upb', 'grpc_abseil']:
$(ZLIB_DEP) \
@ -1079,9 +922,6 @@
$(UPB_DEP) \
$(GRPC_ABSEIL_DEP) \
% endif
% endif
% if lib.language == 'c++':
$(PROTOBUF_DEP)\
% endif
$(LIB${lib.name.upper()}_OBJS) \
% if lib.get('baselib', False):
@ -1119,11 +959,7 @@
endif
<%
if lib.language == 'c++':
ld = '$(LDXX)'
else:
ld = '$(LDXX)'
ld = '$(LDXX)'
out_mingbase = '$(LIBDIR)/$(CONFIG)/' + lib.name + '$(SHARED_VERSION_' + lang_to_var[lib.language] + ')'
out_libbase = '$(LIBDIR)/$(CONFIG)/lib' + lib.name + '$(SHARED_VERSION_' + lang_to_var[lib.language] + ')'
@ -1134,9 +970,6 @@
lib_deps = ' $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(RE2_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP)'
mingw_libs = ''
mingw_lib_deps = ' $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(RE2_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP)'
if lib.language == 'c++':
lib_deps += ' $(PROTOBUF_DEP)'
mingw_lib_deps += ' $(PROTOBUF_DEP)'
if lib.get('deps_linkage', None) == 'static':
for dep in lib.get('deps', []):
if is_absl_lib(dep): continue
@ -1164,8 +997,7 @@
if security in [True, 'check']:
for src in lib.src:
if not proto_re.match(src):
sources_that_need_openssl.add(src)
sources_that_need_openssl.add(src)
else:
for src in lib.src:
sources_that_don_t_need_openssl.add(src)
@ -1174,9 +1006,6 @@
lib_deps = lib_deps + ' $(OPENSSL_DEP)'
mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)'
if lib.language == 'c++':
common = common + ' $(LDLIBSXX) $(LDLIBS_PROTOBUF)'
ldflags = '$(LDFLAGS)'
if lib.get('LDFLAGS', None):
ldflags += ' ' + lib['LDFLAGS']
@ -1207,12 +1036,6 @@
## 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.12.0+
endif
% endif
@ -1225,185 +1048,9 @@
% 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
# end of build recipe for library "${lib.name}"
</%def>
<%def name="maketarget(tgt)"><% has_no_sources = not tgt.src %>
# start of build recipe for target "${tgt.name}" (generated by maketarget(tgt) template function)
% 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
% if tgt.boringssl:
# boringssl needs an override to ensure that it does not include
# system openssl headers regardless of other configuration
# we do so here with a target specific variable assignment
$(${tgt.name.upper()}_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
$(${tgt.name.upper()}_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS)
$(${tgt.name.upper()}_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
% 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.12.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:
% if not is_absl_lib(dep):
$(LIBDIR)/$(CONFIG)/lib${dep}.a\
% endif
% endfor
% if tgt.language == "c++" or tgt.boringssl or tgt.build == 'fuzzer':
## 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) $(LDXX) $(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') == True or tgt.get('secure', 'check') == 'check':
$(LDLIBS_SECURE)\
% endif
% if tgt.build == 'fuzzer':
-lFuzzer\
% 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
% if tgt.get('defaults', None):
% for name, value in defaults.get(tgt.defaults).items():
$(${tgt.name.upper()}_OBJS): ${name} += ${value}
% endfor
% 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
% if tgt.language == 'c89':
% for src in tgt.src:
$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o : ${src}
$(E) "[C] Compiling $<"
$(Q) mkdir -p `dirname $@`
$(Q) $(CC) $(CPPFLAGS) $(CFLAGS) -std=c89 -pedantic -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
% endfor
% endif
% 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
% for src in tgt.src:
% if not proto_re.match(src) and any(proto_re.match(src2) for src2 in tgt.src):
$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in tgt.src if proto_re.match(src2))}
% endif
% endfor
# end of build recipe for target "${tgt.name}"
</%def>
# 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

Loading…
Cancel
Save