[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[automake-commit] branch master updated: automake: disable GNU make's in
From: |
Karl Berry |
Subject: |
[automake-commit] branch master updated: automake: disable GNU make's internal pattern rules, for speed. |
Date: |
Thu, 20 Jul 2023 21:03:40 -0400 |
This is an automated email from the git hooks/post-receive script.
karl pushed a commit to branch master
in repository automake.
View the commit online:
https://git.savannah.gnu.org/gitweb/?p=automake.git;a=commitdiff;h=dbdfa65c2d75383f3defc734dd9aab86da6ae29d
The following commit(s) were added to refs/heads/master by this push:
new dbdfa65c2 automake: disable GNU make's internal pattern rules, for
speed.
dbdfa65c2 is described below
commit dbdfa65c2d75383f3defc734dd9aab86da6ae29d
Author: Bruno Haible <bruno@clisp.org>
AuthorDate: Thu Jul 20 18:03:27 2023 -0700
automake: disable GNU make's internal pattern rules, for speed.
From https://bugs.gnu.org/64743.
* lib/am/footer.am: Disable GNU make's internal pattern rules.
* lib/Automake/Rule.pm (_conditionals_for_rule): Add special handling
for these pattern rules from footer.am.
(define): Likewise.
* t/nodep.sh: Update test to avoid matching the new %:: rules.
* t/fnoc.sh: Update test to avoid matching the new %:: SCCS rule.
* NEWS: Mention this.
* doc/automake.texi (Suffixes): Likewise.
(Doc changes written by Karl.)
---
NEWS | 3 +++
doc/automake.texi | 8 ++++++++
lib/Automake/Rule.pm | 39 +++++++++++++++++++++++----------------
lib/am/footer.am | 11 +++++++++++
t/fnoc.sh | 7 ++++++-
t/nodep.sh | 2 +-
6 files changed, 52 insertions(+), 18 deletions(-)
diff --git a/NEWS b/NEWS
index c64d4ef15..ced0fd640 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,9 @@ New in 1.17:
- Variables using escaped \# will trigger portability warnings, but be
retained when appended. GNU Make & BSD Makes are known to support it.
+ - GNU Make's default pattern rules are disabled, for speed and debugging.
+ (.SUFFIXES was already cleared.) (bug#64743)
+
- For Texinfo documents, if a .texi.in file exists, but no .texi, the
.texi.in will be read. Texinfo source files need not be present at
all, and if present, need not contain @setfilename. Then the file name
diff --git a/doc/automake.texi b/doc/automake.texi
index 4561d1948..3b4f06e73 100644
--- a/doc/automake.texi
+++ b/doc/automake.texi
@@ -10977,6 +10977,14 @@ Automake generate the suffix list for
@code{.SUFFIXES}. Any given
@code{SUFFIXES} go at the start of the generated suffixes list, followed
by Automake generated suffixes not already in the list.
+@c https://bugs.gnu.org/64743.
+@cindex built-in suffix and pattern rules, disabled
+@cindex suffix rules of Make, disabled
+@cindex pattern rules of GNU Make, disabled
+Automake disables the Make program's built-in rules with a
+@code{.SUFFIXES:} rule, and then adds whatever suffixes are
+necessary. Automake also disables GNU Make's built-in pattern rules.
+
@node Include
@chapter Include
diff --git a/lib/Automake/Rule.pm b/lib/Automake/Rule.pm
index 9f72d2728..52ee3be4a 100644
--- a/lib/Automake/Rule.pm
+++ b/lib/Automake/Rule.pm
@@ -695,6 +695,9 @@ sub _conditionals_for_rule ($$$$)
return $cond if !$message; # No ambiguity.
+ # Don't coalesce the several pattern rules from footer.am into a single one.
+ return $cond if $target eq "%:" && $where->get =~ /\/am\/footer\.am$/;
+
if ($owner == RULE_USER)
{
# For user rules, just diagnose the ambiguity.
@@ -764,23 +767,27 @@ sub define ($$$$$)
my $tdef = _rule_defn_with_exeext_awareness ($target, $cond, $where);
- # A GNU make-style pattern rule has a single "%" in the target name.
- msg ('portability', $where,
- "'%'-style pattern rules are a GNU make extension")
- if $target =~ /^[^%]*%[^%]*$/;
-
- # See whether this is a duplicated target declaration.
- if ($tdef)
+ # The pattern rules in footer.am look like duplicates, but really aren't.
+ if ($source !~ /\/am\/footer\.am$/)
{
- # Diagnose invalid target redefinitions, if any. Note that some
- # target redefinitions are valid (e.g., for multiple-targets
- # pattern rules).
- _maybe_warn_about_duplicated_target ($target, $tdef, $source,
- $owner, $cond, $where);
- # Return so we don't redefine the rule in our tables, don't check
- # for ambiguous condition, etc. The rule will be output anyway
- # because '&read_am_file' ignores the return code.
- return ();
+ # A GNU make-style pattern rule has a single "%" in the target name.
+ msg ('portability', $where,
+ "'%'-style pattern rules are a GNU make extension")
+ if $target =~ /^[^%]*%[^%]*$/;
+
+ # See whether this is a duplicated target declaration.
+ if ($tdef)
+ {
+ # Diagnose invalid target redefinitions, if any. Note that some
+ # target redefinitions are valid (e.g., for multiple-targets
+ # pattern rules).
+ _maybe_warn_about_duplicated_target ($target, $tdef, $source,
+ $owner, $cond, $where);
+ # Return so we don't redefine the rule in our tables, don't check
+ # for ambiguous condition, etc. The rule will be output anyway
+ # because '&read_am_file' ignores the return code.
+ return ();
+ }
}
my $rule = _crule $target;
diff --git a/lib/am/footer.am b/lib/am/footer.am
index 9715c826c..388defb14 100644
--- a/lib/am/footer.am
+++ b/lib/am/footer.am
@@ -17,3 +17,14 @@
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
+
+# Tell GNU make to disable its built-in pattern rules.
+## This reduces make's internal processing.
+## Recommended by Paul Smith in
+## <https://lists.gnu.org/archive/html/bug-make/2023-07/msg00063.html>.
+## These rules have no effect on non-GNU make implementations.
+%:: %,v
+%:: RCS/%,v
+%:: RCS/%
+%:: s.%
+%:: SCCS/s.%
diff --git a/t/fnoc.sh b/t/fnoc.sh
index 97b694c63..7d6b49096 100644
--- a/t/fnoc.sh
+++ b/t/fnoc.sh
@@ -35,5 +35,10 @@ END
$ACLOCAL
$AUTOMAKE
-grep '[^F]CC' Makefile.in | grep -v MKDEP && exit 1
+# In bug#64743, explicit rules were added to disable make's default
+# built-in rules, including one for SCCS:
+# %:: SCCS/s.%
+# So don't match that. Meanwhile, MKDEP does not occur in the output
+# any more, but leaving it in in case it comes back.
+grep '[^F]CC' Makefile.in | grep -v MKDEP | grep -v SCCS && exit 1
exit 0
diff --git a/t/nodep.sh b/t/nodep.sh
index 4201c8ead..0174b838e 100644
--- a/t/nodep.sh
+++ b/t/nodep.sh
@@ -37,6 +37,6 @@ $ACLOCAL
$AUTOMAKE
sed 's/printf .*%s//' Makefile.in > Makefile.tmp
-grep '%' Makefile.tmp && exit 1
+grep -v '^%::' Makefile.tmp | grep '%' && exit 1
:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [automake-commit] branch master updated: automake: disable GNU make's internal pattern rules, for speed.,
Karl Berry <=