Re: [PATCH 3/4] Makefile: Replace old suffix rules with pattern rules

Simon Marchi
2016-11-16T19:38:38Z

On 2016-11-16 11:56, Pedro Alves wrote:
> # Suppress smart makes who think they know how to automake yacc and
> flex file
> .y.c:
> .l.c:

I don't understand how that can be useful. According to the GNU make
doc:

Suffix rules with no recipe are also meaningless. They do not remove
previous
rules as do pattern rules with no recipe (see Canceling Implicit
Rules). They
simply enter the suffix or pair of suffixes concatenated as a target
in the
data base.

Source:
https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html

So those two would be meaningless?

> ~~~
> This doesn't get rid of all the implicit rules in GNU make, however,
> because some default rules are pattern rules which are not affected by
> the .SUFFIXES special target.
>
> To get rid of all implicit rules in GNU make you have to either invoke
> make with the -r option [...], or else add this to your makefile:
>
> .SUFFIXES:
> %:: %,v
> %:: RCS/%,v
> %:: RCS/%
> %:: s.%
> %:: SCCS/s.%
> ~~~
>
> I'd be curious if this makes any difference in a "make" invocation
> that ends up building nothing (because all targets are already
> up to date).

When looking at the make debug output (make -d), I think it becomes
obvious:

http://pastebin.com/raw/cETk9W3v

That's taken without .SUFFIXES or other means to disable implicit rules.
For _each_ .c file, make tries to determine if it was generated
somehow, and you can see the lines which the rules you mentioned would
suppress. In our case, most C files are not generated, and those that
are have an explicit rule. I don't think we rely on implicit rules.
Since we don't use them, I think it makes sense to disable then as much
as possible. Plus, I can imagine them being a possible source of
"bugs". If you happen to have a file called infrun.l by accident, the
the build will fail and you'll wonder why.

I did some experiments, here's the time it takes to run make in the gdb/
directory with nothing to re-build. The other number is the number of
lines printed when running make -d. It gives a rough idea of the amount
of operations make does.

Note that these results are by changing both gdb/Makefile.in and
gdb/gdbserver/Makefile.in. That's fair, since the -r applies
recursively as well.

Baseline: 2.5 seconds, 2306335 lines
With .SUFFIXES: 0.7 seconds, 307706 lines
With .SUFFIXES and the other %:: rules: 0.6 seconds, 255386 lines
With -r flag (make -r): 0.5 seconds, 160682 lines

So I think it shows that it wouldn't hurt to use ".SUFFIXES =" and the
other rules from the gcc Makefile. I couldn't manage to get rid of the
%.{y,l,w} -> %.c implicit rules though no matter what I tried. Calling
make with the -r flag was the only way. At this point the returns are
minimal though, so I don't think we should worry about it.