Thread (7 messages) 7 messages, 4 authors, 2012-01-28

Recursive Makefile howto

flat view

From: Manavendra Nath Manav <hidden>
Date: 2012-01-27 12:08:11

On Fri, Jan 27, 2012 at 2:32 PM, Kristof Provost [off-list ref] wrote:
On 2012-01-27 11:43:10 (+0530), Manavendra Nath Manav [off-list ref] wrote:
quoted
I have developed a Makefile which recursively builds the code spread
across multiple directories, each having it's own Makefile.

build_all: targetA \
? ? ? ? ? ? ? ?targetB \
? ? ? ? ? ? ? ?target C

Now, the problem is that even when the Makefile of targetA fails, the
master Makefile continues building with targetB and targetC. I can
also see the make errors being printed on console. I want the make to
stop immediately at the first error encountered in any target
Makefile. How to do this?
It would be a lot easier to help you if you'd post the relevant bits of
your Makefile.

Dusting off my crystal ball, I see in the mists that your makefile looks
something like this:

build:
? ? ? ?for d in $(DIRS) ; \
? ? ? ?do \
? ? ? ? ? ? ? ?$(MAKE) -C $$d $@ ; \
? ? ? ?done

The problem here is that make considers the whole for loop as one and
doesn't get the exit status of each sub-make, but only of the last one.

Try something like this instead:

build:
? ? ? ?for d in $(DIRS) ; \
? ? ? ?do \
? ? ? ? ? ? ? ?$(MAKE) -C $$d $@ || exit $? ; \
? ? ? ?done

Regards,
Kristof
Hi Kristof,

Your crystal ball insight was fairly accurate. The syntax "$(MAKE) -C
$$d $@ || exit $? ;" is both new and helpful to me. For more clarity,
the format of my Makefile is like this:

my_exec: Build_sqllib	\
	Create_obj_dir		\
	objs/server/foo.o	\
	objs/server/bar.c	
	$(LINK) -o my_exec	\
	objs/server/foo.o	\
	objs/server/bar.c

Build_sqllib:
	cd src/sqllib;				\
	rm -rf LIBS/*;				\
	make;					\
	rm -f $(CURDIR)/sqllib.a;		\
	cp -fv LIBS/sqllib.a $(CURDIR)/lib/sqllib.a;\
	cd $(CURDIR);

Create_obj_dir:
	mkdir -p objs/server		\
		objs/html			\
		objs/log			\
		objs/cipher		\
		objs/curse		\
		objs/crypto		\
		objs/protocol

objs/server/foo.o:			\
	src/server/foo.c
	$(LINK) -c			\
		-o objs/server/foo.o	\
		src/server/foo.c

Now, I am getting error in the make part of "Build_sqllib" but the
makefile continues to next line. I guess, I need to add "|| exit" also
with this make command. Kristof, can you pls also explain me the
meanings of $$d, $@, and $? as used in Makefiles.
-- 
Manavendra Nath Manav
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help