Linux Manual Pages development
 help / color / mirror / Atom feed
* [PATCH v1] share/mk/: Use suffix rules where possible
@ 2026-08-30 14:51 Alejandro Colomar
  2026-08-30 16:55 ` Alejandro Colomar
  0 siblings, 1 reply; 4+ messages in thread
From: Alejandro Colomar @ 2026-08-30 14:51 UTC (permalink / raw)
  To: linux-man; +Cc: Alejandro Colomar, Ingo Schwarze

[-- Attachment #1: Type: text/plain, Size: 15952 bytes --]

Ingo complained that the size of the database is huge.  We can't make it
much smaller than this, but at least we can shrink it to one third.

Using suffix rules, we avoid having an explicit copy of the file list
in the rules, and thus optimizes the makefiles so that make(1)'s
database shrinks to around 1/3rd of the size.  The time for running
'make nothing' also improves from ~ 0.45 s to ~ 0.33 s in my computer.

Reported-by: Ingo Schwarze <schwarze@openbsd.org>
Message-ID: <apL7VAruk1bIOr1M@isnote.usta.de>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---

Hi Ingo,

Here's an optimization for the man-pages' build system.  Would you mind
checking if this also shows similar improvements in your system?


Have a lovely day!
Alex

 share/mk/build/catman/eqn.mk        |  2 +-
 share/mk/build/catman/grotty.mk     |  2 +-
 share/mk/build/catman/troff.mk      |  2 +-
 share/mk/build/examples/cc.mk       |  2 +-
 share/mk/build/examples/dir.mk      |  2 +-
 share/mk/build/html/post-grohtml.mk |  2 +-
 share/mk/build/html/troff.mk        |  2 +-
 share/mk/build/pdf/pages/eqn.mk     |  2 +-
 share/mk/build/pdf/pages/troff.mk   |  2 +-
 share/mk/build/pre/preconv.mk       |  2 +-
 share/mk/build/pre/tbl.mk           |  2 +-
 share/mk/build/ps/eqn.mk            |  2 +-
 share/mk/build/ps/grops.mk          |  2 +-
 share/mk/build/ps/troff.mk          |  2 +-
 share/mk/check/catman/col.mk        |  2 +-
 share/mk/check/catman/grep.mk       |  2 +-
 share/mk/lint/c/clang-tidy.mk       | 11 ++---------
 share/mk/lint/c/cppcheck.mk         | 11 ++---------
 share/mk/lint/c/cpplint.mk          | 10 ++--------
 share/mk/lint/c/iwyu.mk             | 11 ++---------
 share/mk/lint/man/blank.mk          |  2 +-
 share/mk/lint/man/dash.mk           |  2 +-
 share/mk/lint/man/mandoc.mk         |  2 +-
 share/mk/lint/man/poems.mk          |  2 +-
 share/mk/lint/man/quote.mk          |  2 +-
 share/mk/lint/man/so.mk             |  2 +-
 share/mk/lint/man/ws.mk             |  2 +-
 27 files changed, 31 insertions(+), 58 deletions(-)

diff --git a/share/mk/build/catman/eqn.mk b/share/mk/build/catman/eqn.mk
index 895662ac3710..e2830dab53ac 100644
--- a/share/mk/build/catman/eqn.mk
+++ b/share/mk/build/catman/eqn.mk
@@ -18,7 +18,7 @@ ext ::= .cat.troff
 _CATMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
 
 
-$(_CATMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
+%$(ext): %.eqn $(MK) | $$(@D)/
 	$(info	$(INFO_)EQN		$@)
 	! ($(EQN) -T$(NROFF_OUT_DEVICE) $(EQNFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/build/catman/grotty.mk b/share/mk/build/catman/grotty.mk
index 66151b6cee93..a578edbeb191 100644
--- a/share/mk/build/catman/grotty.mk
+++ b/share/mk/build/catman/grotty.mk
@@ -16,7 +16,7 @@ ext ::= .cat
 _CATMAN ::= $(patsubst %.cat.set, %$(ext), $(_CATMAN_set))
 
 
-$(_CATMAN): %$(ext): %.cat.set $(MK) | $$(@D)/
+%$(ext): %.cat.set $(MK) | $$(@D)/
 	$(info	$(INFO_)GROTTY		$@)
 	$(GROTTY) $(GROTTYFLAGS_) <$< >$@
 
diff --git a/share/mk/build/catman/troff.mk b/share/mk/build/catman/troff.mk
index 07e315327278..fc5bf0c18de8 100644
--- a/share/mk/build/catman/troff.mk
+++ b/share/mk/build/catman/troff.mk
@@ -28,7 +28,7 @@ endif
 _CATMAN_set ::= $(tgts)
 
 
-$(_CATMAN_set): %$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
+%$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)TROFF		$@)
 	! ($(TROFF) -mandoc $(TROFFFLAGS_) $(NROFFFLAGS_) <$< 2>&1 >$@ \
 	   | $(GREP) -v -f '$(filter %.grep, $^)' \
diff --git a/share/mk/build/examples/cc.mk b/share/mk/build/examples/cc.mk
index 680b80f3e832..5806d8de0118 100644
--- a/share/mk/build/examples/cc.mk
+++ b/share/mk/build/examples/cc.mk
@@ -25,7 +25,7 @@ endif
 _EX_TU_o ::= $(tgts)
 
 
-$(_EX_TU_o): %$(ext): %.c $(MK)
+%$(ext): %.c $(MK)
 	$(info	$(INFO_)CC		$@)
 	$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<
 
diff --git a/share/mk/build/examples/dir.mk b/share/mk/build/examples/dir.mk
index 10286c73bc0c..9782ad300193 100644
--- a/share/mk/build/examples/dir.mk
+++ b/share/mk/build/examples/dir.mk
@@ -14,7 +14,7 @@ include $(MAKEFILEDIR)/configure/build-depends/coreutils/touch.mk
 _PAGEEXDIRS ::= $(patsubst %, %.d/, $(_NONSO))
 
 
-$(_PAGEEXDIRS):
+%.d/:
 	+$(info	$(INFO_)MKDIR		$@)
 	+$(MKDIR) -p $@
 	+$(TOUCH) $@
diff --git a/share/mk/build/html/post-grohtml.mk b/share/mk/build/html/post-grohtml.mk
index 0c96a78609d8..fa886f09d0d8 100644
--- a/share/mk/build/html/post-grohtml.mk
+++ b/share/mk/build/html/post-grohtml.mk
@@ -16,7 +16,7 @@ ext ::= .html
 _HTMLMAN ::= $(patsubst %.html.set, %$(ext), $(_HTMLMAN_set))
 
 
-$(_HTMLMAN): %$(ext): %.html.set $(MK) | $$(@D)/
+%$(ext): %.html.set $(MK) | $$(@D)/
 	$(info	$(INFO_)POST_GROHTML	$@)
 	$(POST_GROHTML) $(POST_GROHTMLFLAGS_) <$< >$@
 
diff --git a/share/mk/build/html/troff.mk b/share/mk/build/html/troff.mk
index b6c1e659b7e4..6bdf9db1dbfa 100644
--- a/share/mk/build/html/troff.mk
+++ b/share/mk/build/html/troff.mk
@@ -25,7 +25,7 @@ endif
 _HTMLMAN_set ::= $(tgts)
 
 
-$(_HTMLMAN_set): %$(ext): %.eqn $(MK) | $$(@D)/
+%$(ext): %.eqn $(MK) | $$(@D)/
 	$(info	$(INFO_)TROFF		$@)
 	! ($(TROFF) -mandoc -Thtml $(TROFFFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/build/pdf/pages/eqn.mk b/share/mk/build/pdf/pages/eqn.mk
index 6ef945af3e10..49b1a72c6b08 100644
--- a/share/mk/build/pdf/pages/eqn.mk
+++ b/share/mk/build/pdf/pages/eqn.mk
@@ -17,7 +17,7 @@ ext ::= .pdf.troff
 _PDFMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
 
 
-$(_PDFMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
+%$(ext): %.eqn $(MK) | $$(@D)/
 	$(info	$(INFO_)EQN		$@)
 	! ($(EQN) -Tpdf $(EQNFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/build/pdf/pages/troff.mk b/share/mk/build/pdf/pages/troff.mk
index e4c4d347fe6c..550168646d5b 100644
--- a/share/mk/build/pdf/pages/troff.mk
+++ b/share/mk/build/pdf/pages/troff.mk
@@ -25,7 +25,7 @@ endif
 _PDFMAN_set ::= $(tgts)
 
 
-$(_PDFMAN_set): %$(ext): %.pdf.troff $(MK) | $$(@D)/
+%$(ext): %.pdf.troff $(MK) | $$(@D)/
 	$(info	$(INFO_)TROFF		$@)
 	! ($(TROFF) -mandoc -Tpdf $(TROFFFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/build/pre/preconv.mk b/share/mk/build/pre/preconv.mk
index d19d12d261d7..e3dde5981949 100644
--- a/share/mk/build/pre/preconv.mk
+++ b/share/mk/build/pre/preconv.mk
@@ -16,7 +16,7 @@ ext ::= .tbl
 _MAN_tbl ::= $(patsubst %, %$(ext), $(_NONSO))
 
 
-$(_MAN_tbl): %$(ext): % $(MK) | $$(@D)/
+%$(ext): % $(MK) | $$(@D)/
 	$(info	$(INFO_)PRECONV		$@)
 	$(PRECONV) $(PRECONVFLAGS_) $< >$@
 
diff --git a/share/mk/build/pre/tbl.mk b/share/mk/build/pre/tbl.mk
index 5883b6ec0c80..0375b958ff05 100644
--- a/share/mk/build/pre/tbl.mk
+++ b/share/mk/build/pre/tbl.mk
@@ -16,7 +16,7 @@ ext ::= .eqn
 _MAN_eqn ::= $(patsubst %.tbl, %$(ext), $(_MAN_tbl))
 
 
-$(_MAN_eqn): %$(ext): %.tbl $(MK) | $$(@D)/
+%$(ext): %.tbl $(MK) | $$(@D)/
 	$(info	$(INFO_)TBL		$@)
 	$(TBL) <$< >$@
 
diff --git a/share/mk/build/ps/eqn.mk b/share/mk/build/ps/eqn.mk
index 315bed0e4cde..18c885655c99 100644
--- a/share/mk/build/ps/eqn.mk
+++ b/share/mk/build/ps/eqn.mk
@@ -17,7 +17,7 @@ ext ::= .ps.troff
 _PSMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
 
 
-$(_PSMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
+%$(ext): %.eqn $(MK) | $$(@D)/
 	$(info	$(INFO_)EQN		$@)
 	! ($(EQN) -Tps $(EQNFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/build/ps/grops.mk b/share/mk/build/ps/grops.mk
index 463c7bac6f08..4b85b6a96854 100644
--- a/share/mk/build/ps/grops.mk
+++ b/share/mk/build/ps/grops.mk
@@ -16,7 +16,7 @@ ext ::= .ps
 _PSMAN ::= $(patsubst %.ps.set, %$(ext), $(_PSMAN_set))
 
 
-$(_PSMAN): %$(ext): %.ps.set $(MK) | $$(@D)/
+%$(ext): %.ps.set $(MK) | $$(@D)/
 	$(info	$(INFO_)GROPS		$@)
 	$(GROPS) $(GROPSFLAGS_) <$< >$@
 
diff --git a/share/mk/build/ps/troff.mk b/share/mk/build/ps/troff.mk
index 851fb971faf3..8137014fe9e9 100644
--- a/share/mk/build/ps/troff.mk
+++ b/share/mk/build/ps/troff.mk
@@ -25,7 +25,7 @@ endif
 _PSMAN_set ::= $(tgts)
 
 
-$(_PSMAN_set): %$(ext): %.ps.troff $(MK) | $$(@D)/
+%$(ext): %.ps.troff $(MK) | $$(@D)/
 	$(info	$(INFO_)TROFF		$@)
 	! ($(TROFF) -mandoc -Tps $(TROFFFLAGS_) <$< 2>&1 >$@) \
 	| $(GREP) ^ >&2
diff --git a/share/mk/check/catman/col.mk b/share/mk/check/catman/col.mk
index 25b8b6e154a6..de326d989183 100644
--- a/share/mk/check/catman/col.mk
+++ b/share/mk/check/catman/col.mk
@@ -16,7 +16,7 @@ ext ::= .cat.grep
 _CHECK_catman_grep ::= $(patsubst %.cat, %$(ext), $(_CATMAN))
 
 
-$(_CHECK_catman_grep): %$(ext): %.cat $(MK) | $$(@D)/
+%$(ext): %.cat $(MK) | $$(@D)/
 	$(info	$(INFO_)COL		$@)
 	$(COL) $(COLFLAGS_) <$< >$@
 
diff --git a/share/mk/check/catman/grep.mk b/share/mk/check/catman/grep.mk
index bcfa1a134459..2fce886ae920 100644
--- a/share/mk/check/catman/grep.mk
+++ b/share/mk/check/catman/grep.mk
@@ -25,7 +25,7 @@ endif
 _CHECK_catman ::= $(tgts)
 
 
-$(_CHECK_catman): %.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
+%.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
 	$(info	$(INFO_)GREP		$@)
 	! $(GREP) -n '.\{$(MANWIDTH)\}.' $< /dev/null >&2
 	$(TOUCH) $@
diff --git a/share/mk/lint/c/clang-tidy.mk b/share/mk/lint/c/clang-tidy.mk
index 8333c8ace12c..d992b956baf3 100644
--- a/share/mk/lint/c/clang-tidy.mk
+++ b/share/mk/lint/c/clang-tidy.mk
@@ -24,14 +24,8 @@ ifeq ($(SKIP_XFAIL),yes)
 tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
 endif
 
-tgts ::= $(tgts_EX)
 
-
-$(tgts_EX): %$(ext): %
-$(tgts): $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
-
-
-$(tgts):
+%$(ext): % $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
 	$(info	$(INFO_)CLANG_TIDY	$@)
 	$(CLANG_TIDY) $(CLANG_TIDYFLAGS_) $< -- $(CLANGFLAGS_) $(CPPFLAGS_) 2>&1 \
 	| $(SED) '/generated\.$$/d' >&2
@@ -39,13 +33,12 @@ $(tgts):
 
 
 .PHONY: lint-c-clang-tidy
-lint-c-clang-tidy: $(tgts);
+lint-c-clang-tidy: $(tgts_EX);
 
 
 undefine ext
 undefine xfail
 undefine tgts_EX
-undefine tgts
 
 
 endif  # include guard
diff --git a/share/mk/lint/c/cppcheck.mk b/share/mk/lint/c/cppcheck.mk
index c377120e4fa1..3952414c9cfd 100644
--- a/share/mk/lint/c/cppcheck.mk
+++ b/share/mk/lint/c/cppcheck.mk
@@ -21,27 +21,20 @@ ifeq ($(SKIP_XFAIL),yes)
 tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
 endif
 
-tgts ::= $(tgts_EX)
 
-
-$(tgts_EX): %$(ext): %
-$(tgts): $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
-
-
-$(tgts):
+%$(ext): % $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
 	$(info	$(INFO_)CPPCHECK	$@)
 	$(CPPCHECK) $(CPPCHECKFLAGS_) $<
 	$(TOUCH) $@
 
 
 .PHONY: lint-c-cppcheck
-lint-c-cppcheck: $(tgts);
+lint-c-cppcheck: $(tgts_EX);
 
 
 undefine ext
 undefine xfail
 undefine tgts_EX
-undefine tgts
 
 
 endif  # include guard
diff --git a/share/mk/lint/c/cpplint.mk b/share/mk/lint/c/cpplint.mk
index 6a714bc315ad..9ecef7f45553 100644
--- a/share/mk/lint/c/cpplint.mk
+++ b/share/mk/lint/c/cpplint.mk
@@ -13,26 +13,20 @@ include $(MAKEFILEDIR)/configure/build-depends/cpplint/cpplint.mk
 
 ext ::= .lint-c.cpplint.touch
 tgts_EX ::= $(patsubst %, %$(ext), $(_EX_TU_src))
-tgts    ::= $(tgts_EX)
 
 
-$(tgts_EX): %$(ext): %
-$(tgts): $(CPPLINT_CONF) $(MK) | $$(@D)/
-
-
-$(tgts):
+%$(ext): % $(CPPLINT_CONF) $(MK) | $$(@D)/
 	$(info	$(INFO_)CPPLINT		$@)
 	$(CPPLINT) $(CPPLINTFLAGS_) $< >/dev/null
 	$(TOUCH) $@
 
 
 .PHONY: lint-c-cpplint
-lint-c-cpplint: $(tgts);
+lint-c-cpplint: $(tgts_EX);
 
 
 undefine ext
 undefine tgts_EX
-undefine tgts
 
 
 endif  # include guard
diff --git a/share/mk/lint/c/iwyu.mk b/share/mk/lint/c/iwyu.mk
index e4477dbfac58..03bc68f55546 100644
--- a/share/mk/lint/c/iwyu.mk
+++ b/share/mk/lint/c/iwyu.mk
@@ -27,14 +27,8 @@ ifeq ($(SKIP_XFAIL),yes)
 tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
 endif
 
-tgts ::= $(tgts_EX)
 
-
-$(tgts_EX): %$(ext): %
-$(tgts): $(MK) | $$(@D)/
-
-
-$(tgts):
+%$(ext): % $(MK) | $$(@D)/
 	$(info	$(INFO_)IWYU		$@)
 	! ($(IWYU) $(IWYUFLAGS_) $(CLANGFLAGS_) $(CPPFLAGS_) $< 2>&1 \
 	   | $(SED) -n '/should add these lines:/,$$p' \
@@ -48,13 +42,12 @@ $(tgts):
 
 
 .PHONY: lint-c-iwyu
-lint-c-iwyu: $(tgts);
+lint-c-iwyu: $(tgts_EX);
 
 
 undefine ext
 undefine xfail
 undefine tgts_EX
-undefine tgts
 
 
 endif  # include guard
diff --git a/share/mk/lint/man/blank.mk b/share/mk/lint/man/blank.mk
index f8eca7ac86b7..8fc7ad4be0a8 100644
--- a/share/mk/lint/man/blank.mk
+++ b/share/mk/lint/man/blank.mk
@@ -22,7 +22,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(MK) | $$(@D)/
+%$(ext): % $(MK) | $$(@D)/
 	$(info	$(INFO_)GREP		$@)
 	$(CAT) <$< \
 	| if $(GREP) '^$$' >/dev/null; then \
diff --git a/share/mk/lint/man/dash.mk b/share/mk/lint/man/dash.mk
index 85307af0e449..d82ac734880d 100644
--- a/share/mk/lint/man/dash.mk
+++ b/share/mk/lint/man/dash.mk
@@ -21,7 +21,7 @@ regexf ::= $(MAKEFILEDIR)/lint/man/dash.pcre2grep
 tgts ::= $(patsubst %, %$(ext), $(_NONSO))
 
 
-$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
+%$(ext): % $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)PCRE2GREP	$@)
 	$(CAT) <$< \
 	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
diff --git a/share/mk/lint/man/mandoc.mk b/share/mk/lint/man/mandoc.mk
index 5c24ca66ee7a..d96f94439933 100644
--- a/share/mk/lint/man/mandoc.mk
+++ b/share/mk/lint/man/mandoc.mk
@@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
+%$(ext): % $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)MANDOC		$@)
 	! ($(MANDOC) $(MANDOCFLAGS_) $< 2>&1 \
 	   | $(GREP) -v -f '$(filter %.grep, $^)' \
diff --git a/share/mk/lint/man/poems.mk b/share/mk/lint/man/poems.mk
index b7ee792f346c..b0e799d2997a 100644
--- a/share/mk/lint/man/poems.mk
+++ b/share/mk/lint/man/poems.mk
@@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
+%$(ext): % $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)PCRE2GREP	$@)
 	$(CAT) <$< \
 	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
diff --git a/share/mk/lint/man/quote.mk b/share/mk/lint/man/quote.mk
index 3aca334967c0..86bc397c1d2b 100644
--- a/share/mk/lint/man/quote.mk
+++ b/share/mk/lint/man/quote.mk
@@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
+%$(ext): % $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)GREP		$@)
 	$(CAT) <$< \
 	| if $(GREP) -Pf $(filter %.Pgrep, $^) >/dev/null; then \
diff --git a/share/mk/lint/man/so.mk b/share/mk/lint/man/so.mk
index 09b7816ae38f..cf8d6776e15d 100644
--- a/share/mk/lint/man/so.mk
+++ b/share/mk/lint/man/so.mk
@@ -24,7 +24,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(MK) | $$(@D)/
+%$(ext): % $(MK) | $$(@D)/
 	$(info	$(INFO_)FIND		$@)
 	$(GREP) '^\.so ' <$< \
 	| $(CUT) -f2 -d' ' \
diff --git a/share/mk/lint/man/ws.mk b/share/mk/lint/man/ws.mk
index 7fd3bb69361d..2f587fc4e6ea 100644
--- a/share/mk/lint/man/ws.mk
+++ b/share/mk/lint/man/ws.mk
@@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
 endif
 
 
-$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
+%$(ext): % $(regexf) $(MK) | $$(@D)/
 	$(info	$(INFO_)GREP		$@)
 	$(CAT) <$< \
 	| if $(GREP) -Ef $(filter %.egrep, $^) >/dev/null; then \

Range-diff against v0:
-:  ------------ > 1:  9a74fe43cf61 share/mk/: Use suffix rules where possible
-- 
2.53.0


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v1] share/mk/: Use suffix rules where possible
  2026-08-30 14:51 [PATCH v1] share/mk/: Use suffix rules where possible Alejandro Colomar
@ 2026-08-30 16:55 ` Alejandro Colomar
  2026-09-11 17:54   ` Alejandro Colomar
  0 siblings, 1 reply; 4+ messages in thread
From: Alejandro Colomar @ 2026-08-30 16:55 UTC (permalink / raw)
  To: linux-man; +Cc: Ingo Schwarze

[-- Attachment #1: Type: text/plain, Size: 17523 bytes --]

Hi Ingo,

> Date: 2026-08-30 16:51:24+0200
> From: Alejandro Colomar <alx@kernel.org>
>
> Ingo complained that the size of the database is huge.  We can't make it
> much smaller than this, but at least we can shrink it to one third.
> 
> Using suffix rules, we avoid having an explicit copy of the file list
> in the rules, and thus optimizes the makefiles so that make(1)'s
> database shrinks to around 1/3rd of the size.  The time for running
> 'make nothing' also improves from ~ 0.45 s to ~ 0.33 s in my computer.

While this optimizes the size of make(1)'s database, and the run-time
of the configuration part (everything before the targets start running),
the actual work of the build is slowed down by orders of magnitude
(I suspect associating targets with suffix rules is more expensive than
 explicit rules).  Thus, I've dropped this change.  I can live with a
somewhat-larger database, and make(1) seems to be fast with it.


Cheers,
Alex

> 
> Reported-by: Ingo Schwarze <schwarze@openbsd.org>
> Message-ID: <apL7VAruk1bIOr1M@isnote.usta.de>
> Signed-off-by: Alejandro Colomar <alx@kernel.org>
> ---
> 
> Hi Ingo,
> 
> Here's an optimization for the man-pages' build system.  Would you mind
> checking if this also shows similar improvements in your system?
> 
> 
> Have a lovely day!
> Alex
> 
>  share/mk/build/catman/eqn.mk        |  2 +-
>  share/mk/build/catman/grotty.mk     |  2 +-
>  share/mk/build/catman/troff.mk      |  2 +-
>  share/mk/build/examples/cc.mk       |  2 +-
>  share/mk/build/examples/dir.mk      |  2 +-
>  share/mk/build/html/post-grohtml.mk |  2 +-
>  share/mk/build/html/troff.mk        |  2 +-
>  share/mk/build/pdf/pages/eqn.mk     |  2 +-
>  share/mk/build/pdf/pages/troff.mk   |  2 +-
>  share/mk/build/pre/preconv.mk       |  2 +-
>  share/mk/build/pre/tbl.mk           |  2 +-
>  share/mk/build/ps/eqn.mk            |  2 +-
>  share/mk/build/ps/grops.mk          |  2 +-
>  share/mk/build/ps/troff.mk          |  2 +-
>  share/mk/check/catman/col.mk        |  2 +-
>  share/mk/check/catman/grep.mk       |  2 +-
>  share/mk/lint/c/clang-tidy.mk       | 11 ++---------
>  share/mk/lint/c/cppcheck.mk         | 11 ++---------
>  share/mk/lint/c/cpplint.mk          | 10 ++--------
>  share/mk/lint/c/iwyu.mk             | 11 ++---------
>  share/mk/lint/man/blank.mk          |  2 +-
>  share/mk/lint/man/dash.mk           |  2 +-
>  share/mk/lint/man/mandoc.mk         |  2 +-
>  share/mk/lint/man/poems.mk          |  2 +-
>  share/mk/lint/man/quote.mk          |  2 +-
>  share/mk/lint/man/so.mk             |  2 +-
>  share/mk/lint/man/ws.mk             |  2 +-
>  27 files changed, 31 insertions(+), 58 deletions(-)
> 
> diff --git a/share/mk/build/catman/eqn.mk b/share/mk/build/catman/eqn.mk
> index 895662ac3710..e2830dab53ac 100644
> --- a/share/mk/build/catman/eqn.mk
> +++ b/share/mk/build/catman/eqn.mk
> @@ -18,7 +18,7 @@ ext ::= .cat.troff
>  _CATMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
>  
>  
> -$(_CATMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> +%$(ext): %.eqn $(MK) | $$(@D)/
>  	$(info	$(INFO_)EQN		$@)
>  	! ($(EQN) -T$(NROFF_OUT_DEVICE) $(EQNFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/build/catman/grotty.mk b/share/mk/build/catman/grotty.mk
> index 66151b6cee93..a578edbeb191 100644
> --- a/share/mk/build/catman/grotty.mk
> +++ b/share/mk/build/catman/grotty.mk
> @@ -16,7 +16,7 @@ ext ::= .cat
>  _CATMAN ::= $(patsubst %.cat.set, %$(ext), $(_CATMAN_set))
>  
>  
> -$(_CATMAN): %$(ext): %.cat.set $(MK) | $$(@D)/
> +%$(ext): %.cat.set $(MK) | $$(@D)/
>  	$(info	$(INFO_)GROTTY		$@)
>  	$(GROTTY) $(GROTTYFLAGS_) <$< >$@
>  
> diff --git a/share/mk/build/catman/troff.mk b/share/mk/build/catman/troff.mk
> index 07e315327278..fc5bf0c18de8 100644
> --- a/share/mk/build/catman/troff.mk
> +++ b/share/mk/build/catman/troff.mk
> @@ -28,7 +28,7 @@ endif
>  _CATMAN_set ::= $(tgts)
>  
>  
> -$(_CATMAN_set): %$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
> +%$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)TROFF		$@)
>  	! ($(TROFF) -mandoc $(TROFFFLAGS_) $(NROFFFLAGS_) <$< 2>&1 >$@ \
>  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> diff --git a/share/mk/build/examples/cc.mk b/share/mk/build/examples/cc.mk
> index 680b80f3e832..5806d8de0118 100644
> --- a/share/mk/build/examples/cc.mk
> +++ b/share/mk/build/examples/cc.mk
> @@ -25,7 +25,7 @@ endif
>  _EX_TU_o ::= $(tgts)
>  
>  
> -$(_EX_TU_o): %$(ext): %.c $(MK)
> +%$(ext): %.c $(MK)
>  	$(info	$(INFO_)CC		$@)
>  	$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<
>  
> diff --git a/share/mk/build/examples/dir.mk b/share/mk/build/examples/dir.mk
> index 10286c73bc0c..9782ad300193 100644
> --- a/share/mk/build/examples/dir.mk
> +++ b/share/mk/build/examples/dir.mk
> @@ -14,7 +14,7 @@ include $(MAKEFILEDIR)/configure/build-depends/coreutils/touch.mk
>  _PAGEEXDIRS ::= $(patsubst %, %.d/, $(_NONSO))
>  
>  
> -$(_PAGEEXDIRS):
> +%.d/:
>  	+$(info	$(INFO_)MKDIR		$@)
>  	+$(MKDIR) -p $@
>  	+$(TOUCH) $@
> diff --git a/share/mk/build/html/post-grohtml.mk b/share/mk/build/html/post-grohtml.mk
> index 0c96a78609d8..fa886f09d0d8 100644
> --- a/share/mk/build/html/post-grohtml.mk
> +++ b/share/mk/build/html/post-grohtml.mk
> @@ -16,7 +16,7 @@ ext ::= .html
>  _HTMLMAN ::= $(patsubst %.html.set, %$(ext), $(_HTMLMAN_set))
>  
>  
> -$(_HTMLMAN): %$(ext): %.html.set $(MK) | $$(@D)/
> +%$(ext): %.html.set $(MK) | $$(@D)/
>  	$(info	$(INFO_)POST_GROHTML	$@)
>  	$(POST_GROHTML) $(POST_GROHTMLFLAGS_) <$< >$@
>  
> diff --git a/share/mk/build/html/troff.mk b/share/mk/build/html/troff.mk
> index b6c1e659b7e4..6bdf9db1dbfa 100644
> --- a/share/mk/build/html/troff.mk
> +++ b/share/mk/build/html/troff.mk
> @@ -25,7 +25,7 @@ endif
>  _HTMLMAN_set ::= $(tgts)
>  
>  
> -$(_HTMLMAN_set): %$(ext): %.eqn $(MK) | $$(@D)/
> +%$(ext): %.eqn $(MK) | $$(@D)/
>  	$(info	$(INFO_)TROFF		$@)
>  	! ($(TROFF) -mandoc -Thtml $(TROFFFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/build/pdf/pages/eqn.mk b/share/mk/build/pdf/pages/eqn.mk
> index 6ef945af3e10..49b1a72c6b08 100644
> --- a/share/mk/build/pdf/pages/eqn.mk
> +++ b/share/mk/build/pdf/pages/eqn.mk
> @@ -17,7 +17,7 @@ ext ::= .pdf.troff
>  _PDFMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
>  
>  
> -$(_PDFMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> +%$(ext): %.eqn $(MK) | $$(@D)/
>  	$(info	$(INFO_)EQN		$@)
>  	! ($(EQN) -Tpdf $(EQNFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/build/pdf/pages/troff.mk b/share/mk/build/pdf/pages/troff.mk
> index e4c4d347fe6c..550168646d5b 100644
> --- a/share/mk/build/pdf/pages/troff.mk
> +++ b/share/mk/build/pdf/pages/troff.mk
> @@ -25,7 +25,7 @@ endif
>  _PDFMAN_set ::= $(tgts)
>  
>  
> -$(_PDFMAN_set): %$(ext): %.pdf.troff $(MK) | $$(@D)/
> +%$(ext): %.pdf.troff $(MK) | $$(@D)/
>  	$(info	$(INFO_)TROFF		$@)
>  	! ($(TROFF) -mandoc -Tpdf $(TROFFFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/build/pre/preconv.mk b/share/mk/build/pre/preconv.mk
> index d19d12d261d7..e3dde5981949 100644
> --- a/share/mk/build/pre/preconv.mk
> +++ b/share/mk/build/pre/preconv.mk
> @@ -16,7 +16,7 @@ ext ::= .tbl
>  _MAN_tbl ::= $(patsubst %, %$(ext), $(_NONSO))
>  
>  
> -$(_MAN_tbl): %$(ext): % $(MK) | $$(@D)/
> +%$(ext): % $(MK) | $$(@D)/
>  	$(info	$(INFO_)PRECONV		$@)
>  	$(PRECONV) $(PRECONVFLAGS_) $< >$@
>  
> diff --git a/share/mk/build/pre/tbl.mk b/share/mk/build/pre/tbl.mk
> index 5883b6ec0c80..0375b958ff05 100644
> --- a/share/mk/build/pre/tbl.mk
> +++ b/share/mk/build/pre/tbl.mk
> @@ -16,7 +16,7 @@ ext ::= .eqn
>  _MAN_eqn ::= $(patsubst %.tbl, %$(ext), $(_MAN_tbl))
>  
>  
> -$(_MAN_eqn): %$(ext): %.tbl $(MK) | $$(@D)/
> +%$(ext): %.tbl $(MK) | $$(@D)/
>  	$(info	$(INFO_)TBL		$@)
>  	$(TBL) <$< >$@
>  
> diff --git a/share/mk/build/ps/eqn.mk b/share/mk/build/ps/eqn.mk
> index 315bed0e4cde..18c885655c99 100644
> --- a/share/mk/build/ps/eqn.mk
> +++ b/share/mk/build/ps/eqn.mk
> @@ -17,7 +17,7 @@ ext ::= .ps.troff
>  _PSMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
>  
>  
> -$(_PSMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> +%$(ext): %.eqn $(MK) | $$(@D)/
>  	$(info	$(INFO_)EQN		$@)
>  	! ($(EQN) -Tps $(EQNFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/build/ps/grops.mk b/share/mk/build/ps/grops.mk
> index 463c7bac6f08..4b85b6a96854 100644
> --- a/share/mk/build/ps/grops.mk
> +++ b/share/mk/build/ps/grops.mk
> @@ -16,7 +16,7 @@ ext ::= .ps
>  _PSMAN ::= $(patsubst %.ps.set, %$(ext), $(_PSMAN_set))
>  
>  
> -$(_PSMAN): %$(ext): %.ps.set $(MK) | $$(@D)/
> +%$(ext): %.ps.set $(MK) | $$(@D)/
>  	$(info	$(INFO_)GROPS		$@)
>  	$(GROPS) $(GROPSFLAGS_) <$< >$@
>  
> diff --git a/share/mk/build/ps/troff.mk b/share/mk/build/ps/troff.mk
> index 851fb971faf3..8137014fe9e9 100644
> --- a/share/mk/build/ps/troff.mk
> +++ b/share/mk/build/ps/troff.mk
> @@ -25,7 +25,7 @@ endif
>  _PSMAN_set ::= $(tgts)
>  
>  
> -$(_PSMAN_set): %$(ext): %.ps.troff $(MK) | $$(@D)/
> +%$(ext): %.ps.troff $(MK) | $$(@D)/
>  	$(info	$(INFO_)TROFF		$@)
>  	! ($(TROFF) -mandoc -Tps $(TROFFFLAGS_) <$< 2>&1 >$@) \
>  	| $(GREP) ^ >&2
> diff --git a/share/mk/check/catman/col.mk b/share/mk/check/catman/col.mk
> index 25b8b6e154a6..de326d989183 100644
> --- a/share/mk/check/catman/col.mk
> +++ b/share/mk/check/catman/col.mk
> @@ -16,7 +16,7 @@ ext ::= .cat.grep
>  _CHECK_catman_grep ::= $(patsubst %.cat, %$(ext), $(_CATMAN))
>  
>  
> -$(_CHECK_catman_grep): %$(ext): %.cat $(MK) | $$(@D)/
> +%$(ext): %.cat $(MK) | $$(@D)/
>  	$(info	$(INFO_)COL		$@)
>  	$(COL) $(COLFLAGS_) <$< >$@
>  
> diff --git a/share/mk/check/catman/grep.mk b/share/mk/check/catman/grep.mk
> index bcfa1a134459..2fce886ae920 100644
> --- a/share/mk/check/catman/grep.mk
> +++ b/share/mk/check/catman/grep.mk
> @@ -25,7 +25,7 @@ endif
>  _CHECK_catman ::= $(tgts)
>  
>  
> -$(_CHECK_catman): %.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
> +%.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
>  	$(info	$(INFO_)GREP		$@)
>  	! $(GREP) -n '.\{$(MANWIDTH)\}.' $< /dev/null >&2
>  	$(TOUCH) $@
> diff --git a/share/mk/lint/c/clang-tidy.mk b/share/mk/lint/c/clang-tidy.mk
> index 8333c8ace12c..d992b956baf3 100644
> --- a/share/mk/lint/c/clang-tidy.mk
> +++ b/share/mk/lint/c/clang-tidy.mk
> @@ -24,14 +24,8 @@ ifeq ($(SKIP_XFAIL),yes)
>  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
>  endif
>  
> -tgts ::= $(tgts_EX)
>  
> -
> -$(tgts_EX): %$(ext): %
> -$(tgts): $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
> -
> -
> -$(tgts):
> +%$(ext): % $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
>  	$(info	$(INFO_)CLANG_TIDY	$@)
>  	$(CLANG_TIDY) $(CLANG_TIDYFLAGS_) $< -- $(CLANGFLAGS_) $(CPPFLAGS_) 2>&1 \
>  	| $(SED) '/generated\.$$/d' >&2
> @@ -39,13 +33,12 @@ $(tgts):
>  
>  
>  .PHONY: lint-c-clang-tidy
> -lint-c-clang-tidy: $(tgts);
> +lint-c-clang-tidy: $(tgts_EX);
>  
>  
>  undefine ext
>  undefine xfail
>  undefine tgts_EX
> -undefine tgts
>  
>  
>  endif  # include guard
> diff --git a/share/mk/lint/c/cppcheck.mk b/share/mk/lint/c/cppcheck.mk
> index c377120e4fa1..3952414c9cfd 100644
> --- a/share/mk/lint/c/cppcheck.mk
> +++ b/share/mk/lint/c/cppcheck.mk
> @@ -21,27 +21,20 @@ ifeq ($(SKIP_XFAIL),yes)
>  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
>  endif
>  
> -tgts ::= $(tgts_EX)
>  
> -
> -$(tgts_EX): %$(ext): %
> -$(tgts): $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
> -
> -
> -$(tgts):
> +%$(ext): % $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
>  	$(info	$(INFO_)CPPCHECK	$@)
>  	$(CPPCHECK) $(CPPCHECKFLAGS_) $<
>  	$(TOUCH) $@
>  
>  
>  .PHONY: lint-c-cppcheck
> -lint-c-cppcheck: $(tgts);
> +lint-c-cppcheck: $(tgts_EX);
>  
>  
>  undefine ext
>  undefine xfail
>  undefine tgts_EX
> -undefine tgts
>  
>  
>  endif  # include guard
> diff --git a/share/mk/lint/c/cpplint.mk b/share/mk/lint/c/cpplint.mk
> index 6a714bc315ad..9ecef7f45553 100644
> --- a/share/mk/lint/c/cpplint.mk
> +++ b/share/mk/lint/c/cpplint.mk
> @@ -13,26 +13,20 @@ include $(MAKEFILEDIR)/configure/build-depends/cpplint/cpplint.mk
>  
>  ext ::= .lint-c.cpplint.touch
>  tgts_EX ::= $(patsubst %, %$(ext), $(_EX_TU_src))
> -tgts    ::= $(tgts_EX)
>  
>  
> -$(tgts_EX): %$(ext): %
> -$(tgts): $(CPPLINT_CONF) $(MK) | $$(@D)/
> -
> -
> -$(tgts):
> +%$(ext): % $(CPPLINT_CONF) $(MK) | $$(@D)/
>  	$(info	$(INFO_)CPPLINT		$@)
>  	$(CPPLINT) $(CPPLINTFLAGS_) $< >/dev/null
>  	$(TOUCH) $@
>  
>  
>  .PHONY: lint-c-cpplint
> -lint-c-cpplint: $(tgts);
> +lint-c-cpplint: $(tgts_EX);
>  
>  
>  undefine ext
>  undefine tgts_EX
> -undefine tgts
>  
>  
>  endif  # include guard
> diff --git a/share/mk/lint/c/iwyu.mk b/share/mk/lint/c/iwyu.mk
> index e4477dbfac58..03bc68f55546 100644
> --- a/share/mk/lint/c/iwyu.mk
> +++ b/share/mk/lint/c/iwyu.mk
> @@ -27,14 +27,8 @@ ifeq ($(SKIP_XFAIL),yes)
>  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
>  endif
>  
> -tgts ::= $(tgts_EX)
>  
> -
> -$(tgts_EX): %$(ext): %
> -$(tgts): $(MK) | $$(@D)/
> -
> -
> -$(tgts):
> +%$(ext): % $(MK) | $$(@D)/
>  	$(info	$(INFO_)IWYU		$@)
>  	! ($(IWYU) $(IWYUFLAGS_) $(CLANGFLAGS_) $(CPPFLAGS_) $< 2>&1 \
>  	   | $(SED) -n '/should add these lines:/,$$p' \
> @@ -48,13 +42,12 @@ $(tgts):
>  
>  
>  .PHONY: lint-c-iwyu
> -lint-c-iwyu: $(tgts);
> +lint-c-iwyu: $(tgts_EX);
>  
>  
>  undefine ext
>  undefine xfail
>  undefine tgts_EX
> -undefine tgts
>  
>  
>  endif  # include guard
> diff --git a/share/mk/lint/man/blank.mk b/share/mk/lint/man/blank.mk
> index f8eca7ac86b7..8fc7ad4be0a8 100644
> --- a/share/mk/lint/man/blank.mk
> +++ b/share/mk/lint/man/blank.mk
> @@ -22,7 +22,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(MK) | $$(@D)/
> +%$(ext): % $(MK) | $$(@D)/
>  	$(info	$(INFO_)GREP		$@)
>  	$(CAT) <$< \
>  	| if $(GREP) '^$$' >/dev/null; then \
> diff --git a/share/mk/lint/man/dash.mk b/share/mk/lint/man/dash.mk
> index 85307af0e449..d82ac734880d 100644
> --- a/share/mk/lint/man/dash.mk
> +++ b/share/mk/lint/man/dash.mk
> @@ -21,7 +21,7 @@ regexf ::= $(MAKEFILEDIR)/lint/man/dash.pcre2grep
>  tgts ::= $(patsubst %, %$(ext), $(_NONSO))
>  
>  
> -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> +%$(ext): % $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)PCRE2GREP	$@)
>  	$(CAT) <$< \
>  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> diff --git a/share/mk/lint/man/mandoc.mk b/share/mk/lint/man/mandoc.mk
> index 5c24ca66ee7a..d96f94439933 100644
> --- a/share/mk/lint/man/mandoc.mk
> +++ b/share/mk/lint/man/mandoc.mk
> @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> +%$(ext): % $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)MANDOC		$@)
>  	! ($(MANDOC) $(MANDOCFLAGS_) $< 2>&1 \
>  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> diff --git a/share/mk/lint/man/poems.mk b/share/mk/lint/man/poems.mk
> index b7ee792f346c..b0e799d2997a 100644
> --- a/share/mk/lint/man/poems.mk
> +++ b/share/mk/lint/man/poems.mk
> @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> +%$(ext): % $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)PCRE2GREP	$@)
>  	$(CAT) <$< \
>  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> diff --git a/share/mk/lint/man/quote.mk b/share/mk/lint/man/quote.mk
> index 3aca334967c0..86bc397c1d2b 100644
> --- a/share/mk/lint/man/quote.mk
> +++ b/share/mk/lint/man/quote.mk
> @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> +%$(ext): % $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)GREP		$@)
>  	$(CAT) <$< \
>  	| if $(GREP) -Pf $(filter %.Pgrep, $^) >/dev/null; then \
> diff --git a/share/mk/lint/man/so.mk b/share/mk/lint/man/so.mk
> index 09b7816ae38f..cf8d6776e15d 100644
> --- a/share/mk/lint/man/so.mk
> +++ b/share/mk/lint/man/so.mk
> @@ -24,7 +24,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(MK) | $$(@D)/
> +%$(ext): % $(MK) | $$(@D)/
>  	$(info	$(INFO_)FIND		$@)
>  	$(GREP) '^\.so ' <$< \
>  	| $(CUT) -f2 -d' ' \
> diff --git a/share/mk/lint/man/ws.mk b/share/mk/lint/man/ws.mk
> index 7fd3bb69361d..2f587fc4e6ea 100644
> --- a/share/mk/lint/man/ws.mk
> +++ b/share/mk/lint/man/ws.mk
> @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
>  endif
>  
>  
> -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> +%$(ext): % $(regexf) $(MK) | $$(@D)/
>  	$(info	$(INFO_)GREP		$@)
>  	$(CAT) <$< \
>  	| if $(GREP) -Ef $(filter %.egrep, $^) >/dev/null; then \
> 
> Range-diff against v0:
> -:  ------------ > 1:  9a74fe43cf61 share/mk/: Use suffix rules where possible
> -- 
> 2.53.0
> 



-- 
<https://www.alejandro-colomar.es>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v1] share/mk/: Use suffix rules where possible
  2026-08-30 16:55 ` Alejandro Colomar
