summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2023-01-11 22:07:22 -0500
committerMike Frysinger <vapier@gentoo.org>2023-01-12 20:25:57 -0500
commit55f8fcfd08cbf15d65d61dd2db934b6c3171cf06 (patch)
tree7a41c1aa5852bdd04e44d7e54065951db1a0228c
parent054b02ce444c6c65dc5cfa68e67741ce43e76b1b (diff)
downloadautomake-55f8fcfd08cbf15d65d61dd2db934b6c3171cf06.tar.gz
dirstamp: switch to a pattern rule
We can leverage $(@D) to generate a single pattern rule for all dirstamp rules. This saves many lines in the output -- normally we create 2 rules (or 6 lines) per subdir, and projects that use subdirs tend to use them quite a bit. In the most extreme & unlikely case (1 subdir, no depdir support), the line count is the same. In every other case, it's always a win. Looking at a few real world projects, the line deltas: * GNU libgloss: +3 -66 * GNU newlib: +3 -714 * GNU sim: +3 -138 There shouldn't be any concerns about portability with $(@D) because: (0) This has been in POSIX (and beyond) for decades, (1) We only generate this rule iff we know the dirstamp is in a subdir (so we'd never have a case where $(@D) would expand to the cwd, and that is where a few implementations are known to be buggy), (2) We already rely on $(@D) in our depdir code, and have since 2014 (the Automake 1.16 release).
-rw-r--r--bin/automake.in12
1 files changed, 8 insertions, 4 deletions
diff --git a/bin/automake.in b/bin/automake.in
index 1c13a3187..139d5ad93 100644
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -7893,6 +7893,14 @@ sub require_build_directory
$directory_map{$directory} = $dirstamp;
$directory_map{$cdir} = $dirstamp;
+ # Generate the pattern rule only once.
+ if (! vardef ('am__dirstamp', TRUE))
+ {
+ $output_rules .= ("%/\$(am__dirstamp):\n"
+ . "\t\@\$(MKDIR_P) \$(\@D)\n"
+ . "\t\@: >>\$\@\n");
+ }
+
# Set a variable for the dirstamp basename.
define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
'$(am__leading_dot)dirstamp');
@@ -7900,10 +7908,6 @@ sub require_build_directory
# Directory must be removed by 'make distclean'.
$clean_files{$dirstamp} = DIST_CLEAN;
- $output_rules .= ("$dirstamp:\n"
- . "\t\@\$(MKDIR_P) $directory\n"
- . "\t\@: >>$dirstamp\n");
-
return $dirstamp;
}