help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Why does make try to build Makefile.o?


From: Paul D. Smith
Subject: Re: Why does make try to build Makefile.o?
Date: Tue, 12 Nov 2002 00:15:59 -0500

%% gk <address@hidden> writes:

  g> I don't understand why make is trying to rebuild my Makefile.o, in
  g> the example below.  It seems like my pattern rules must have
  g> screwed up the implicit rules or something.  If I use 'make -r
  g> foo.c' I don't have a problem.

The first thing make does is try to rebuild all the makefiles it read
in: this is the "auto re-exec" feature of GNU make.

So, it wants to try to build "Makefile".  Well, one of the builtin
suffix rules is:

  .o:
          $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

This is a suffix rule that says "you can build a foo from a foo.o using
this command"; a link operation.

So, make sees it can create a "Makefile" from a "Makefile.o".  Well, how
can it create a "Makefile.o"?

It sees that there's also a suffix rule for that:

  .c.o:
          $(COMPILE.c) $(OUTPUT_OPTION) $<

So, make knows it can build a "Makefile" from a "Makefile.o", and it can
build a "Makefile.o" from a "Makefile.c".  Well, how can it create a
"Makefile.c"?  Usually this is where the implicit chain ends, but you
have added a new pattern rule:

  g> .PHONY: force

  g> %.c: force
  g>          @echo 'rule: %.c' "target: $@"

This rule says, "you can build any 'x.c', without needing any
prerequisites at all, by running this command".  I'm really unclear on
what you're trying to do here; it seems like a very bad idea.

But, regardless, make says "cool!".  Now it knows how to rebuild your
Makefile: first it runs that command you told it would generate a
"Makefile.c", then it will run the compiler on it, then it will link
it.

If course, since the rule doesn't actually create a .c, the compiler
fails trying to compile the .c.

If you use -r, or you use ".SUFFIXES:" to remove the suffix rules, it
works because make can't connect the dots: it doesn't know how to build
a "Makefile" from a "Makefile.o", and if it did it wouldn't know how to
build a "Makefile.o" from a "Makefile.c".

  g> I am trying to understand how implicit rules work so that I can:

The above is derivable from the -d output.  It requires a little bit of
reading between the lines, but it's not too bad.

  g> 1. write my own rules which should take precedence over built-in
  g>    rules and not break things

All rules you write will take precedence over builtin rules; they are
searched first and, if they conflict, rules you write will delete

  g> 2. avoid disabling all built-in implicit rules which may be useful
  g>    if I have not pre-emted them in my makefile

Personally I don't use the builtin rules ever.  They're useful if you
have a simple bit of code you want to build but _any_ moderately complex
or longer-term project it's not worth it; remove the builtin rules and
define your own.

-- 
-------------------------------------------------------------------------------
 Paul D. Smith <address@hidden>          Find some GNU make tips at:
 http://www.gnu.org                      http://make.paulandlesley.org
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist




reply via email to

[Prev in Thread] Current Thread [Next in Thread]