@ 2026-09-11 17:54   ` Alejandro Colomar
  2026-09-11 18:00     ` Alejandro Colomar
  0 siblings, 1 reply; 4+ messages in thread
From: Alejandro Colomar @ 2026-09-11 17:54 UTC (permalink / raw)
  To: Lorenzo Stoakes, linux-man

[-- Attachment #1: Type: text/plain, Size: 21033 bytes --]

[CC trimmed; To = Lorenzo]

Hi Lorenzo,

I've seen the news from <https://lwn.net/Articles/1093398/>, and thought
this recent experiment in the build system of the Linux man-pages
project might seem relevant to you.

> Date: 2026-08-30 18:55:19+0200
> From: Alejandro Colomar <alx@kernel.org>
>
> Hi Ingo,
> 
> > Date: 2026-08-30 16:51:24+0200
> > From: Alejandro Colomar <alx@kernel.org>
> >
> > Ingo complained that the size of the database is huge.  We can't make it
> > much smaller than this, but at least we can shrink it to one third.
> > 
> > Using suffix rules, we avoid having an explicit copy of the file list
> > in the rules, and thus optimizes the makefiles so that make(1)'s
> > database shrinks to around 1/3rd of the size.  The time for running
> > 'make nothing' also improves from ~ 0.45 s to ~ 0.33 s in my computer.
> 
> While this optimizes the size of make(1)'s database, and the run-time
> of the configuration part (everything before the targets start running),
> the actual work of the build is slowed down by orders of magnitude
> (I suspect associating targets with suffix rules is more expensive than
>  explicit rules).  Thus, I've dropped this change.  I can live with a
> somewhat-larger database, and make(1) seems to be fast with it.

The Linux man-pages Makefile-only build system uses explicit rules
everywhere, listing all target files in our makefile rules.  We use
'static pattern rules' almost everywhere.
<https://www.gnu.org/software/make/manual/html_node/Static-Pattern.html>

Here's for example the rule we use to build the C programs in the
EXAMPLES sections of manual pages:

	ext ::= .o
	xfail ::= $(MAKEFILEDIR)/build/examples/cc.xfail

	tgts ::= $(patsubst %.c, %$(ext), $(_EX_TU_c))
	ifeq ($(SKIP_XFAIL),yes)
	tgts ::= $(filter-out $(patsubst %.c, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts))
	endif


	_EX_TU_o ::= $(tgts)


	$(_EX_TU_o): %$(ext): %.c $(MK)
		$(info	$(INFO_)CC		$@)
		$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<

Recently (as shown in the quoted text above), I thought using regular
'pattern rules' might improve the build times, as the database used by
make(1) wouldn't need expanding all that text at once when defining the
rules, and indeed reduces that database to 1/3rd of the original size.
However, after trying it, the build times of a full build worsened by
orders of magnitude, and the time of a no-op build was only reduced by
fractions of a second (since it only takes a fraction of a second in the
first place).

I believe 'static pattern rules' go through simpler decision paths
within make(1), which might be the reason for the performance
differences I've experimented.

From what I've seen, the kernel seems to use regular 'pattern rules'
extensively.  I wonder if moving to 'static pattern rules' would bring
a benefit similar to the one we experience in the Linux man-pages
project.

Another important thing is that the build system of the Linux man-pages
uses a single make(1) process to build (i.e., we don't use recursive
make(1)).  That makes it parallelize better.  I'm not sure whether the
kernel makefiles are recursive (for the main build) and how much that
affects the kernel build.  It might be something to check too, as I
remember it was very impactful.  Recursive make(1) is considered harmful
by some (I agree, IME).


Have a lovely day!
Alex

> Cheers,
> Alex
> 
> > 
> > Reported-by: Ingo Schwarze <schwarze@openbsd.org>
> > Message-ID: <apL7VAruk1bIOr1M@isnote.usta.de>
> > Signed-off-by: Alejandro Colomar <alx@kernel.org>
> > ---
> > 
> > Hi Ingo,
> > 
> > Here's an optimization for the man-pages' build system.  Would you mind
> > checking if this also shows similar improvements in your system?
> > 
> > 
> > Have a lovely day!
> > Alex
> > 
> >  share/mk/build/catman/eqn.mk        |  2 +-
> >  share/mk/build/catman/grotty.mk     |  2 +-
> >  share/mk/build/catman/troff.mk      |  2 +-
> >  share/mk/build/examples/cc.mk       |  2 +-
> >  share/mk/build/examples/dir.mk      |  2 +-
> >  share/mk/build/html/post-grohtml.mk |  2 +-
> >  share/mk/build/html/troff.mk        |  2 +-
> >  share/mk/build/pdf/pages/eqn.mk     |  2 +-
> >  share/mk/build/pdf/pages/troff.mk   |  2 +-
> >  share/mk/build/pre/preconv.mk       |  2 +-
> >  share/mk/build/pre/tbl.mk           |  2 +-
> >  share/mk/build/ps/eqn.mk            |  2 +-
> >  share/mk/build/ps/grops.mk          |  2 +-
> >  share/mk/build/ps/troff.mk          |  2 +-
> >  share/mk/check/catman/col.mk        |  2 +-
> >  share/mk/check/catman/grep.mk       |  2 +-
> >  share/mk/lint/c/clang-tidy.mk       | 11 ++---------
> >  share/mk/lint/c/cppcheck.mk         | 11 ++---------
> >  share/mk/lint/c/cpplint.mk          | 10 ++--------
> >  share/mk/lint/c/iwyu.mk             | 11 ++---------
> >  share/mk/lint/man/blank.mk          |  2 +-
> >  share/mk/lint/man/dash.mk           |  2 +-
> >  share/mk/lint/man/mandoc.mk         |  2 +-
> >  share/mk/lint/man/poems.mk          |  2 +-
> >  share/mk/lint/man/quote.mk          |  2 +-
> >  share/mk/lint/man/so.mk             |  2 +-
> >  share/mk/lint/man/ws.mk             |  2 +-
> >  27 files changed, 31 insertions(+), 58 deletions(-)
> > 
> > diff --git a/share/mk/build/catman/eqn.mk b/share/mk/build/catman/eqn.mk
> > index 895662ac3710..e2830dab53ac 100644
> > --- a/share/mk/build/catman/eqn.mk
> > +++ b/share/mk/build/catman/eqn.mk
> > @@ -18,7 +18,7 @@ ext ::= .cat.troff
> >  _CATMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_CATMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -T$(NROFF_OUT_DEVICE) $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/catman/grotty.mk b/share/mk/build/catman/grotty.mk
> > index 66151b6cee93..a578edbeb191 100644
> > --- a/share/mk/build/catman/grotty.mk
> > +++ b/share/mk/build/catman/grotty.mk
> > @@ -16,7 +16,7 @@ ext ::= .cat
> >  _CATMAN ::= $(patsubst %.cat.set, %$(ext), $(_CATMAN_set))
> >  
> >  
> > -$(_CATMAN): %$(ext): %.cat.set $(MK) | $$(@D)/
> > +%$(ext): %.cat.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GROTTY		$@)
> >  	$(GROTTY) $(GROTTYFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/catman/troff.mk b/share/mk/build/catman/troff.mk
> > index 07e315327278..fc5bf0c18de8 100644
> > --- a/share/mk/build/catman/troff.mk
> > +++ b/share/mk/build/catman/troff.mk
> > @@ -28,7 +28,7 @@ endif
> >  _CATMAN_set ::= $(tgts)
> >  
> >  
> > -$(_CATMAN_set): %$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
> > +%$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc $(TROFFFLAGS_) $(NROFFFLAGS_) <$< 2>&1 >$@ \
> >  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> > diff --git a/share/mk/build/examples/cc.mk b/share/mk/build/examples/cc.mk
> > index 680b80f3e832..5806d8de0118 100644
> > --- a/share/mk/build/examples/cc.mk
> > +++ b/share/mk/build/examples/cc.mk
> > @@ -25,7 +25,7 @@ endif
> >  _EX_TU_o ::= $(tgts)
> >  
> >  
> > -$(_EX_TU_o): %$(ext): %.c $(MK)
> > +%$(ext): %.c $(MK)
> >  	$(info	$(INFO_)CC		$@)
> >  	$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<
> >  
> > diff --git a/share/mk/build/examples/dir.mk b/share/mk/build/examples/dir.mk
> > index 10286c73bc0c..9782ad300193 100644
> > --- a/share/mk/build/examples/dir.mk
> > +++ b/share/mk/build/examples/dir.mk
> > @@ -14,7 +14,7 @@ include $(MAKEFILEDIR)/configure/build-depends/coreutils/touch.mk
> >  _PAGEEXDIRS ::= $(patsubst %, %.d/, $(_NONSO))
> >  
> >  
> > -$(_PAGEEXDIRS):
> > +%.d/:
> >  	+$(info	$(INFO_)MKDIR		$@)
> >  	+$(MKDIR) -p $@
> >  	+$(TOUCH) $@
> > diff --git a/share/mk/build/html/post-grohtml.mk b/share/mk/build/html/post-grohtml.mk
> > index 0c96a78609d8..fa886f09d0d8 100644
> > --- a/share/mk/build/html/post-grohtml.mk
> > +++ b/share/mk/build/html/post-grohtml.mk
> > @@ -16,7 +16,7 @@ ext ::= .html
> >  _HTMLMAN ::= $(patsubst %.html.set, %$(ext), $(_HTMLMAN_set))
> >  
> >  
> > -$(_HTMLMAN): %$(ext): %.html.set $(MK) | $$(@D)/
> > +%$(ext): %.html.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)POST_GROHTML	$@)
> >  	$(POST_GROHTML) $(POST_GROHTMLFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/html/troff.mk b/share/mk/build/html/troff.mk
> > index b6c1e659b7e4..6bdf9db1dbfa 100644
> > --- a/share/mk/build/html/troff.mk
> > +++ b/share/mk/build/html/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _HTMLMAN_set ::= $(tgts)
> >  
> >  
> > -$(_HTMLMAN_set): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Thtml $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pdf/pages/eqn.mk b/share/mk/build/pdf/pages/eqn.mk
> > index 6ef945af3e10..49b1a72c6b08 100644
> > --- a/share/mk/build/pdf/pages/eqn.mk
> > +++ b/share/mk/build/pdf/pages/eqn.mk
> > @@ -17,7 +17,7 @@ ext ::= .pdf.troff
> >  _PDFMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_PDFMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -Tpdf $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pdf/pages/troff.mk b/share/mk/build/pdf/pages/troff.mk
> > index e4c4d347fe6c..550168646d5b 100644
> > --- a/share/mk/build/pdf/pages/troff.mk
> > +++ b/share/mk/build/pdf/pages/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _PDFMAN_set ::= $(tgts)
> >  
> >  
> > -$(_PDFMAN_set): %$(ext): %.pdf.troff $(MK) | $$(@D)/
> > +%$(ext): %.pdf.troff $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Tpdf $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pre/preconv.mk b/share/mk/build/pre/preconv.mk
> > index d19d12d261d7..e3dde5981949 100644
> > --- a/share/mk/build/pre/preconv.mk
> > +++ b/share/mk/build/pre/preconv.mk
> > @@ -16,7 +16,7 @@ ext ::= .tbl
> >  _MAN_tbl ::= $(patsubst %, %$(ext), $(_NONSO))
> >  
> >  
> > -$(_MAN_tbl): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PRECONV		$@)
> >  	$(PRECONV) $(PRECONVFLAGS_) $< >$@
> >  
> > diff --git a/share/mk/build/pre/tbl.mk b/share/mk/build/pre/tbl.mk
> > index 5883b6ec0c80..0375b958ff05 100644
> > --- a/share/mk/build/pre/tbl.mk
> > +++ b/share/mk/build/pre/tbl.mk
> > @@ -16,7 +16,7 @@ ext ::= .eqn
> >  _MAN_eqn ::= $(patsubst %.tbl, %$(ext), $(_MAN_tbl))
> >  
> >  
> > -$(_MAN_eqn): %$(ext): %.tbl $(MK) | $$(@D)/
> > +%$(ext): %.tbl $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TBL		$@)
> >  	$(TBL) <$< >$@
> >  
> > diff --git a/share/mk/build/ps/eqn.mk b/share/mk/build/ps/eqn.mk
> > index 315bed0e4cde..18c885655c99 100644
> > --- a/share/mk/build/ps/eqn.mk
> > +++ b/share/mk/build/ps/eqn.mk
> > @@ -17,7 +17,7 @@ ext ::= .ps.troff
> >  _PSMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_PSMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -Tps $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/ps/grops.mk b/share/mk/build/ps/grops.mk
> > index 463c7bac6f08..4b85b6a96854 100644
> > --- a/share/mk/build/ps/grops.mk
> > +++ b/share/mk/build/ps/grops.mk
> > @@ -16,7 +16,7 @@ ext ::= .ps
> >  _PSMAN ::= $(patsubst %.ps.set, %$(ext), $(_PSMAN_set))
> >  
> >  
> > -$(_PSMAN): %$(ext): %.ps.set $(MK) | $$(@D)/
> > +%$(ext): %.ps.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GROPS		$@)
> >  	$(GROPS) $(GROPSFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/ps/troff.mk b/share/mk/build/ps/troff.mk
> > index 851fb971faf3..8137014fe9e9 100644
> > --- a/share/mk/build/ps/troff.mk
> > +++ b/share/mk/build/ps/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _PSMAN_set ::= $(tgts)
> >  
> >  
> > -$(_PSMAN_set): %$(ext): %.ps.troff $(MK) | $$(@D)/
> > +%$(ext): %.ps.troff $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Tps $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/check/catman/col.mk b/share/mk/check/catman/col.mk
> > index 25b8b6e154a6..de326d989183 100644
> > --- a/share/mk/check/catman/col.mk
> > +++ b/share/mk/check/catman/col.mk
> > @@ -16,7 +16,7 @@ ext ::= .cat.grep
> >  _CHECK_catman_grep ::= $(patsubst %.cat, %$(ext), $(_CATMAN))
> >  
> >  
> > -$(_CHECK_catman_grep): %$(ext): %.cat $(MK) | $$(@D)/
> > +%$(ext): %.cat $(MK) | $$(@D)/
> >  	$(info	$(INFO_)COL		$@)
> >  	$(COL) $(COLFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/check/catman/grep.mk b/share/mk/check/catman/grep.mk
> > index bcfa1a134459..2fce886ae920 100644
> > --- a/share/mk/check/catman/grep.mk
> > +++ b/share/mk/check/catman/grep.mk
> > @@ -25,7 +25,7 @@ endif
> >  _CHECK_catman ::= $(tgts)
> >  
> >  
> > -$(_CHECK_catman): %.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
> > +%.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	! $(GREP) -n '.\{$(MANWIDTH)\}.' $< /dev/null >&2
> >  	$(TOUCH) $@
> > diff --git a/share/mk/lint/c/clang-tidy.mk b/share/mk/lint/c/clang-tidy.mk
> > index 8333c8ace12c..d992b956baf3 100644
> > --- a/share/mk/lint/c/clang-tidy.mk
> > +++ b/share/mk/lint/c/clang-tidy.mk
> > @@ -24,14 +24,8 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CLANG_TIDY	$@)
> >  	$(CLANG_TIDY) $(CLANG_TIDYFLAGS_) $< -- $(CLANGFLAGS_) $(CPPFLAGS_) 2>&1 \
> >  	| $(SED) '/generated\.$$/d' >&2
> > @@ -39,13 +33,12 @@ $(tgts):
> >  
> >  
> >  .PHONY: lint-c-clang-tidy
> > -lint-c-clang-tidy: $(tgts);
> > +lint-c-clang-tidy: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/cppcheck.mk b/share/mk/lint/c/cppcheck.mk
> > index c377120e4fa1..3952414c9cfd 100644
> > --- a/share/mk/lint/c/cppcheck.mk
> > +++ b/share/mk/lint/c/cppcheck.mk
> > @@ -21,27 +21,20 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CPPCHECK	$@)
> >  	$(CPPCHECK) $(CPPCHECKFLAGS_) $<
> >  	$(TOUCH) $@
> >  
> >  
> >  .PHONY: lint-c-cppcheck
> > -lint-c-cppcheck: $(tgts);
> > +lint-c-cppcheck: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/cpplint.mk b/share/mk/lint/c/cpplint.mk
> > index 6a714bc315ad..9ecef7f45553 100644
> > --- a/share/mk/lint/c/cpplint.mk
> > +++ b/share/mk/lint/c/cpplint.mk
> > @@ -13,26 +13,20 @@ include $(MAKEFILEDIR)/configure/build-depends/cpplint/cpplint.mk
> >  
> >  ext ::= .lint-c.cpplint.touch
> >  tgts_EX ::= $(patsubst %, %$(ext), $(_EX_TU_src))
> > -tgts    ::= $(tgts_EX)
> >  
> >  
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CPPLINT_CONF) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CPPLINT_CONF) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CPPLINT		$@)
> >  	$(CPPLINT) $(CPPLINTFLAGS_) $< >/dev/null
> >  	$(TOUCH) $@
> >  
> >  
> >  .PHONY: lint-c-cpplint
> > -lint-c-cpplint: $(tgts);
> > +lint-c-cpplint: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/iwyu.mk b/share/mk/lint/c/iwyu.mk
> > index e4477dbfac58..03bc68f55546 100644
> > --- a/share/mk/lint/c/iwyu.mk
> > +++ b/share/mk/lint/c/iwyu.mk
> > @@ -27,14 +27,8 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)IWYU		$@)
> >  	! ($(IWYU) $(IWYUFLAGS_) $(CLANGFLAGS_) $(CPPFLAGS_) $< 2>&1 \
> >  	   | $(SED) -n '/should add these lines:/,$$p' \
> > @@ -48,13 +42,12 @@ $(tgts):
> >  
> >  
> >  .PHONY: lint-c-iwyu
> > -lint-c-iwyu: $(tgts);
> > +lint-c-iwyu: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/man/blank.mk b/share/mk/lint/man/blank.mk
> > index f8eca7ac86b7..8fc7ad4be0a8 100644
> > --- a/share/mk/lint/man/blank.mk
> > +++ b/share/mk/lint/man/blank.mk
> > @@ -22,7 +22,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) '^$$' >/dev/null; then \
> > diff --git a/share/mk/lint/man/dash.mk b/share/mk/lint/man/dash.mk
> > index 85307af0e449..d82ac734880d 100644
> > --- a/share/mk/lint/man/dash.mk
> > +++ b/share/mk/lint/man/dash.mk
> > @@ -21,7 +21,7 @@ regexf ::= $(MAKEFILEDIR)/lint/man/dash.pcre2grep
> >  tgts ::= $(patsubst %, %$(ext), $(_NONSO))
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PCRE2GREP	$@)
> >  	$(CAT) <$< \
> >  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> > diff --git a/share/mk/lint/man/mandoc.mk b/share/mk/lint/man/mandoc.mk
> > index 5c24ca66ee7a..d96f94439933 100644
> > --- a/share/mk/lint/man/mandoc.mk
> > +++ b/share/mk/lint/man/mandoc.mk
> > @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)MANDOC		$@)
> >  	! ($(MANDOC) $(MANDOCFLAGS_) $< 2>&1 \
> >  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> > diff --git a/share/mk/lint/man/poems.mk b/share/mk/lint/man/poems.mk
> > index b7ee792f346c..b0e799d2997a 100644
> > --- a/share/mk/lint/man/poems.mk
> > +++ b/share/mk/lint/man/poems.mk
> > @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PCRE2GREP	$@)
> >  	$(CAT) <$< \
> >  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> > diff --git a/share/mk/lint/man/quote.mk b/share/mk/lint/man/quote.mk
> > index 3aca334967c0..86bc397c1d2b 100644
> > --- a/share/mk/lint/man/quote.mk
> > +++ b/share/mk/lint/man/quote.mk
> > @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) -Pf $(filter %.Pgrep, $^) >/dev/null; then \
> > diff --git a/share/mk/lint/man/so.mk b/share/mk/lint/man/so.mk
> > index 09b7816ae38f..cf8d6776e15d 100644
> > --- a/share/mk/lint/man/so.mk
> > +++ b/share/mk/lint/man/so.mk
> > @@ -24,7 +24,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)FIND		$@)
> >  	$(GREP) '^\.so ' <$< \
> >  	| $(CUT) -f2 -d' ' \
> > diff --git a/share/mk/lint/man/ws.mk b/share/mk/lint/man/ws.mk
> > index 7fd3bb69361d..2f587fc4e6ea 100644
> > --- a/share/mk/lint/man/ws.mk
> > +++ b/share/mk/lint/man/ws.mk
> > @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) -Ef $(filter %.egrep, $^) >/dev/null; then \
> > 
> > Range-diff against v0:
> > -:  ------------ > 1:  9a74fe43cf61 share/mk/: Use suffix rules where possible
> > -- 
> > 2.53.0
> > 
> 
> 
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v1] share/mk/: Use suffix rules where possible
  2026-09-11 17:54   ` Alejandro Colomar
@ 2026-09-11 18:00     ` Alejandro Colomar
  0 siblings, 0 replies; 4+ messages in thread
