summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2020-04-15 10:27:49 +0200
committerDavid Lamparter <equinox@diac24.net>2020-04-27 09:52:41 +0200
commit94cfb0692e0499e7ba40908db5259cd19c0e3d5e (patch)
tree21dea4bef030b2e9170029235fe2385bda5cf90f
parentec8f987e91678b50a4136459bd2351e623c6915d (diff)
build: make clippy Makefile rules nicer
These are easy to get subtly wrong, and doing so can cause nondeterministic failures when racing in parallel builds. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--Makefile.am2
-rw-r--r--bfdd/subdir.am9
-rw-r--r--bgpd/subdir.am24
-rwxr-xr-xconfigure.ac8
-rw-r--r--eigrpd/subdir.am9
-rw-r--r--isisd/subdir.am5
-rw-r--r--ldpd/subdir.am5
-rw-r--r--lib/subdir.am23
-rw-r--r--ospfd/subdir.am5
-rw-r--r--pbrd/subdir.am9
-rw-r--r--pimd/subdir.am5
-rw-r--r--python/makefile.py100
-rw-r--r--ripd/subdir.am5
-rw-r--r--ripngd/subdir.am5
-rw-r--r--sharpd/subdir.am5
-rw-r--r--staticd/subdir.am5
-rw-r--r--tests/subdir.am11
-rw-r--r--vrrpd/subdir.am5
-rw-r--r--watchfrr/subdir.am5
-rw-r--r--zebra/subdir.am24
20 files changed, 181 insertions, 88 deletions
diff --git a/Makefile.am b/Makefile.am
index 2937c28933..1e3311fa7b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -110,6 +110,7 @@ dist_examples_DATA =
dist_yangmodels_DATA =
man_MANS =
vtysh_scan =
+clippy_scan =
## libtool, the self-made GNU scourge
## ... this should fix relinking
@@ -184,6 +185,7 @@ EXTRA_DIST += \
python/clidef.py \
python/clippy/__init__.py \
python/makevars.py \
+ python/makefile.py \
\
redhat/frr.logrotate \
redhat/frr.pam \
diff --git a/bfdd/subdir.am b/bfdd/subdir.am
index e12ae37195..a79620c45c 100644
--- a/bfdd/subdir.am
+++ b/bfdd/subdir.am
@@ -25,11 +25,10 @@ bfdd_libbfd_a_SOURCES = \
bfdd/ptm_adapter.c \
# end
-bfdd/bfdd_vty_clippy.c: $(CLIPPY_DEPS)
-bfdd/bfdd_vty.$(OBJEXT): bfdd/bfdd_vty_clippy.c
-
-bfdd/bfdd_cli_clippy.c: $(CLIPPY_DEPS)
-bfdd/bfdd_cli.$(OBJEXT): bfdd/bfdd_cli_clippy.c
+clippy_scan += \
+ bfdd/bfdd_cli.c \
+ bfdd/bfdd_vty.c \
+ # end
noinst_HEADERS += \
bfdd/bfdctl.h \
diff --git a/bgpd/subdir.am b/bgpd/subdir.am
index 27473af8ab..6b5c0fe719 100644
--- a/bgpd/subdir.am
+++ b/bgpd/subdir.am
@@ -217,18 +217,12 @@ bgpd_bgpd_bmp_la_SOURCES = bgpd/bgp_bmp.c
bgpd_bgpd_bmp_la_LIBADD = lib/libfrrcares.la
bgpd_bgpd_bmp_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
-bgpd/bgp_evpn_vty_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_evpn_vty.$(OBJEXT): bgpd/bgp_evpn_vty_clippy.c
-bgpd/bgp_vty_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_vty.$(OBJEXT): bgpd/bgp_vty_clippy.c
-bgpd/bgp_route_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_route.$(OBJEXT): bgpd/bgp_route_clippy.c
-bgpd/bgp_debug_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_debug.$(OBJEXT): bgpd/bgp_debug_clippy.c
-bgpd/bgp_routemap_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_routemap.$(OBJEXT): bgpd/bgp_routemap_clippy.c
-bgpd/bgp_rpki_clippy.c: $(CLIPPY_DEPS)
-$(AUTOMAKE_DUMMY)bgpd/bgpd_bgpd_rpki_la-bgp_rpki.lo: bgpd/bgp_rpki_clippy.c
-$(AUTOMAKE_DUMMY)bgpd/bgpd_rpki_la-bgp_rpki.lo: bgpd/bgp_rpki_clippy.c
-bgpd/bgp_bmp_clippy.c: $(CLIPPY_DEPS)
-bgpd/bgp_bmp.lo: bgpd/bgp_bmp_clippy.c
+clippy_scan += \
+ bgpd/bgp_bmp.c \
+ bgpd/bgp_debug.c \
+ bgpd/bgp_evpn_vty.c \
+ bgpd/bgp_route.c \
+ bgpd/bgp_routemap.c \
+ bgpd/bgp_rpki.c \
+ bgpd/bgp_vty.c \
+ # end
diff --git a/configure.ac b/configure.ac
index 6f7ca9defd..d46fa75c54 100755
--- a/configure.ac
+++ b/configure.ac
@@ -2402,7 +2402,13 @@ AM_CONDITIONAL([STATICD], [test "$enable_staticd" != "no"])
AM_CONDITIONAL([FABRICD], [test "$enable_fabricd" != "no"])
AM_CONDITIONAL([VRRPD], [test "$enable_vrrpd" != "no"])
-AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
+AC_CONFIG_FILES([Makefile],[
+ test "$enable_dev_build" = "yes" && makefile_devbuild="--dev-build"
+ ${PYTHON} "${ac_abs_top_srcdir}/python/makefile.py" ${makefile_devbuild} || exit 1
+], [
+ PYTHON="$PYTHON"
+ enable_dev_build="$enable_dev_build"
+])
AC_CONFIG_FILES([
config.version
diff --git a/eigrpd/subdir.am b/eigrpd/subdir.am
index bf900912ef..8b86b9c8a7 100644
--- a/eigrpd/subdir.am
+++ b/eigrpd/subdir.am
@@ -48,11 +48,10 @@ eigrpdheader_HEADERS = \
eigrpd/eigrpd.h \
# end
-eigrpd/eigrp_vty_clippy.c: $(CLIPPY_DEPS)
-eigrpd/eigrp_vty.$(OBJEXT): eigrpd/eigrp_vty_clippy.c
-
-eigrpd/eigrp_cli_clippy.c: $(CLIPPY_DEPS)
-eigrpd/eigrp_cli.$(OBJEXT): eigrpd/eigrp_cli_clippy.c
+clippy_scan += \
+ eigrpd/eigrp_cli.c \
+ eigrpd/eigrp_vty.c \
+ # end
noinst_HEADERS += \
eigrpd/eigrp_const.h \
diff --git a/isisd/subdir.am b/isisd/subdir.am
index 2b78d6f763..94f9116d34 100644
--- a/isisd/subdir.am
+++ b/isisd/subdir.am
@@ -106,8 +106,9 @@ isisd_libisis_a_SOURCES = \
isisd/isis_cli.c \
#end
-isisd/isis_cli_clippy.c: $(CLIPPY_DEPS)
-isisd/isis_cli.$(OBJEXT): isisd/isis_cli_clippy.c
+clippy_scan += \
+ isisd/isis_cli.c \
+ # end
isisd_isisd_LDADD = isisd/libisis.a $(ISIS_LDADD_COMMON)
isisd_isisd_SOURCES = $(ISIS_SOURCES)
diff --git a/ldpd/subdir.am b/ldpd/subdir.am
index 0960774caa..09936e5c28 100644
--- a/ldpd/subdir.am
+++ b/ldpd/subdir.am
@@ -40,8 +40,9 @@ ldpd_libldp_a_SOURCES = \
ldpd/util.c \
# end
-ldpd/ldp_vty_cmds_clippy.c: $(CLIPPY_DEPS)
-ldpd/ldp_vty_cmds.$(OBJEXT): ldpd/ldp_vty_cmds_clippy.c
+clippy_scan += \
+ ldpd/ldp_vty_cmds.c \
+ # end
noinst_HEADERS += \
ldpd/control.h \
diff --git a/lib/subdir.am b/lib/subdir.am
index 5adbd42c48..2f8cbe5d52 100644
--- a/lib/subdir.am
+++ b/lib/subdir.am
@@ -146,20 +146,15 @@ lib_libfrr_la_LIBADD += $(SQLITE3_LIBS)
lib_libfrr_la_SOURCES += lib/db.c
endif
-lib/if_clippy.c: $(CLIPPY_DEPS)
-lib/if.lo: lib/if_clippy.c
-lib/plist_clippy.c: $(CLIPPY_DEPS)
-lib/plist.lo: lib/plist_clippy.c
-lib/nexthop_group_clippy.c: $(CLIPPY_DEPS)
-lib/nexthop_group.lo: lib/nexthop_group_clippy.c
-lib/northbound_cli_clippy.c: $(CLIPPY_DEPS)
-lib/northbound_cli.lo: lib/northbound_cli_clippy.c
-lib/routemap_cli_clippy.c: $(CLIPPY_DEPS)
-lib/routemap_cli.lo: lib/routemap_cli_clippy.c
-lib/vty_clippy.c: $(CLIPPY_DEPS)
-lib/vty.lo: lib/vty_clippy.c
-lib/log_vty_clippy.c: $(CLIPPY_DEPS)
-lib/log_vty.lo: lib/log_vty_clippy.c
+clippy_scan += \
+ lib/if.c \
+ lib/log_vty.c \
+ lib/nexthop_group.c \
+ lib/northbound_cli.c \
+ lib/plist.c \
+ lib/routemap_cli.c \
+ lib/vty.c \
+ # end
pkginclude_HEADERS += \
lib/agg_table.h \
diff --git a/ospfd/subdir.am b/ospfd/subdir.am
index 119945735a..447ddf9cbb 100644
--- a/ospfd/subdir.am
+++ b/ospfd/subdir.am
@@ -72,8 +72,9 @@ ospfdheader_HEADERS = \
# end
endif
-ospfd/ospf_vty_clippy.c: $(CLIPPY_DEPS)
-ospfd/ospf_vty.$(OBJEXT): ospfd/ospf_vty_clippy.c
+clippy_scan += \
+ ospfd/ospf_vty.c \
+ # end
noinst_HEADERS += \
ospfd/ospf_abr.h \
diff --git a/pbrd/subdir.am b/pbrd/subdir.am
index 45001de2c7..42f279988b 100644
--- a/pbrd/subdir.am
+++ b/pbrd/subdir.am
@@ -33,11 +33,10 @@ noinst_HEADERS += \
pbrd/pbr_vrf.h \
# end
-pbrd/pbr_vty_clippy.c: $(CLIPPY_DEPS)
-pbrd/pbr_vty.$(OBJEXT): pbrd/pbr_vty_clippy.c
-
-pbrd/pbr_debug_clippy.c: $(CLIPPY_DEPS)
-pbrd/pbr_debug.$(OBJEXT): pbrd/pbr_debug_clippy.c
+clippy_scan += \
+ pbrd/pbr_debug.c \
+ pbrd/pbr_vty.c \
+ # end
pbrd_pbrd_SOURCES = pbrd/pbr_main.c
pbrd_pbrd_LDADD = pbrd/libpbr.a lib/libfrr.la $(LIBCAP)
diff --git a/pimd/subdir.am b/pimd/subdir.am
index cbb657dc30..121abea598 100644
--- a/pimd/subdir.am
+++ b/pimd/subdir.am
@@ -123,8 +123,9 @@ noinst_HEADERS += \
pimd/mtracebis_routeget.h \
# end
-pimd/pim_cmd_clippy.c: $(CLIPPY_DEPS)
-pimd/pim_cmd.$(OBJEXT): pimd/pim_cmd_clippy.c
+clippy_scan += \
+ pimd/pim_cmd.c \
+ # end
pimd_pimd_LDADD = pimd/libpim.a lib/libfrr.la $(LIBCAP)
pimd_pimd_SOURCES = pimd/pim_main.c
diff --git a/python/makefile.py b/python/makefile.py
new file mode 100644
index 0000000000..9af397d373
--- /dev/null
+++ b/python/makefile.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python3
+#
+# FRR extended automake/Makefile functionality helper
+#
+# This script is executed on/after generating Makefile to add some pieces for
+# clippy.
+
+import sys
+import os
+import subprocess
+import re
+import argparse
+from string import Template
+
+argp = argparse.ArgumentParser(description = 'FRR Makefile extensions')
+argp.add_argument('--dev-build', action = 'store_const', const = True,
+ help = 'run additional developer checks')
+args = argp.parse_args()
+
+with open('Makefile', 'r') as fd:
+ before = fd.read()
+
+nolinecont = before.replace('\\\n', '')
+m = re.search('^clippy_scan\s*=([^#]*)(?:#.*)?$', nolinecont, flags=re.MULTILINE)
+if m is None:
+ sys.stderr.write('failed to parse Makefile.in\n')
+ sys.exit(2)
+
+clippy_scan = m.group(1).strip().split()
+for clippy_file in clippy_scan:
+ assert clippy_file.endswith('.c')
+
+# check for files using clippy but not listed in clippy_scan
+if args.dev_build:
+ basepath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ if os.path.exists(os.path.join(basepath, '.git')):
+ clippy_ref = subprocess.check_output([
+ 'git', '-C', basepath, 'grep', '-l', '-P', '^#\s*include.*_clippy.c', '--', '**.c']).decode('US-ASCII')
+
+ clippy_ref = set(clippy_ref.splitlines())
+ missing = clippy_ref - set(clippy_scan)
+
+ if len(missing) > 0:
+ sys.stderr.write('error: files seem to be using clippy, but not listed in "clippy_scan" in subdir.am:\n\t%s\n' % ('\n\t'.join(sorted(missing))))
+ sys.exit(1)
+
+clippydep = Template('''
+${clippybase}.$$(OBJEXT): ${clippybase}_clippy.c
+${clippybase}.lo: ${clippybase}_clippy.c
+${clippybase}_clippy.c: $$(CLIPPY_DEPS)''')
+
+clippyauxdep = Template('''# clippy{
+# auxiliary clippy target
+${target}: ${clippybase}_clippy.c
+# }clippy''')
+
+lines = before.splitlines()
+autoderp = '#AUTODERP# '
+out_lines = []
+make_rule_re = re.compile('^([^:\s]+):\s*([^:\s]+)\s*($|\n)')
+
+while lines:
+ line = lines.pop(0)
+ if line.startswith(autoderp):
+ line = line[len(autoderp):]
+
+ if line == '# clippy{':
+ while lines:
+ line = lines.pop(0)
+ if line == '# }clippy':
+ break
+ continue
+
+ if line.startswith('#'):
+ out_lines.append(line)
+ continue
+
+ m = make_rule_re.match(line)
+ if m is None:
+ out_lines.append(line)
+ continue
+
+ if m.group(2) in clippy_scan:
+ out_lines.append(clippyauxdep.substitute(target=m.group(1), clippybase=m.group(2)[:-2]))
+
+ out_lines.append(line)
+
+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('# }clippy')
+out_lines.append('')
+
+after = '\n'.join(out_lines)
+if after == before:
+ sys.exit(0)
+
+with open('Makefile.pyout', 'w') as fd:
+ fd.write(after)
+os.rename('Makefile.pyout', 'Makefile')
diff --git a/ripd/subdir.am b/ripd/subdir.am
index 0a653412b5..9b86c65517 100644
--- a/ripd/subdir.am
+++ b/ripd/subdir.am
@@ -35,8 +35,9 @@ ripd_librip_a_SOURCES = \
ripd/ripd.c \
# end
-ripd/rip_cli_clippy.c: $(CLIPPY_DEPS)
-ripd/rip_cli.$(OBJEXT): ripd/rip_cli_clippy.c
+clippy_scan += \
+ ripd/rip_cli.c \
+ # end
noinst_HEADERS += \
ripd/rip_debug.h \
diff --git a/ripngd/subdir.am b/ripngd/subdir.am
index b0b06731cf..48ba361372 100644
--- a/ripngd/subdir.am
+++ b/ripngd/subdir.am
@@ -30,8 +30,9 @@ ripngd_libripng_a_SOURCES = \
ripngd/ripngd.c \
# end
-ripngd/ripng_cli_clippy.c: $(CLIPPY_DEPS)
-ripngd/ripng_cli.$(OBJEXT): ripngd/ripng_cli_clippy.c
+clippy_scan += \
+ ripngd/ripng_cli.c \
+ # end
noinst_HEADERS += \
ripngd/ripng_debug.h \
diff --git a/sharpd/subdir.am b/sharpd/subdir.am
index b0280e2a0e..4c43c50d43 100644
--- a/sharpd/subdir.am
+++ b/sharpd/subdir.am
@@ -24,8 +24,9 @@ noinst_HEADERS += \
sharpd/sharp_zebra.h \
# end
-sharpd/sharp_vty_clippy.c: $(CLIPPY_DEPS)
-sharpd/sharp_vty.$(OBJEXT): sharpd/sharp_vty_clippy.c
+clippy_scan += \
+ sharpd/sharp_vty.c \
+ # end
sharpd_sharpd_SOURCES = sharpd/sharp_main.c
sharpd_sharpd_LDADD = sharpd/libsharp.a lib/libfrr.la $(LIBCAP)
diff --git a/staticd/subdir.am b/staticd/subdir.am
index b5461191ab..f2b3d11f29 100644
--- a/staticd/subdir.am
+++ b/staticd/subdir.am
@@ -30,8 +30,9 @@ noinst_HEADERS += \
staticd/static_vrf.h \
# end
-staticd/static_vty_clippy.c: $(CLIPPY_DEPS)
-staticd/static_vty.$(OBJEXT): staticd/static_vty_clippy.c
+clippy_scan += \
+ staticd/static_vty.c \
+ # end
staticd_staticd_SOURCES = staticd/static_main.c
staticd_staticd_LDADD = staticd/libstatic.a lib/libfrr.la $(LIBCAP)
diff --git a/tests/subdir.am b/tests/subdir.am
index 5efdcbbd4c..04053a6f46 100644
--- a/tests/subdir.am
+++ b/tests/subdir.am
@@ -38,13 +38,10 @@ else
TESTS_OSPF6D =
endif
-tests/lib/cli/test_cli_clippy.c: $(CLIPPY_DEPS)
-tests/lib/cli/tests_lib_cli_test_cli-test_cli.$(OBJEXT): tests/lib/cli/test_cli_clippy.c
-tests/lib/cli/test_cli-test_cli.$(OBJEXT): tests/lib/cli/test_cli_clippy.c
-
-tests/ospf6d/test_lsdb_clippy.c: $(CLIPPY_DEPS)
-tests/ospf6d/tests_ospf6d_test_lsdb-test_lsdb.$(OBJEXT): tests/ospf6d/test_lsdb_clippy.c
-tests/ospf6d/test_lsdb-test_lsdb.$(OBJEXT): tests/ospf6d/test_lsdb_clippy.c
+clippy_scan += \
+ tests/lib/cli/test_cli.c \
+ tests/ospf6d/test_lsdb.c \
+ # end
check_PROGRAMS = \
tests/lib/cxxcompat \
diff --git a/vrrpd/subdir.am b/vrrpd/subdir.am
index 5052b5c291..412ee1c3cf 100644
--- a/vrrpd/subdir.am
+++ b/vrrpd/subdir.am
@@ -31,8 +31,9 @@ noinst_HEADERS += \
vrrpd/vrrp_zebra.h \
# end
-vrrpd/vrrp_vty_clippy.c: $(CLIPPY_DEPS)
-vrrpd/vrrp_vty.$(OBJEXT): vrrpd/vrrp_vty_clippy.c
+clippy_scan += \
+ vrrpd/vrrp_vty.c \
+ # end
vrrpd_vrrpd_SOURCES = vrrpd/vrrp_main.c
vrrpd_vrrpd_LDADD = vrrpd/libvrrp.a lib/libfrr.la @LIBCAP@
diff --git a/watchfrr/subdir.am b/watchfrr/subdir.am
index 6dceedf82a..677f85efcb 100644
--- a/watchfrr/subdir.am
+++ b/watchfrr/subdir.am
@@ -20,5 +20,6 @@ watchfrr_watchfrr_SOURCES = \
watchfrr/watchfrr_vty.c \
# end
-watchfrr/watchfrr_vty_clippy.c: $(CLIPPY_DEPS)
-watchfrr/watchfrr_vty.$(OBJEXT): watchfrr/watchfrr_vty_clippy.c
+clippy_scan += \
+ watchfrr/watchfrr_vty.c \
+ # end
diff --git a/zebra/subdir.am b/zebra/subdir.am
index bb1aed0346..5601b4c379 100644
--- a/zebra/subdir.am
+++ b/zebra/subdir.am
@@ -109,22 +109,14 @@ zebra_zebra_SOURCES = \
zebra/zebra_gr.c \
# end
-zebra/debug_clippy.c: $(CLIPPY_DEPS)
-zebra/debug.$(OBJEXT): zebra/debug_clippy.c
-
-zebra/zebra_mlag_vty_clippy.c: $(CLIPPY_DEPS)
-zebra/zebra_mlag_vty.$(OBJEXT): zebra/zebra_mlag_vty_clippy.c
-
-zebra/zebra_vty_clippy.c: $(CLIPPY_DEPS)
-zebra/interface_clippy.c: $(CLIPPY_DEPS)
-zebra/interface.$(OBJEXT): zebra/interface_clippy.c
-zebra/zebra_vty.$(OBJEXT): zebra/zebra_vty_clippy.c
-
-zebra/zebra_routemap_clippy.c: $(CLIPPY_DEPS)
-zebra/zebra_routemap.$(OBJEXT): zebra/zebra_routemap_clippy.c
-
-zebra/rtadv_clippy.c: $(CLIPPY_DEPS)
-zebra/rtadv.$(OBJEXT): zebra/rtadv_clippy.c
+clippy_scan += \
+ zebra/debug.c \
+ zebra/interface.c \
+ zebra/rtadv.c \
+ zebra/zebra_mlag_vty.c \
+ zebra/zebra_routemap.c \
+ zebra/zebra_vty.c \
+ # end
noinst_HEADERS += \
zebra/connected.h \