This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]