From: Alejandro Colomar @ 2026-09-11 18:00 UTC (permalink / raw)
  To: Lorenzo Stoakes; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 21698 bytes --]

I used an old address.  I'm sending now to the @kernel.org one.


Cheers,
Alex

----- Forwarded message from Alejandro Colomar <alx@kernel.org> -----

Date: Fri, 11 Sep 2026 19:54:34 +0200
From: Alejandro Colomar <alx@kernel.org>
To: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>,  linux-man@vger.kernel.org
Subject: Re: [PATCH v1] share/mk/: Use suffix rules where possible
Message-ID: <aqQ1tJR43K-72xMV@devuan>
References: <9a74fe43cf61f80f253e1401b547296b6f97c44a.1788101363.git.alx@kernel.org>
 <apRfmYBBPy0S8IAI@devuan>
In-Reply-To: <apRfmYBBPy0S8IAI@devuan>

[CC trimmed; To = Lorenzo]

Hi Lorenzo,

I've seen the news from <https://lwn.net/Articles/1093398/>, and thought
this recent experiment in the build system of the Linux man-pages
project might seem relevant to you.

> Date: 2026-08-30 18:55:19+0200
> From: Alejandro Colomar <alx@kernel.org>
>
> Hi Ingo,
> 
> > Date: 2026-08-30 16:51:24+0200
> > From: Alejandro Colomar <alx@kernel.org>
> >
> > Ingo complained that the size of the database is huge.  We can't make it
> > much smaller than this, but at least we can shrink it to one third.
> > 
> > Using suffix rules, we avoid having an explicit copy of the file list
> > in the rules, and thus optimizes the makefiles so that make(1)'s
> > database shrinks to around 1/3rd of the size.  The time for running
> > 'make nothing' also improves from ~ 0.45 s to ~ 0.33 s in my computer.
> 
> While this optimizes the size of make(1)'s database, and the run-time
> of the configuration part (everything before the targets start running),
> the actual work of the build is slowed down by orders of magnitude
> (I suspect associating targets with suffix rules is more expensive than
>  explicit rules).  Thus, I've dropped this change.  I can live with a
> somewhat-larger database, and make(1) seems to be fast with it.

