GNU make: order-only prerequisites

Boris Kolpackov boris at kolpackov.net
Thu Jan 22 13:21:27 CST 2004


A new flavor of prerequisites was introduced in GNU make 3.80 called
order-only prerequisites. They are essentially the same as normal ones
except that an out-of-date order-only prerequisite does not render its 
targets out-of-date. I found this especially useful in the following 
context. Suppose I need to build 'foo.o' from 'foo.c' in $(out_dir).
In the GNU make syntax such a desire can be expressed, for example, 
like this:


$(out_dir)/foo.o : foo.c
	g++ -c $^ -o $@

So far so good. Now, suppose the directory $(out_dir) does not always
exist and I need to create it before producing 'foo.o'. The first thing 
that comes to mind is to write something along these lines:

$(out_dir) :
	mkdir -p $@ 

$(out_dir)/foo.o : $(out_dir)

This doesn't work because now we have two prerequisites for 
'$(out_dir)/foo.o' and when the rule's command is executed, we get 
something like this (assuming $(out_dir) is /bar):

gcc -c foo.c /bar -o /bar/foo.o

Of course, we could filter out all prerequisites that don't have suffix
'.c' but that wouldn't be a very elegant solution. A much cleaner approach 
would be to use an order-only prerequisite:

 
$(out_dir)/foo.o : | $(out_dir)


This will ensure that if $(out_dir) does not exist then it will be created
before '$(out_dir)/foo.o' is built.

hth,
-boris
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 652 bytes
Desc: Digital signature
Url : http://www.kolpackov.net/pipermail/notes/attachments/20040122/1224e3f2/attachment.bin


More information about the notes mailing list