[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: maintainer-makefile: catch uses of $< in non-implicit rules
From: |
Akim Demaille |
Subject: |
Re: maintainer-makefile: catch uses of $< in non-implicit rules |
Date: |
Sat, 18 May 2019 11:51:19 +0200 |
Hi Paul!
> Le 18 mai 2019 à 09:52, Paul Eggert <address@hidden> a écrit :
>
> Akim Demaille wrote:
>> + };
>> \
>
> Thanks, that looks good except I don't see why some of the lines like the
> above have semicolons while others don't.
You're right, more consistency wouldn't hurt. Because everything ends in a
single line, some of them are needed (separators of statements of compound
statements), others aren't.
How about this?
commit 2e801e81bb362429d0e252d076233bfdac20e367
Author: Akim Demaille <address@hidden>
Date: Sat May 18 08:46:00 2019 +0200
maintainer-makefile: catch uses of $< in non-implicit rules
* top/maint.mk (sc_prohibit_magic_number_exit): New.
diff --git a/ChangeLog b/ChangeLog
index 1918041f0..8d5a4ca6e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-18 Akim Demaille <address@hidden>
+
+ maintainer-makefile: catch uses of $< in non-implicit rules
+ * top/maint.mk (sc_prohibit_magic_number_exit): New.
+
2019-05-14 Paul Eggert <address@hidden>
close-stream, closein, closeout: simplify
diff --git a/top/maint.mk b/top/maint.mk
index e9d5ee7d4..3dbe9c378 100644
--- a/top/maint.mk
+++ b/top/maint.mk
@@ -408,6 +408,41 @@ sc_prohibit_magic_number_exit:
halt='use EXIT_* values rather than magic number' \
$(_sc_search_regexp)
+# Check that we don't use $< in non-implicit Makefile rules.
+#
+# To find the Makefiles, trace AC_CONFIG_FILES. Using VC_LIST would
+# miss the Makefiles that are not under VC control (e.g., symlinks
+# installed for gettext). "Parsing" (recursive) uses of SUBDIRS seems
+# too delicate.
+#
+# Use GNU Make's --print-data-base to normalize the rules into some
+# easy to parse format: they are separated by two \n. Look for the
+# "section" about non-pattern rules (marked with "# Files") inside
+# which there are still the POSIX Make like implicit rules (".c.o").
+sc_prohibit_gnu_make_extensions_awk_ = \
+ BEGIN { \
+ RS = "\n\n"; \
+ in_rules = 0; \
+ } \
+ /^\# Files/ {
\
+ in_rules = 1; \
+ } \
+ /\$$</ && in_rules && $$0 !~ /^(.*\n)*\.\w+(\.\w+)?:/ { \
+ print "Error: " file ": $$< in a non implicit rule\n" $$0; \
+ status = 1; \
+ } \
+ END {
\
+ exit status; \
+ }
+sc_prohibit_gnu_make_extensions:
+ (cd $(srcdir) && autoconf --trace AC_CONFIG_FILES:'$$1') | \
+ tr ' ' '\n' | \
+ $(SED) -ne '/Makefile/{s/\.in$$//;p;}' | \
+ while read m; do \
+ $(MAKE) -qp -f $$m .DUMMY-TARGET 2>/dev/null | \
+ awk -v file=$$m -e '$(address@hidden)' || exit 1; \
+ done
+
# Using EXIT_SUCCESS as the first argument to error is misleading,
# since when that parameter is 0, error does not exit. Use '0' instead.
sc_error_exit_success: