make question

I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort. I have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make fails?

There may be better ways to do it but what I might try doing is checking the
return value of make within your script. If make fails, you just exit the
loop. The other option which you’ll find fairly educational is to look at
our recursive makefile stuff. Take a look at /usr/include/recurse.mk to see
how it’s done. The O’Reilly Make book is really good too.

cheers,

Kris

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:agfl61$rh6$1@inn.qnx.com

I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort. I have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make fails?

My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is in a
makefile, not in a shell script. I just can’t seam to find the right place
to test the return of the nested make and force an abort in the outer make.

“Kris Warkentin” <kewarken@qnx.com> wrote in message
news:agh9o8$ah1$1@nntp.qnx.com

There may be better ways to do it but what I might try doing is checking
the
return value of make within your script. If make fails, you just exit the
loop. The other option which you’ll find fairly educational is to look at
our recursive makefile stuff. Take a look at /usr/include/recurse.mk to
see
how it’s done. The O’Reilly Make book is really good too.

cheers,

Kris

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agfl61$rh6$> 1@inn.qnx.com> …
I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort. I
have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make fails?

\

In QNX4 I don’t have a /usr/include/recurse.mk file. Where should it be?

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:aghbka$7nu$1@inn.qnx.com

My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is in a
makefile, not in a shell script. I just can’t seam to find the right
place
to test the return of the nested make and force an abort in the outer
make.

“Kris Warkentin” <> kewarken@qnx.com> > wrote in message
news:agh9o8$ah1$> 1@nntp.qnx.com> …
There may be better ways to do it but what I might try doing is checking
the
return value of make within your script. If make fails, you just exit
the
loop. The other option which you’ll find fairly educational is to look
at
our recursive makefile stuff. Take a look at /usr/include/recurse.mk to
see
how it’s done. The O’Reilly Make book is really good too.

cheers,

Kris

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agfl61$rh6$> 1@inn.qnx.com> …
I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort. I
have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make
fails?



\

Bill,
I have attached it for you.
I found it under QNX 6.2NC in /usr/include/



“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:aghc03$7t6$1@inn.qnx.com

In QNX4 I don’t have a /usr/include/recurse.mk file. Where should it be?

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:aghbka$7nu$> 1@inn.qnx.com> …
My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is in
a
makefile, not in a shell script. I just can’t seam to find the right
place
to test the return of the nested make and force an abort in the outer
make.

“Kris Warkentin” <> kewarken@qnx.com> > wrote in message
news:agh9o8$ah1$> 1@nntp.qnx.com> …
There may be better ways to do it but what I might try doing is
checking
the
return value of make within your script. If make fails, you just exit
the
loop. The other option which you’ll find fairly educational is to
look
at
our recursive makefile stuff. Take a look at /usr/include/recurse.mk
to
see
how it’s done. The O’Reilly Make book is really good too.

cheers,

Kris

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agfl61$rh6$> 1@inn.qnx.com> …
I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort. I
have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make
fails?






\

begin 666 recurse.mk
M(PT*(PE’96YE<F%L;‘D@=7-E9G5L(’)E8W5R<VEV92!M86ME9FEL92X-“B,-
M"B,)1FEN9’,@86YY(’-U8F1I<F5C=&]R:65S(’=I=&@@(DUA:V5F:6QE(B!I
M;B!T:&5M+”!A;F0-“B,)<F5C=7)S97,@:6YT;R!T:&5M+”!I<W-U:6YG(")M
M86ME(B!W:71H(‘1H92!S<&5C:69I960-"B,)=&%R9V5T+B!$;R!N;W0@<F5C
M=7)S92!I;G1O(&$@9&ER96-T;W)Y(&EF(‘1H97)E(&ES( T*(R @(&$@(DUA
M:V5F:6QE+F1N;2(@9FEL92!P<F5S96YT+@T*(PT*#0IE>’!O<G0-"G5N97AP
M;W)T(%!71 T*=6YE>’!O<G0@3$E35 T*=6YE>’!O<G0@;6%K96QI<W0-“G5N
M97AP;W)T(&UA:V5F:6QE<PT*=6YE>’!O<G0@;6MF:6QE#0IU;F5X<&]R=”!F
M;W)C95]D:7)S#0IU;F5X<&]R="!Q8F1I<@T*=6YE>’!O<G0@9FER<W1D:7(-
M"G5N97AP;W)T(’)E<W1D:7(-"G5N97AP;W)T(’-E< T*=6YE>’!O<G0@;6%K
M96-M9 T*=6YE>’!O<G0@:6YC7VQI<W0-“G5N97AP;W)T(&5X8U]L:7-T#0IU
M;F5X<&]R=”!T;7 -“G5N97AP;W)T(’)E86QL:7-T#0IU;F5X<&]R=”!-04M%
M1DE,10T*#0II9FYD968@34%+149)3$4-"DU!2T5&24Q%/5M-;5UA:V5F:6QE
M#0IE;F1I9@T*#0IM86ME9FEL97,Z/20H=VEL9&-A<F0@B\D$U!2T5&24Q%
M2D-"FUK9FEL93H])"AN;W1D:7(@)"AF:7)S=’=O<F0@)"AM86ME9FEL97,I
M
2D-"FUA:V5L:7-T.CTD*’-O<G0@)“AP871S=6)S=” E+RPE+"0H9&ER(“0H
M;6%K969I;&5S2DI0T*;6%K96QI<W0Z/20H9FEL=&5R+6]U=” D*’!A=’-U
M8G-T("4O+"4L)“AD:7(@)“AW:6QD8V%R9” J+UM-;5UA:V5F:6QE+F1N;2DI
M2PD&UA:V5L:7-T2D-"@T:69N97$@"0H9FEL=&5R($-052!/4RPD$Q)
M4U0I2PI#0HC#0HC($EF(’=E)W)E(’=O<FMI;F<@;VX@82!#4%4@;W(@3U,@
M;&ES=“P@9FEG=7)E(&]U=”!W:&%T(‘1A<F=E="!S>7-T96US(’=E( T
(R!C
M86X@86-T=6%L;‘D@8G5I;&0@8F%S960@;VX@=&AE(&AO<W0@<WES=&5M(’=E
M)W)E(’)U;FYI;F<@;VXN#0HC#0II9FYD968@44)524Q$3$E35 T44)524Q$
M3$E35#UB=6EL9&QI<W0N;6L-"FEF9&5F(%%#3TY&24<-"G%B9&ER/20H9&ER
M("0H44-/3D9)1RDI#0IE;F1I9@T
96YD:68-“BUI;F-L=61E(“0H<6)D:7(I
M)“A10E5)3$1,25-40T96YD:68-”@T*:69N97$@"PD$Q)4U0I0T:69D
M968@0TA%0TM&3U)#10T9F]R8V5?9&ER<SH])“AP871S=6)S=” E+RPE+"0H
M9&ER("0H=VEL9&-A<F0@B];36U=86ME9FEL92YF;W)C92DI0T
96YD:68-
M”@T*:6YC7VQI<W0Z/2Y"54=&25@N(“0H<V]R=” D*&9O<F5A8V@@=F%R+” D
M*$Q)4U0I+” D*"0H=F%R4Q)4U0I2D-“FEN8U]L:7-T.CTD*&9I;'1E<BUO
M=70@+D)51T9)6"XL(“0H:6YC7VQI<W0I0T97AC7VQI<W0Z/2Y"54=&25@N
M(“0H<V]R=” D*&9O<F5A8V@@=F%R+” D*$Q)4U0I+” D*$580TQ51$5?)“AV
M87(I3$E35"DI0T97AC7VQI<W0Z/20H9FEL=&5R+6]U=” N0E5’1DE8+BP@
M)"AE>&-?;&ES="DI#0H-“FEF;F5Q(”@L)"AE>&-?;&ES="DI#0IM86ME;&ES
M=#H])“AF:6QT97(M;W5T(“0H9FEL=&5R+6]U=” D*&9O<F-E7V1I<G,I+” D
M*&9O<F5A8V@@9&ER+"0H;6%K96QI<W0I+“0H:68@)“AF:6QT97(@)“AS=6)S
M=” N+” L)“AS=6)S=” M+” L)"AD:7(I2DL)“AS=6)S=” O+" L)"AE>&-?
M;&ES="DI
2PD*&1I<BDI2DL)"AM86ME;&ES="DI#0IE;F1I9@T#0II9FYE
M<2 H+“0H:6YC7VQI<W0I0T<F5A;&QI<W0Z/20H9F]R96%C:”!V87(L)"A,
M25-42PD&EF("0H)"AV87(I3$E35"DL)"AV87(I+"DI#0IM86ME;&ES=#H]
M)“AF:6QT97(M;W5T(“0H9FEL=&5R+6]U=” D*&9O<F-E7V1I<G,I+” D*&9O
M<F5A8V@@9&ER+"0H;6%K96QI<W0I+“0H9F]R96%C:”!V87(L)"AR96%L;&ES
M="DL)"AI9B D*&9I;‘1E<B D*’-U8G-T("XL("PD*’-U8G-T("TL(“PD*&1I
M<BDI2PD’-U8G-T(”\L("PD*"0H=F%R4Q)4U0I2DL+"0H9&ER2DI2DL
M)"AM86ME;&ES="DI#0IE;F1I9@T96YD:68-"@T;6%K96QI<W0Z/20H9FEL
M=&5R("0H14%23%E?1$E24RDL)"AM86ME;&ES="DI(“0H9FEL=&5R+6]U=” D
M*$5!4DQ97T1)4E,I(“0H3$%415]$25)32P@)"AM86ME;&ES="DI("0H9FEL
M=&5R("0H3$%415]$25)3
2PD*&UA:V5L:7-T2D-"F9I<G-T9&ER.CTD&9I
M<G-T=V]R9” D*&UA:V5L:7-T2D-"G)E<W1D:7(@.CTD&9I;'1E<BUO=70@
M)"AF:7)S=&1I<BDL("0H;6%K96QI<W0I0T#0II9FYE<2 H)"AF:6YD<W1R
M:6YG(&LL)"A-1DQ!1U,I2PI#0IS97 Z/3L-"F5L<V4-"G-E<#H])B8-"F5N
M9&EF#0H-"FUA:V5C;60@/2 D
$U!2T4I("UJ("0H9FER<W1W;W)D("0H2DQ%
M5D5,2 Q2 M0R0H9&ER2 M9B0H;6MF:6QE2 D*&EF("0H34%+14–1$=/
M04Q32PD0"D-"@T)"AF:6QT97(M;W5T(&%L;"P@)"A-04M%0TU$1T]!3%,I
M2!A;&PZ#0H))"AF;W)E86-H(&1I<BP@)"AF:7)S=&1I<BDL("0H;6%K96-M
M9"DI)"AF;W)E86-H(&1I<BP@)"AR97-T9&ER
2P@)"AS97 I("0H;6%K96-M
%9"DI#0H
end

Thank you. That gives my some ideas.

“Kevin Caporaso” <kcaporaso@pillardata.com> wrote in message
news:aghcrq$csa$1@nntp.qnx.com

Bill,
I have attached it for you.
I found it under QNX 6.2NC in /usr/include/



“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:aghc03$7t6$> 1@inn.qnx.com> …
In QNX4 I don’t have a /usr/include/recurse.mk file. Where should it
be?

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:aghbka$7nu$> 1@inn.qnx.com> …
My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is
in
a
makefile, not in a shell script. I just can’t seam to find the right
place
to test the return of the nested make and force an abort in the outer
make.

“Kris Warkentin” <> kewarken@qnx.com> > wrote in message
news:agh9o8$ah1$> 1@nntp.qnx.com> …
There may be better ways to do it but what I might try doing is
checking
the
return value of make within your script. If make fails, you just
exit
the
loop. The other option which you’ll find fairly educational is to
look
at
our recursive makefile stuff. Take a look at
/usr/include/recurse.mk
to
see
how it’s done. The O’Reilly Make book is really good too.

cheers,

Kris

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agfl61$rh6$> 1@inn.qnx.com> …
I have a makefile that looks something like this:


DIRS: x y z

all:
for DIR in ${DIRS} ; do ( cd $$DIR ; make ) ; done

If one of the nested makes fails I want this outer make to abort.
I
have
tried all kinds of gimicks but can’t seem to find the magic.

What is the trick to make this outer make abort if an inner make
fails?








\

I didn’t test this but something like this might do the trick. It seems to
me that make must invoke a shell to execute the commands under ‘all:’ so if
you caused that shell to exit with an error code, it should cause the make
to abort.

DIRS: x y z
all:
for DIR in ${DIRS} ; do ( cd $$DIR ; if ! make ; then exit 1 ; fi ) ;
done

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:aghbka$7nu$1@inn.qnx.com

My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is in a
makefile, not in a shell script. I just can’t seam to find the right
place
to test the return of the nested make and force an abort in the outer
make.

You should probably invoke make as $(MAKE) too, so that “make -n” will work.

dB

“Kris Warkentin” <kewarken@qnx.com> wrote in message
news:aghqhd$n5q$1@nntp.qnx.com

I didn’t test this but something like this might do the trick. It seems
to
me that make must invoke a shell to execute the commands under ‘all:’ so
if
you caused that shell to exit with an error code, it should cause the make
to abort.

DIRS: x y z
all:
for DIR in ${DIRS} ; do ( cd $$DIR ; if ! make ; then exit 1 ; fi ) ;
done

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:aghbka$7nu$> 1@inn.qnx.com> …
My makefile is fashioned after the PhAB makefiles.

The “for; do ; done” below is a shell script line I know. But it is in
a
makefile, not in a shell script. I just can’t seam to find the right
place
to test the return of the nested make and force an abort in the outer
make.

Hi Kris

Thanks for all of your help. You’ve gone way above and beyond with all your
help both here and through e-mail.

The QNX4 make lacks a few features that the RTP make has that made most of
the suggestions unusable. They did however all give me good ideas.

I wanted to post the final makefile that I’m using in case anyone else wants
to do this. Here it is:

DIRS := $(shell ls -D)

firstdir := $(firstword $(DIRS))
restdir := $(filter-out $(firstdir), $(DIRS))

ifneq ($(findstring k,$(MFLAGS)),)
sep := ;
else
sep := &&
endif

…PHONY: all
all:
cd $(firstdir) && $(MAKE) --no-print-directory $(MAKEFLAGS)
$(foreach dir, $(restdir), $(sep)
cd …/$(dir) && $(MAKE) --no-print-directory $(MAKEFLAGS) )

…PHONY: clean
clean:
cd $(firstdir) && $(MAKE) --no-print-directory $(MAKEFLAGS) clean
$(foreach dir, $(restdir), $(sep)
cd …/$(dir) && $(MAKE) --no-print-directory $(MAKEFLAGS) clean )

…PHONY: uncond
uncond: clean all

Looks like you went from zero to make expert in 60 seconds flat.

:wink:

Kris

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:agkk1j$nvr$1@inn.qnx.com

Hi Kris

Thanks for all of your help. You’ve gone way above and beyond with all
your
help both here and through e-mail.

The QNX4 make lacks a few features that the RTP make has that made most of
the suggestions unusable. They did however all give me good ideas.

I wanted to post the final makefile that I’m using in case anyone else
wants
to do this. Here it is:

DIRS := $(shell ls -D)

firstdir := $(firstword $(DIRS))
restdir := $(filter-out $(firstdir), $(DIRS))

ifneq ($(findstring k,$(MFLAGS)),)
sep := ;
else
sep := &&
endif

.PHONY: all
all:
cd $(firstdir) && $(MAKE) --no-print-directory $(MAKEFLAGS)
$(foreach dir, $(restdir), $(sep)
cd …/$(dir) && $(MAKE) --no-print-directory $(MAKEFLAGS) )

.PHONY: clean
clean:
cd $(firstdir) && $(MAKE) --no-print-directory $(MAKEFLAGS) clean
$(foreach dir, $(restdir), $(sep)
cd …/$(dir) && $(MAKE) --no-print-directory $(MAKEFLAGS) clean )

.PHONY: uncond
uncond: clean all

Well, thank you. But I like to think I didn’t start at zero. I had written
some pretty fancy makefiles in my time. I’ve posted some of them. I like
to write makefiles that don’t need to be updated ever as new modules are
added to a project.

So now I have four kinds of makefiles.

  1. makes all source files in a directory into a library
  2. makes all source files in a directory into a single executable
  3. makes all source files in a directory each into it’s own executable
  4. make files for parent directories

“Kris Warkentin” <kewarken@qnx.com> wrote in message
news:agkl5r$hf$1@nntp.qnx.com

Looks like you went from zero to make expert in 60 seconds flat.

:wink:

Kris

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:agkmjn$puu$1@inn.qnx.com

Well, thank you. But I like to think I didn’t start at zero. I had
written
some pretty fancy makefiles in my time. I’ve posted some of them. I like
to write makefiles that don’t need to be updated ever as new modules are
added to a project.

So now I have four kinds of makefiles.

  1. makes all source files in a directory into a library
  2. makes all source files in a directory into a single executable
  3. makes all source files in a directory each into it’s own executable
  4. make files for parent directories

I use the same makefile for both 1 and 2. The makefile checks for presence
of “exe” directory and/or “lib” directory

“Kris Warkentin” <> kewarken@qnx.com> > wrote in message
news:agkl5r$hf$> 1@nntp.qnx.com> …
Looks like you went from zero to make expert in 60 seconds flat.

:wink:

Kris

Ah! But my working bin and lib directories are not within the normal
directory structure. They are stored on a Hugh RAM disk for speed. An
‘install’ goal copies the files to hard drive directories.

“Mario Charest” postmaster@127.0.0.1 wrote in message
news:agkpn4$s9v$1@inn.qnx.com

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agkmjn$puu$> 1@inn.qnx.com> …

So now I have four kinds of makefiles.

  1. makes all source files in a directory into a library
  2. makes all source files in a directory into a single executable
  3. makes all source files in a directory each into it’s own executable
  4. make files for parent directories

I use the same makefile for both 1 and 2. The makefile checks for
presence
of “exe” directory and/or “lib” directory

“Bill Caroselli (Q-TPS)” <QTPS@EarthLink.net> wrote in message
news:agkqgo$sto$1@inn.qnx.com

Ah! But my working bin and lib directories are not within the normal
directory structure. They are stored on a Hugh RAM disk for speed. An
‘install’ goal copies the files to hard drive directories.

So what, just create dummy directory or even file to let the make
know what type to build of target to build. Where the target goes is
irrelevent.

Personnaly I’ve inspired myself from QNX common makefiles.
Creating directory x86/o will generate an executable.
Creating directory x86/a will generate a library
Creating directory x86/so will generate a share object
Creating directory x86/o.d will generate a debugged executable

For know I don’t support anything else then x86 cause that’s all I need :wink:
I one project I added support for qnx4/o, qnx4/a, … The same makefile
and source can be use for both QNX6 and QNX4.

“Mario Charest” postmaster@127.0.0.1 wrote in message
news:agkpn4$s9v$> 1@inn.qnx.com> …

“Bill Caroselli (Q-TPS)” <> QTPS@EarthLink.net> > wrote in message
news:agkmjn$puu$> 1@inn.qnx.com> …

So now I have four kinds of makefiles.

  1. makes all source files in a directory into a library
  2. makes all source files in a directory into a single executable
  3. makes all source files in a directory each into it’s own executable
  4. make files for parent directories

I use the same makefile for both 1 and 2. The makefile checks for
presence
of “exe” directory and/or “lib” directory