Recursive Makefile howto
Manavendra Nath Manav
mnm.kernel at gmail.com
Fri Jan 27 07:08:11 EST 2012
On Fri, Jan 27, 2012 at 2:32 PM, Kristof Provost <kristof at sigsegv.be> wrote:
> On 2012-01-27 11:43:10 (+0530), Manavendra Nath Manav <mnm.kernel at gmail.com> wrote:
>> 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
More information about the Kernelnewbies
mailing list