[U-Boot-Users] [PATCH] Fix/workaround broken dependency handling with make 3.81
Robert Schwebel
robert at schwebel.de
Tue Aug 29 02:15:33 CEST 2006
On Mon, Aug 28, 2006 at 11:15:32PM +0200, Wolfgang Denk wrote:
> Yes, and IMHO you can easily show more problems with make. To me it's
> really frightening to see so many issues with a tool in so wide use
> like GNU make.
Well, make is powerful, so expect it to be complex :-)
> -> cat Makefile
> all: hello_world.tgt
>
> %.tgt: %
> cp $< $@
>
> %: %.src
> cp $< $@
>
> %.src: FORCE
> touch $@
>
> .PHONY: FORCE
> FORCE:
> -> make -n
> touch Makefile.src
> cp Makefile.src Makefile
> rm Makefile.src
> make: *** No targets. Stop.
> -> ls -l
> total 0
> -rw-r--r-- 1 wd users 0 Aug 28 23:08 Makefile
> -rw-r--r-- 1 wd users 0 Aug 28 23:08 Makefile.src
> -> make --version
> GNU Make 3.80
> ...
>
> So yes, your Makefile is dangerous.
>
> But wait. I used "-n" on the command line. And the man page says:
>
> -n Print the commands that would be executed, but do not
> execute them.
>
> Do not execute them? So who did execute the "touch" and the "cp", but
> skip the "rm"? I'm frightened.
I don't have a solution, but some remarks:
from 'info make':
----------8<----------
3.7 How Makefiles Are Remade
============================
[...]
To this end, after reading in all makefiles, `make' will consider
each as a goal target and attempt to update it. If a makefile has a
rule which says how to update it (found either in that very makefile or
in another one) or if an implicit rule applies to it (*note Using
Implicit Rules: Implicit Rules.), it will be updated if necessary.
[...]
When you use the `-t' or `--touch' option (*note Instead of Executing
the Commands: Instead of Execution.), you would not want to use an
out-of-date makefile to decide which targets to touch. So the `-t'
option has no effect on updating makefiles; they are really updated even
if `-t' is specified. Likewise, `-q' (or `--question') and `-n' (or
`--just-print') do not prevent updating of makefiles, because an
out-of-date makefile would result in the wrong output for other targets.
----------8<----------
So -n is being ignored for Makefile-remaking, and the "%: %.src" rule
is found as a goal target to update the Makefile from Makefile.src,
which is not there and thus being touched by using the "%.src: FORCE"
rule.
> Actually: where is the "rm" coming from?
The file you refer to with "%" is an intermediate file, as it is part of
a chain. So it is being deleted automatically. If you don't want to do
that, declare it .INTERMEDIATE.
Here's a modified version which doens't work as well, but does if you
'make hello_world.src' manually (not the intended behaviour, but it
shows some things):
----------8<----------
all: hello_world.tgt
%.tgt: %
cp $< $@
% :: %.src
cp $< $@
%.src: FORCE
touch $@
.INTERMEDIATE: hello_world
.PHONY: FORCE
FORCE:
----------8<----------
Note that I've declared % to be terminal, so Makefile is not rebuilt,
because there is no Makefile.src.
rsc at isonoe:~/wd$ ll
total 4
-rw-r--r-- 1 rsc ptx 138 Aug 29 01:52 Makefile
-rw-r--r-- 1 rsc ptx 0 Aug 29 01:56 hello_world.src
rsc at isonoe:~/wd$ make
cp hello_world.src hello_world
cp hello_world hello_world.tgt
rsc at isonoe:~/wd$ ls -l
total 4
-rw-r--r-- 1 rsc ptx 138 Aug 29 01:52 Makefile
-rw-r--r-- 1 rsc ptx 0 Aug 29 01:56 hello_world
-rw-r--r-- 1 rsc ptx 0 Aug 29 01:56 hello_world.src
-rw-r--r-- 1 rsc ptx 0 Aug 29 01:56 hello_world.tgt
Anyway, can't you avoid the match-anything rule somehow?
Robert
--
Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de
Pengutronix - Linux Solutions for Science and Industry
Handelsregister: Amtsgericht Hildesheim, HRA 2686
Hannoversche Str. 2, 31134 Hildesheim, Germany
Phone: +49-5121-206917-0 | Fax: +49-5121-206917-9
More information about the U-Boot
mailing list