bde> (In the above example, the targets are built concurrently and race
bde> each other.  This is bad when the `all' target wins the race.  The
bde> `obj' target runs faster, so it usually wins the race except in the
bde> first directory (3dfx)).  More .ORDER statements in *.mk are required.

Thank you for giving us a details of this problem. But can we fix this
problem with .ORDER statements? Putting ".ORDER: obj all" or alike to
Makefile doesn't fix to me (maybe I misunderstand the usage of .ORDER
statement)...

bde> `&&' should never be used in shell commands in makefiles, although it
bde> may be only a bad example.  This is because multiple commands are
bde> executed in the same shell in the -j case, and `&&' gives non-simple
bde> commands which may defeat the shell's -e setting.

What should we do if we want to check the existence of a directory and
kick one (not two or more) command after chdir to that directory? Much
Makefiles in our FreeBSD repository employ "cd ${dir} && command" to
do this... Should we say

        if [ -d ${dir} ]; then \
                (cd ${dir}; command) \
        else
                false
        fi      

or exist() directive of make(1) ?

***

Anyway, attached below is current sample patch to fix this problem.
"make obj" and "make all" are separated to two individual commands
(redundant 'cd' clause, but it should work).

-- -
Makoto `MAR' MATSUSHITA

Index: Makefile
===================================================================
RCS file: /lab/FreeBSD/FreeBSD.cvs/src/release/Makefile,v
retrieving revision 1.585
diff -c -r1.585 Makefile
*** Makefile    2000/11/12 11:04:11     1.585
--- Makefile    2000/11/13 05:37:12
***************
*** 831,837 ****
        @rm -f ${RD}/kernels/*.ko
        @cd ${.CURDIR}/../sys/${MACHINE}/conf && config ${KERNEL}
        @cd ${.CURDIR}/../sys/compile/${KERNEL} && \
!                       make kernel-depend && \
                        make ${KERNEL_FLAGS} modules && \
                        make modules-reinstall DESTDIR=${RD}/kernels && \
  
--- 831,837 ----
        @rm -f ${RD}/kernels/*.ko
        @cd ${.CURDIR}/../sys/${MACHINE}/conf && config ${KERNEL}
        @cd ${.CURDIR}/../sys/compile/${KERNEL} && \
!                       make modules-depend && \
                        make ${KERNEL_FLAGS} modules && \
                        make modules-reinstall DESTDIR=${RD}/kernels && \
  
Index: Makefile.alpha
===================================================================
RCS file: /lab/FreeBSD/FreeBSD.cvs/src/sys/conf/Makefile.alpha,v
retrieving revision 1.79
diff -c -r1.79 Makefile.alpha
*** Makefile.alpha      2000/10/29 09:47:50     1.79
--- Makefile.alpha      2000/11/13 10:09:34
***************
*** 310,320 ****
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
--- 310,322 ----
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
Index: Makefile.i386
===================================================================
RCS file: /lab/FreeBSD/FreeBSD.cvs/src/sys/conf/Makefile.i386,v
retrieving revision 1.212
diff -c -r1.212 Makefile.i386
*** Makefile.i386       2000/10/29 09:47:50     1.212
--- Makefile.i386       2000/11/13 10:10:03
***************
*** 271,281 ****
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
--- 271,283 ----
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
Index: Makefile.ia64
===================================================================
RCS file: /lab/FreeBSD/FreeBSD.cvs/src/sys/conf/Makefile.ia64,v
retrieving revision 1.4
diff -c -r1.4 Makefile.ia64
*** Makefile.ia64       2000/10/29 09:47:50     1.4
--- Makefile.ia64       2000/11/13 10:10:41
***************
*** 275,285 ****
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
--- 275,287 ----
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
Index: Makefile.pc98
===================================================================
RCS file: /lab/FreeBSD/FreeBSD.cvs/src/sys/conf/Makefile.pc98,v
retrieving revision 1.110
diff -c -r1.110 Makefile.pc98
*** Makefile.pc98       2000/11/05 14:31:17     1.110
--- Makefile.pc98       2000/11/13 10:11:03
***************
*** 274,284 ****
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean
--- 274,286 ----
  
  modules:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} all
  
  modules-depend:
        @mkdir -p ${.OBJDIR}/modules
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} obj
!       cd $S/modules && env ${MKMODULESENV} ${MAKE} depend
  
  modules-clean:
        cd $S/modules && env ${MKMODULESENV} ${MAKE} clean


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to