I have a bunch of C files in different directories and I'm getting a make: nothing to be done for 'all'
error with my recursive Makefile; however if I tweak the dependences I can get it to work... but I don't understand why I have to.
Here's my original Makefile:
APP_DIRS=rescoco ressys resvm
.PHONY: all
all: $(APP_DIRS)
$(APP_DIRS):
$(MAKE) --directory $@
clean:
$(RM) *~
Now if I change my line: .PHONY
to .PHONY: all $(APP_DIRS)
it builds fine.
Another possibility is if I change the line: $(APP_DIRS):
to $(APP_DIRS): clean
it builds fine.
(NOTE: removing .PHONY target doesn't change anything)
So what's going on here? Is the Makefile trying to tell me I haven't listed dependencies correctly? I was thinking make
would do something like:
- to build
.PHONY
I first have to buildall
- to build
all
I first have to build$(APP_DIRS)
$(APP_DIRS)
has no prereqs so execute the command for that (which would cause the recursive makes to run).
Clearly I am wrong; but why?
FYI, if it matters my files are structured something like this:
Makefile #top level makefile as seen above
/rescoco
rescoco.c
Makefile #builds rescoco src and moves archive to ../lib directory
/ressys
ressys.c
Makefile #same as above but for ressys
/resvm
resvm.c
Makefile #same as above but for resvm
/lib
and my build command is simply make
. When I run with make -n
or make -n all
I get no output at all:
:~/proj$ make -n all
make: Nothing to be done for 'all'.
:~/proj$