The Linux man-pages Makefile-only build system uses explicit rules
everywhere, listing all target files in our makefile rules.  We use
'static pattern rules' almost everywhere.
<https://www.gnu.org/software/make/manual/html_node/Static-Pattern.html>

Here's for example the rule we use to build the C programs in the
EXAMPLES sections of manual pages:

	ext ::= .o
	xfail ::= $(MAKEFILEDIR)/build/examples/cc.xfail

	tgts ::= $(patsubst %.c, %$(ext), $(_EX_TU_c))
	ifeq ($(SKIP_XFAIL),yes)
	tgts ::= $(filter-out $(patsubst %.c, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts))
	endif


	_EX_TU_o ::= $(tgts)


	$(_EX_TU_o): %$(ext): %.c $(MK)
		$(info	$(INFO_)CC		$@)
		$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<

Recently (as shown in the quoted text above), I thought using regular
'pattern rules' might improve the build times, as the database used by
make(1) wouldn't need expanding all that text at once when defining the
rules, and indeed reduces that database to 1/3rd of the original size.
However, after trying it, the build times of a full build worsened by
orders of magnitude, and the time of a no-op build was only reduced by
fractions of a second (since it only takes a fraction of a second in the
first place).

I believe 'static pattern rules' go through simpler decision paths
within make(1), which might be the reason for the performance
differences I've experimented.

