schorr@WHEATIES.AI.MIT.EDU (Andrew Schorr) (11/29/88)
Roland,
I am having a problem with recursive makes.
I am running version 3.20 of GNU Make.
Directory /x/y contains Makefile and file1.c
Contents of Makefile:
prog: file1.o ../z/file2.o ../z/file3.o
$(CC) $(LDFLAGS) -o prog $^
../z/file2.o ../z/file3.o: FRC
cd $(@D); $(MAKE) $(@F)
FRC:
There is no file with the name FRC; this is a phony dependency that
is intended to force recompilation.
Directory /x/z contains Makefile, file2.c, file2.h, and file3.c
file2.o: file2.c file2.h
Assume that all the targets are up to date.
When I am in directory /x/y and I type make prog, I would like
make always to invoke the recursive make in directory /x/z for both
file2.o and file3.o. Suppose I type make prog in directory /x/y.
In version 3.13, nothing happened.
In version 3.20, I get
cd ../z/; make file2.o
make: `file2.o' is up to date.
Note that it only performed the recursive make for 1 of the 2 dependencies.
If I type make -n prog, I get the correct behavior:
cd ../z/; make file2.o
make: `file2.o' is up to date.
cd ../z/; make file3.o
make: `file3.o' is up to date.
cc -o prog file1.o ../z/file2.o ../z/file3.o
make: `prog' is up to date.
Now, suppose I switch the order of file2.o and file3.o in /x/y/Makefile:
prog: file1.o ../z/file3.o ../z/file2.o
If I type make prog, I get
cd ../z/; make file3.o
make: `file3.o' is up to date.
It appears that the recursive make is invoked only for the first dependency
in the list (this holds true when there are more than 2 "recursive"
dependencies).
Finally, suppose I change /x/y/Makefile to have the following contents:
prog: file1.o ../z/file2.o ../z/file3.o
$(CC) $(LDFLAGS) -o prog $^
../z/file2.o: FRC
cd $(@D); $(MAKE) $(@F)
FRC:
../z/file3.o: FRC2
cd $(@D); $(MAKE) $(@F)
FRC2:
If I now type make prog, I get the expected behavior:
cd ../z/; make file2.o
make: `file2.o' is up to date.
cd ../z/; make file3.o
make: `file3.o' is up to date.
Two observations:
1. This Makefile works as expected with SunPro 3.5 Make.
2. I realize that I could get this to work using the .PHONY target;
however, I would like to remain compatible with other versions of make.
Thanks for your help,
Andrew Schorr <beareq!schorr@wheaties.ai.mit.edu>