diff options
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Makefile.am | 32 | ||||
| -rw-r--r-- | grpc/subdir.am | 2 | ||||
| -rw-r--r-- | lib/subdir.am | 2 | ||||
| -rw-r--r-- | python/makefile.py | 25 | ||||
| -rw-r--r-- | qpb/subdir.am | 1 | ||||
| -rw-r--r-- | tools/subdir.am | 6 | 
7 files changed, 64 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore index 4c8370375d..a725524315 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,8 @@  *.pb-c.c  *.pb.cc  *_clippy.c +*.bc +*.cg.json  ### gcov outputs diff --git a/Makefile.am b/Makefile.am index f99f05ed56..f37ae628c2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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))" diff --git a/grpc/subdir.am b/grpc/subdir.am index 048e12a024..045848aee7 100644 --- a/grpc/subdir.am +++ b/grpc/subdir.am @@ -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: diff --git a/lib/subdir.am b/lib/subdir.am index 2f8cbe5d52..b2f3e7c5de 100644 --- a/lib/subdir.am +++ b/lib/subdir.am @@ -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 $@ $< diff --git a/python/makefile.py b/python/makefile.py index e60c8aadbc..948d3f7391 100644 --- a/python/makefile.py +++ b/python/makefile.py @@ -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('') diff --git a/qpb/subdir.am b/qpb/subdir.am index 1864ba7369..80f8f3aca9 100644 --- a/qpb/subdir.am +++ b/qpb/subdir.am @@ -29,6 +29,7 @@ CLEANFILES += \  	# end  EXTRA_DIST += qpb/qpb.proto +SUFFIXES += .proto .pb-c.c .pb-c.h  if HAVE_PROTOBUF diff --git a/tools/subdir.am b/tools/subdir.am index 69c6967225..723a87d100 100644 --- a/tools/subdir.am +++ b/tools/subdir.am @@ -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  | 
