build: add LLVM bitcode targets

Just an easy way to produce LLVM .bc (bitcode) files.  Not used during
normal builds.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2020-05-04 18:39:35 +02:00
parent 0045c13067
commit 8fb40377de
7 changed files with 64 additions and 6 deletions

2
.gitignore vendored
View File

@ -55,6 +55,8 @@
*.pb-c.c
*.pb.cc
*_clippy.c
*.bc
*.cg.json
### gcov outputs

View File

@ -93,6 +93,7 @@ EXTRA_PROGRAMS =
BUILT_SOURCES =
CLEANFILES =
DISTCLEANFILES =
SUFFIXES =
examplesdir = $(exampledir)
@ -232,12 +233,39 @@ EXTRA_DIST += \
vrrpd/Makefile \
# end
clean-local: clean-python
.PHONY: clean-python
AM_V_LLVM_BC = $(am__v_LLVM_BC_$(V))
am__v_LLVM_BC_ = $(am__v_LLVM_BC_$(AM_DEFAULT_VERBOSITY))
am__v_LLVM_BC_0 = @echo " LLVM.BC " $@;
am__v_LLVM_BC_1 =
AM_V_LLVM_LD = $(am__v_LLVM_LD_$(V))
am__v_LLVM_LD_ = $(am__v_LLVM_LD_$(AM_DEFAULT_VERBOSITY))
am__v_LLVM_LD_0 = @echo " LLVM.LD " $@;
am__v_LLVM_LD_1 =
SUFFIXES += .lo.bc .o.bc
.o.o.bc:
$(AM_V_LLVM_BC)$(COMPILE) -emit-llvm -c -o $@ $(patsubst %.o,%.c,$<)
.lo.lo.bc:
$(AM_V_LLVM_BC)$(COMPILE) -emit-llvm -c -o $@ $(patsubst %.lo,%.c,$<)
%.cg.json: %.bc tools/frr-llvm-cg
tools/frr-llvm-cg -o $@ $<
# <lib>.la.bc, <lib>.a.bc and <daemon>.bc targets are generated by
# python/makefile.py
LLVM_LINK = llvm-link-$(llvm_version)
clean-local: clean-python clean-llvm-bitcode
.PHONY: clean-python clean-llvm-bitcode
clean-python:
find . -name __pycache__ -o -name .pytest_cache | xargs rm -rf
find . -name "*.pyc" -o -name "*_clippy.c" | xargs rm -f
clean-llvm-bitcode:
find . -name "*.bc" -o -name "*.cg.json" | xargs rm -f
redistclean:
$(MAKE) distclean CONFIG_CLEAN_FILES="$(filter-out $(EXTRA_DIST), $(CONFIG_CLEAN_FILES))"

View File

@ -26,6 +26,8 @@ am__v_PROTOC_ = $(am__v_PROTOC_$(AM_DEFAULT_VERBOSITY))
am__v_PROTOC_0 = @echo " PROTOC" $@;
am__v_PROTOC_1 =
SUFFIXES += .pb.h .pb.cc .grpc.pb.cc
.proto.pb.cc:
$(AM_V_PROTOC)$(PROTOC) -I$(top_srcdir) --cpp_out=$(top_srcdir) $(top_srcdir)/$^
.proto.grpc.pb.cc:

View File

@ -415,7 +415,7 @@ am__v_CLIPPY_1 =
CLIPPY_DEPS = $(CLIPPY) $(top_srcdir)/python/clidef.py
SUFFIXES = _clippy.c .proto .pb-c.c .pb-c.h .pb.h .pb.cc .grpc.pb.cc
SUFFIXES += _clippy.c
.c_clippy.c:
$(AM_V_CLIPPY) $(CLIPPY) $(top_srcdir)/python/clidef.py -o $@ $<

View File

@ -54,6 +54,7 @@ ${target}: ${clippybase}_clippy.c
lines = before.splitlines()
autoderp = '#AUTODERP# '
out_lines = []
bcdeps = []
make_rule_re = re.compile('^([^:\s]+):\s*([^:\s]+)\s*($|\n)')
while lines:
@ -77,6 +78,12 @@ while lines:
out_lines.append(line)
continue
target, dep = m.group(1), m.group(2)
if target.endswith('.lo') or target.endswith('.o'):
if not dep.endswith('.h'):
bcdeps.append('%s.bc: %s' % (target, target))
bcdeps.append('\t$(AM_V_LLVM_BC)$(COMPILE) -emit-llvm -c -o $@ %s' % (dep))
if m.group(2) in clippy_scan:
out_lines.append(clippyauxdep.substitute(target=m.group(1), clippybase=m.group(2)[:-2]))
@ -85,6 +92,24 @@ while lines:
out_lines.append('# clippy{\n# main clippy targets')
for clippy_file in clippy_scan:
out_lines.append(clippydep.substitute(clippybase = clippy_file[:-2]))
out_lines.append('')
out_lines.extend(bcdeps)
out_lines.append('')
bc_targets = []
for varname in ['bin_PROGRAMS', 'sbin_PROGRAMS', 'lib_LTLIBRARIES', 'module_LTLIBRARIES', 'noinst_LIBRARIES']:
bc_targets.extend(mv[varname].strip().split())
for target in bc_targets:
amtgt = target.replace('/', '_').replace('.', '_').replace('-', '_')
objs = mv[amtgt + '_OBJECTS'].strip().split()
objs = [obj + '.bc' for obj in objs]
deps = mv.get(amtgt + '_DEPENDENCIES', '').strip().split()
deps = [d + '.bc' for d in deps if d.endswith('.a')]
objs.extend(deps)
out_lines.append('%s.bc: %s' % (target, ' '.join(objs)))
out_lines.append('\t$(AM_V_LLVM_LD)$(LLVM_LINK) -o $@ $^')
out_lines.append('')
out_lines.append('# }clippy')
out_lines.append('')

View File

@ -29,6 +29,7 @@ CLEANFILES += \
# end
EXTRA_DIST += qpb/qpb.proto
SUFFIXES += .proto .pb-c.c .pb-c.h
if HAVE_PROTOBUF

View File

@ -36,9 +36,9 @@ tools_gen_yang_deviations_LDADD = lib/libfrr.la $(LIBYANG_LIBS)
tools_ssd_SOURCES = tools/start-stop-daemon.c
# don't bother autoconf'ing these for a simple optional tool
llvm_config = llvm-config-$(shell echo __clang_major__ | $(CC) -xc -P -E -)
tools_frr_llvm_cg_CFLAGS = $(AM_CFLAGS) `$(llvm_config) --cflags`
tools_frr_llvm_cg_LDFLAGS = `$(llvm_config) --ldflags --libs`
llvm_version = $(shell echo __clang_major__ | $(CC) -xc -P -E -)
tools_frr_llvm_cg_CFLAGS = $(AM_CFLAGS) `llvm-config-$(llvm_version) --cflags`
tools_frr_llvm_cg_LDFLAGS = `llvm-config-$(llvm_version) --ldflags --libs`
tools_frr_llvm_cg_SOURCES = \
tools/frr-llvm-cg.c \
# end