From what I've seen, the kernel seems to use regular 'pattern rules'
extensively.  I wonder if moving to 'static pattern rules' would bring
a benefit similar to the one we experience in the Linux man-pages
project.

Another important thing is that the build system of the Linux man-pages
uses a single make(1) process to build (i.e., we don't use recursive
make(1)).  That makes it parallelize better.  I'm not sure whether the
kernel makefiles are recursive (for the main build) and how much that
affects the kernel build.  It might be something to check too, as I
remember it was very impactful.  Recursive make(1) is considered harmful
by some (I agree, IME).


Have a lovely day!
Alex

> Cheers,
> Alex
> 
> > 
> > Reported-by: Ingo Schwarze <schwarze@openbsd.org>
> > Message-ID: <apL7VAruk1bIOr1M@isnote.usta.de>
> > Signed-off-by: Alejandro Colomar <alx@kernel.org>
> > ---
> > 
> > Hi Ingo,
> > 
> > Here's an optimization for the man-pages' build system.  Would you mind
> > checking if this also shows similar improvements in your system?
> > 
> > 
> > Have a lovely day!
> > Alex
> > 
> >  share/mk/build/catman/eqn.mk        |  2 +-
> >  share/mk/build/catman/grotty.mk     |  2 +-
> >  share/mk/build/catman/troff.mk      |  2 +-
> >  share/mk/build/examples/cc.mk       |  2 +-
> >  share/mk/build/examples/dir.mk      |  2 +-
> >  share/mk/build/html/post-grohtml.mk |  2 +-
> >  share/mk/build/html/troff.mk        |  2 +-
> >  share/mk/build/pdf/pages/eqn.mk     |  2 +-
> >  share/mk/build/pdf/pages/troff.mk   |  2 +-
> >  share/mk/build/pre/preconv.mk       |  2 +-
> >  share/mk/build/pre/tbl.mk           |  2 +-
> >  share/mk/build/ps/eqn.mk            |  2 +-
> >  share/mk/build/ps/grops.mk          |  2 +-
> >  share/mk/build/ps/troff.mk          |  2 +-
> >  share/mk/check/catman/col.mk        |  2 +-
> >  share/mk/check/catman/grep.mk       |  2 +-
> >  share/mk/lint/c/clang-tidy.mk       | 11 ++---------
> >  share/mk/lint/c/cppcheck.mk         | 11 ++---------
> >  share/mk/lint/c/cpplint.mk          | 10 ++--------
> >  share/mk/lint/c/iwyu.mk             | 11 ++---------
> >  share/mk/lint/man/blank.mk          |  2 +-
> >  share/mk/lint/man/dash.mk           |  2 +-
> >  share/mk/lint/man/mandoc.mk         |  2 +-
> >  share/mk/lint/man/poems.mk          |  2 +-
> >  share/mk/lint/man/quote.mk          |  2 +-
> >  share/mk/lint/man/so.mk             |  2 +-
> >  share/mk/lint/man/ws.mk             |  2 +-
> >  27 files changed, 31 insertions(+), 58 deletions(-)
> > 
> > diff --git a/share/mk/build/catman/eqn.mk b/share/mk/build/catman/eqn.mk
> > index 895662ac3710..e2830dab53ac 100644
> > --- a/share/mk/build/catman/eqn.mk
> > +++ b/share/mk/build/catman/eqn.mk
> > @@ -18,7 +18,7 @@ ext ::= .cat.troff
> >  _CATMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_CATMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -T$(NROFF_OUT_DEVICE) $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/catman/grotty.mk b/share/mk/build/catman/grotty.mk
> > index 66151b6cee93..a578edbeb191 100644
> > --- a/share/mk/build/catman/grotty.mk
> > +++ b/share/mk/build/catman/grotty.mk
> > @@ -16,7 +16,7 @@ ext ::= .cat
> >  _CATMAN ::= $(patsubst %.cat.set, %$(ext), $(_CATMAN_set))
> >  
> >  
> > -$(_CATMAN): %$(ext): %.cat.set $(MK) | $$(@D)/
> > +%$(ext): %.cat.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GROTTY		$@)
> >  	$(GROTTY) $(GROTTYFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/catman/troff.mk b/share/mk/build/catman/troff.mk
> > index 07e315327278..fc5bf0c18de8 100644
> > --- a/share/mk/build/catman/troff.mk
> > +++ b/share/mk/build/catman/troff.mk
> > @@ -28,7 +28,7 @@ endif
> >  _CATMAN_set ::= $(tgts)
> >  
> >  
> > -$(_CATMAN_set): %$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
> > +%$(ext): %.cat.troff $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc $(TROFFFLAGS_) $(NROFFFLAGS_) <$< 2>&1 >$@ \
> >  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> > diff --git a/share/mk/build/examples/cc.mk b/share/mk/build/examples/cc.mk
> > index 680b80f3e832..5806d8de0118 100644
> > --- a/share/mk/build/examples/cc.mk
> > +++ b/share/mk/build/examples/cc.mk
> > @@ -25,7 +25,7 @@ endif
> >  _EX_TU_o ::= $(tgts)
> >  
> >  
> > -$(_EX_TU_o): %$(ext): %.c $(MK)
> > +%$(ext): %.c $(MK)
> >  	$(info	$(INFO_)CC		$@)
> >  	$(CC) -c $(CFLAGS_) $(CPPFLAGS_) -o $@ $<
> >  
> > diff --git a/share/mk/build/examples/dir.mk b/share/mk/build/examples/dir.mk
> > index 10286c73bc0c..9782ad300193 100644
> > --- a/share/mk/build/examples/dir.mk
> > +++ b/share/mk/build/examples/dir.mk
> > @@ -14,7 +14,7 @@ include $(MAKEFILEDIR)/configure/build-depends/coreutils/touch.mk
> >  _PAGEEXDIRS ::= $(patsubst %, %.d/, $(_NONSO))
> >  
> >  
> > -$(_PAGEEXDIRS):
> > +%.d/:
> >  	+$(info	$(INFO_)MKDIR		$@)
> >  	+$(MKDIR) -p $@
> >  	+$(TOUCH) $@
> > diff --git a/share/mk/build/html/post-grohtml.mk b/share/mk/build/html/post-grohtml.mk
> > index 0c96a78609d8..fa886f09d0d8 100644
> > --- a/share/mk/build/html/post-grohtml.mk
> > +++ b/share/mk/build/html/post-grohtml.mk
> > @@ -16,7 +16,7 @@ ext ::= .html
> >  _HTMLMAN ::= $(patsubst %.html.set, %$(ext), $(_HTMLMAN_set))
> >  
> >  
> > -$(_HTMLMAN): %$(ext): %.html.set $(MK) | $$(@D)/
> > +%$(ext): %.html.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)POST_GROHTML	$@)
> >  	$(POST_GROHTML) $(POST_GROHTMLFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/html/troff.mk b/share/mk/build/html/troff.mk
> > index b6c1e659b7e4..6bdf9db1dbfa 100644
> > --- a/share/mk/build/html/troff.mk
> > +++ b/share/mk/build/html/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _HTMLMAN_set ::= $(tgts)
> >  
> >  
> > -$(_HTMLMAN_set): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Thtml $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pdf/pages/eqn.mk b/share/mk/build/pdf/pages/eqn.mk
> > index 6ef945af3e10..49b1a72c6b08 100644
> > --- a/share/mk/build/pdf/pages/eqn.mk
> > +++ b/share/mk/build/pdf/pages/eqn.mk
> > @@ -17,7 +17,7 @@ ext ::= .pdf.troff
> >  _PDFMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_PDFMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -Tpdf $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pdf/pages/troff.mk b/share/mk/build/pdf/pages/troff.mk
> > index e4c4d347fe6c..550168646d5b 100644
> > --- a/share/mk/build/pdf/pages/troff.mk
> > +++ b/share/mk/build/pdf/pages/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _PDFMAN_set ::= $(tgts)
> >  
> >  
> > -$(_PDFMAN_set): %$(ext): %.pdf.troff $(MK) | $$(@D)/
> > +%$(ext): %.pdf.troff $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Tpdf $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/pre/preconv.mk b/share/mk/build/pre/preconv.mk
> > index d19d12d261d7..e3dde5981949 100644
> > --- a/share/mk/build/pre/preconv.mk
> > +++ b/share/mk/build/pre/preconv.mk
> > @@ -16,7 +16,7 @@ ext ::= .tbl
> >  _MAN_tbl ::= $(patsubst %, %$(ext), $(_NONSO))
> >  
> >  
> > -$(_MAN_tbl): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PRECONV		$@)
> >  	$(PRECONV) $(PRECONVFLAGS_) $< >$@
> >  
> > diff --git a/share/mk/build/pre/tbl.mk b/share/mk/build/pre/tbl.mk
> > index 5883b6ec0c80..0375b958ff05 100644
> > --- a/share/mk/build/pre/tbl.mk
> > +++ b/share/mk/build/pre/tbl.mk
> > @@ -16,7 +16,7 @@ ext ::= .eqn
> >  _MAN_eqn ::= $(patsubst %.tbl, %$(ext), $(_MAN_tbl))
> >  
> >  
> > -$(_MAN_eqn): %$(ext): %.tbl $(MK) | $$(@D)/
> > +%$(ext): %.tbl $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TBL		$@)
> >  	$(TBL) <$< >$@
> >  
> > diff --git a/share/mk/build/ps/eqn.mk b/share/mk/build/ps/eqn.mk
> > index 315bed0e4cde..18c885655c99 100644
> > --- a/share/mk/build/ps/eqn.mk
> > +++ b/share/mk/build/ps/eqn.mk
> > @@ -17,7 +17,7 @@ ext ::= .ps.troff
> >  _PSMAN_troff ::= $(patsubst %.eqn, %$(ext), $(_MAN_eqn))
> >  
> >  
> > -$(_PSMAN_troff): %$(ext): %.eqn $(MK) | $$(@D)/
> > +%$(ext): %.eqn $(MK) | $$(@D)/
> >  	$(info	$(INFO_)EQN		$@)
> >  	! ($(EQN) -Tps $(EQNFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/build/ps/grops.mk b/share/mk/build/ps/grops.mk
> > index 463c7bac6f08..4b85b6a96854 100644
> > --- a/share/mk/build/ps/grops.mk
> > +++ b/share/mk/build/ps/grops.mk
> > @@ -16,7 +16,7 @@ ext ::= .ps
> >  _PSMAN ::= $(patsubst %.ps.set, %$(ext), $(_PSMAN_set))
> >  
> >  
> > -$(_PSMAN): %$(ext): %.ps.set $(MK) | $$(@D)/
> > +%$(ext): %.ps.set $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GROPS		$@)
> >  	$(GROPS) $(GROPSFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/build/ps/troff.mk b/share/mk/build/ps/troff.mk
> > index 851fb971faf3..8137014fe9e9 100644
> > --- a/share/mk/build/ps/troff.mk
> > +++ b/share/mk/build/ps/troff.mk
> > @@ -25,7 +25,7 @@ endif
> >  _PSMAN_set ::= $(tgts)
> >  
> >  
> > -$(_PSMAN_set): %$(ext): %.ps.troff $(MK) | $$(@D)/
> > +%$(ext): %.ps.troff $(MK) | $$(@D)/
> >  	$(info	$(INFO_)TROFF		$@)
> >  	! ($(TROFF) -mandoc -Tps $(TROFFFLAGS_) <$< 2>&1 >$@) \
> >  	| $(GREP) ^ >&2
> > diff --git a/share/mk/check/catman/col.mk b/share/mk/check/catman/col.mk
> > index 25b8b6e154a6..de326d989183 100644
> > --- a/share/mk/check/catman/col.mk
> > +++ b/share/mk/check/catman/col.mk
> > @@ -16,7 +16,7 @@ ext ::= .cat.grep
> >  _CHECK_catman_grep ::= $(patsubst %.cat, %$(ext), $(_CATMAN))
> >  
> >  
> > -$(_CHECK_catman_grep): %$(ext): %.cat $(MK) | $$(@D)/
> > +%$(ext): %.cat $(MK) | $$(@D)/
> >  	$(info	$(INFO_)COL		$@)
> >  	$(COL) $(COLFLAGS_) <$< >$@
> >  
> > diff --git a/share/mk/check/catman/grep.mk b/share/mk/check/catman/grep.mk
> > index bcfa1a134459..2fce886ae920 100644
> > --- a/share/mk/check/catman/grep.mk
> > +++ b/share/mk/check/catman/grep.mk
> > @@ -25,7 +25,7 @@ endif
> >  _CHECK_catman ::= $(tgts)
> >  
> >  
> > -$(_CHECK_catman): %.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
> > +%.check-catman.touch: %.cat.grep $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	! $(GREP) -n '.\{$(MANWIDTH)\}.' $< /dev/null >&2
> >  	$(TOUCH) $@
> > diff --git a/share/mk/lint/c/clang-tidy.mk b/share/mk/lint/c/clang-tidy.mk
> > index 8333c8ace12c..d992b956baf3 100644
> > --- a/share/mk/lint/c/clang-tidy.mk
> > +++ b/share/mk/lint/c/clang-tidy.mk
> > @@ -24,14 +24,8 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CLANG_TIDY_CONF) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CLANG_TIDY	$@)
> >  	$(CLANG_TIDY) $(CLANG_TIDYFLAGS_) $< -- $(CLANGFLAGS_) $(CPPFLAGS_) 2>&1 \
> >  	| $(SED) '/generated\.$$/d' >&2
> > @@ -39,13 +33,12 @@ $(tgts):
> >  
> >  
> >  .PHONY: lint-c-clang-tidy
> > -lint-c-clang-tidy: $(tgts);
> > +lint-c-clang-tidy: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/cppcheck.mk b/share/mk/lint/c/cppcheck.mk
> > index c377120e4fa1..3952414c9cfd 100644
> > --- a/share/mk/lint/c/cppcheck.mk
> > +++ b/share/mk/lint/c/cppcheck.mk
> > @@ -21,27 +21,20 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CPPCHECK_SUPPRESS) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CPPCHECK	$@)
> >  	$(CPPCHECK) $(CPPCHECKFLAGS_) $<
> >  	$(TOUCH) $@
> >  
> >  
> >  .PHONY: lint-c-cppcheck
> > -lint-c-cppcheck: $(tgts);
> > +lint-c-cppcheck: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/cpplint.mk b/share/mk/lint/c/cpplint.mk
> > index 6a714bc315ad..9ecef7f45553 100644
> > --- a/share/mk/lint/c/cpplint.mk
> > +++ b/share/mk/lint/c/cpplint.mk
> > @@ -13,26 +13,20 @@ include $(MAKEFILEDIR)/configure/build-depends/cpplint/cpplint.mk
> >  
> >  ext ::= .lint-c.cpplint.touch
> >  tgts_EX ::= $(patsubst %, %$(ext), $(_EX_TU_src))
> > -tgts    ::= $(tgts_EX)
> >  
> >  
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(CPPLINT_CONF) $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(CPPLINT_CONF) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)CPPLINT		$@)
> >  	$(CPPLINT) $(CPPLINTFLAGS_) $< >/dev/null
> >  	$(TOUCH) $@
> >  
> >  
> >  .PHONY: lint-c-cpplint
> > -lint-c-cpplint: $(tgts);
> > +lint-c-cpplint: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/c/iwyu.mk b/share/mk/lint/c/iwyu.mk
> > index e4477dbfac58..03bc68f55546 100644
> > --- a/share/mk/lint/c/iwyu.mk
> > +++ b/share/mk/lint/c/iwyu.mk
> > @@ -27,14 +27,8 @@ ifeq ($(SKIP_XFAIL),yes)
> >  tgts_EX ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(tgts_EX))
> >  endif
> >  
> > -tgts ::= $(tgts_EX)
> >  
> > -
> > -$(tgts_EX): %$(ext): %
> > -$(tgts): $(MK) | $$(@D)/
> > -
> > -
> > -$(tgts):
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)IWYU		$@)
> >  	! ($(IWYU) $(IWYUFLAGS_) $(CLANGFLAGS_) $(CPPFLAGS_) $< 2>&1 \
> >  	   | $(SED) -n '/should add these lines:/,$$p' \
> > @@ -48,13 +42,12 @@ $(tgts):
> >  
> >  
> >  .PHONY: lint-c-iwyu
> > -lint-c-iwyu: $(tgts);
> > +lint-c-iwyu: $(tgts_EX);
> >  
> >  
> >  undefine ext
> >  undefine xfail
> >  undefine tgts_EX
> > -undefine tgts
> >  
> >  
> >  endif  # include guard
> > diff --git a/share/mk/lint/man/blank.mk b/share/mk/lint/man/blank.mk
> > index f8eca7ac86b7..8fc7ad4be0a8 100644
> > --- a/share/mk/lint/man/blank.mk
> > +++ b/share/mk/lint/man/blank.mk
> > @@ -22,7 +22,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) '^$$' >/dev/null; then \
> > diff --git a/share/mk/lint/man/dash.mk b/share/mk/lint/man/dash.mk
> > index 85307af0e449..d82ac734880d 100644
> > --- a/share/mk/lint/man/dash.mk
> > +++ b/share/mk/lint/man/dash.mk
> > @@ -21,7 +21,7 @@ regexf ::= $(MAKEFILEDIR)/lint/man/dash.pcre2grep
> >  tgts ::= $(patsubst %, %$(ext), $(_NONSO))
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PCRE2GREP	$@)
> >  	$(CAT) <$< \
> >  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> > diff --git a/share/mk/lint/man/mandoc.mk b/share/mk/lint/man/mandoc.mk
> > index 5c24ca66ee7a..d96f94439933 100644
> > --- a/share/mk/lint/man/mandoc.mk
> > +++ b/share/mk/lint/man/mandoc.mk
> > @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)MANDOC		$@)
> >  	! ($(MANDOC) $(MANDOCFLAGS_) $< 2>&1 \
> >  	   | $(GREP) -v -f '$(filter %.grep, $^)' \
> > diff --git a/share/mk/lint/man/poems.mk b/share/mk/lint/man/poems.mk
> > index b7ee792f346c..b0e799d2997a 100644
> > --- a/share/mk/lint/man/poems.mk
> > +++ b/share/mk/lint/man/poems.mk
> > @@ -25,7 +25,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)PCRE2GREP	$@)
> >  	$(CAT) <$< \
> >  	| if $(PCRE2GREP) -f '$(filter %.pcre2grep, $^)' >/dev/null; then \
> > diff --git a/share/mk/lint/man/quote.mk b/share/mk/lint/man/quote.mk
> > index 3aca334967c0..86bc397c1d2b 100644
> > --- a/share/mk/lint/man/quote.mk
> > +++ b/share/mk/lint/man/quote.mk
> > @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) -Pf $(filter %.Pgrep, $^) >/dev/null; then \
> > diff --git a/share/mk/lint/man/so.mk b/share/mk/lint/man/so.mk
> > index 09b7816ae38f..cf8d6776e15d 100644
> > --- a/share/mk/lint/man/so.mk
> > +++ b/share/mk/lint/man/so.mk
> > @@ -24,7 +24,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(MK) | $$(@D)/
> > +%$(ext): % $(MK) | $$(@D)/
> >  	$(info	$(INFO_)FIND		$@)
> >  	$(GREP) '^\.so ' <$< \
> >  	| $(CUT) -f2 -d' ' \
> > diff --git a/share/mk/lint/man/ws.mk b/share/mk/lint/man/ws.mk
> > index 7fd3bb69361d..2f587fc4e6ea 100644
> > --- a/share/mk/lint/man/ws.mk
> > +++ b/share/mk/lint/man/ws.mk
> > @@ -23,7 +23,7 @@ tgts ::= $(filter-out $(patsubst %, $(_MANDIR)/%$(ext), $(file < $(xfail))), $(t
> >  endif
> >  
> >  
> > -$(tgts): %$(ext): % $(regexf) $(MK) | $$(@D)/
> > +%$(ext): % $(regexf) $(MK) | $$(@D)/
> >  	$(info	$(INFO_)GREP		$@)
> >  	$(CAT) <$< \
> >  	| if $(GREP) -Ef $(filter %.egrep, $^) >/dev/null; then \
> > 
> > Range-diff against v0:
> > -:  ------------ > 1:  9a74fe43cf61 share/mk/: Use suffix rules where possible
> > -- 
> > 2.53.0
> > 
> 
> 
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>



----- End forwarded message -----

-- 
<https://www.alejandro-colomar.es>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-09-11 18:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-30 14:51 [PATCH v1] share/mk/: Use suffix rules where possible Alejandro Colomar
2026-08-30 16:55 ` Alejandro Colomar
2026-09-11 17:54   ` Alejandro Colomar
2026-09-11 18:00     ` Alejandro Colomar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox