depend + all vs dependall

M. Warner Losh imp at bsdimp.com
Sat Mar 29 15:34:42 PST 2003


NetBSD created a dependall target some time ago.  This target does a
make depend and then a make all so they only have to traverse the tree
once for these two stages rather than twice.  The time of a buildworld
came up in a discussion recently and I thought I'd see how hard it
would be to do something similar in FreeBSD.  Here are my preliminary
results.

Machine: Dell Inspiron 8000, 256M RAM, P3-700
time make buildworld
(2:04:34 wall time, didn't save the actual output :-(.

Machine: Dual Athlon XP2000+ 1.5G RAM aac controller.

time make buildworld -j 8 -s

run 0: did the above to 'flush the caches/load the sources in ram'

Pre-change:

Run 1:
1941.458u 723.640s 32:23.67 137.1%      2747+2215k 1447+145802io 465pf+0w
Run 2:
1942.160u 729.972s 31:45.84 140.2%      2748+2212k 1423+145755io 465pf+0w

After Changes:

Run 1:
1922.767u 723.847s 30:48.64 143.1%      2785+2201k 1312+148256io 465pf+0w
Run 2:
1922.661u 725.477s 30:49.99 143.1%      2788+2201k 1378+148489io 465pf+0w

So it looks like it saves a little over a minute out of 32 (1925s
average vs 1849s average, or almost a 4% reduction) on my big build
box.

My only concern with the patches is that they might interact badly
with a bug I remember from the FreeBSD 1.1R days, but can't reproduce,
in make.  Once upon a time, 'make depend all' was different than 'make
depend && make all' because the .depend files weren't re-read after
the depend phase, but before the all phase, whereas two makes this
would be the case.  Since this change combines the two, I'm a little
worried about that.  Is that still a bug in FreeBSD's make?  It won't
matter for a pure, virgin tree, but might for incremental builds...

Comments?

Warner

http://perforce.freebsd.org/chv.cgi?CH=27577

Change 27577 by imp at imp_hammer on 2003/03/29 11:24:15

	create a new dependall target.
	# I don't know if the ancient bug about depend is fixed or not.

Affected files ...

.. //depot/user/imp/freebsd-imp/Makefile#14 edit
.. //depot/user/imp/freebsd-imp/Makefile.inc1#18 edit
.. //depot/user/imp/freebsd-imp/share/mk/bsd.README#3 edit
.. //depot/user/imp/freebsd-imp/share/mk/bsd.dep.mk#3 edit
.. //depot/user/imp/freebsd-imp/share/mk/bsd.subdir.mk#2 edit

Differences ...

==== //depot/user/imp/freebsd-imp/Makefile#14 (text+ko) ====

@@ -89,8 +89,8 @@
 # order, but that's not important.
 #
 TGTS=	all all-man buildkernel buildtools buildworld checkdpadd clean \
-	cleandepend cleandir depend distribute distributeworld everything \
-	hierarchy install installcheck installkernel \
+	cleandepend cleandir depend dependall distribute distributeworld \
+	everything hierarchy install installcheck installkernel \
 	reinstallkernel installmost installworld libraries lint maninstall \
 	mk most obj objlink regress rerelease tags update
 
@@ -189,8 +189,7 @@
 	@echo "--------------------------------------------------------------"
 	@cd ${.CURDIR}/usr.bin/make; \
 		${MMAKE} obj && \
-		${MMAKE} depend && \
-		${MMAKE} all && \
+		${MMAKE} dependall && \
 		${MMAKE} install DESTDIR=${MAKEPATH} BINDIR=
 
 #

==== //depot/user/imp/freebsd-imp/Makefile.inc1#18 (text+ko) ====

@@ -32,7 +32,7 @@
 #
 # Standard targets (not defined here) are documented in the makefiles in
 # /usr/share/mk.  These include:
-#		obj depend all install clean cleandepend cleanobj
+#		obj depend dependall all install clean cleandepend cleanobj
 
 # Put initial settings here.
 SUBDIR=
@@ -319,18 +319,12 @@
 	@echo ">>> stage 4: building libraries"
 	@echo "--------------------------------------------------------------"
 	cd ${.CURDIR}; ${WMAKE} -DNOHTML -DNOINFO -DNOMAN -DNOFSCHG libraries
-_depend:
-	@echo
-	@echo "--------------------------------------------------------------"
-	@echo ">>> stage 4: make dependencies"
-	@echo "--------------------------------------------------------------"
-	cd ${.CURDIR}; ${WMAKE} par-depend
 everything:
 	@echo
 	@echo "--------------------------------------------------------------"
 	@echo ">>> stage 4: building everything.."
 	@echo "--------------------------------------------------------------"
-	cd ${.CURDIR}; ${WMAKE} all
+	cd ${.CURDIR}; ${WMAKE} dependall
 
 
 WMAKE_TOOL_TGTS=
@@ -341,7 +335,7 @@
 .if !defined(SUBDIR_OVERRIDE)
 WMAKE_TOOL_TGTS+=	_cross-tools
 .endif
-WMAKE_TGTS=	${WMAKE_TOOL_TGTS} _includes _libraries _depend everything
+WMAKE_TGTS=	${WMAKE_TOOL_TGTS} _includes _libraries everything
 
 buildworld: ${WMAKE_TGTS}
 .ORDER: ${WMAKE_TGTS}
@@ -501,7 +495,7 @@
 	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} obj
 # XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case.
 .if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KRNLSRCDIR}/modules)
-.for target in obj depend all
+.for target in obj dependall
 	cd ${.CURDIR}/sys/modules/aic7xxx/aicasm; \
 	    MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \
 	    ${MAKE} -DNO_CPU_CFLAGS ${target}
@@ -509,10 +503,11 @@
 .endif
 .if !defined(NO_KERNELDEPEND)
 	cd ${KRNLOBJDIR}/${_kernel}; \
-	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} depend -DNO_MODULES_OBJ
-.endif
+	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} dependall -DNO_MODULES_OBJ
+.else
 	cd ${KRNLOBJDIR}/${_kernel}; \
 	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} all -DNO_MODULES_OBJ
+.endif
 	@echo "--------------------------------------------------------------"
 	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
 	@echo "--------------------------------------------------------------"
@@ -620,8 +615,7 @@
 	${ECHODIR} "===> ${_tool}"; \
 		cd ${.CURDIR}/${_tool}; \
 		${MAKE} DIRPRFX=${_tool}/ obj; \
-		${MAKE} DIRPRFX=${_tool}/ depend; \
-		${MAKE} DIRPRFX=${_tool}/ all; \
+		${MAKE} DIRPRFX=${_tool}/ dependall; \
 		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
 .endfor
 
@@ -681,8 +675,7 @@
 	${ECHODIR} "===> ${_tool}"; \
 		cd ${.CURDIR}/${_tool}; \
 		${MAKE} DIRPRFX=${_tool}/ obj; \
-		${MAKE} DIRPRFX=${_tool}/ depend; \
-		${MAKE} DIRPRFX=${_tool}/ all; \
+		${MAKE} DIRPRFX=${_tool}/ dependall; \
 		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
 .endfor
 
@@ -762,8 +755,7 @@
 .if exists(${.CURDIR}/${_lib})
 	${ECHODIR} "===> ${_lib}"; \
 		cd ${.CURDIR}/${_lib}; \
-		${MAKE} DIRPRFX=${_lib}/ depend; \
-		${MAKE} DIRPRFX=${_lib}/ all; \
+		${MAKE} DIRPRFX=${_lib}/ dependall; \
 		${MAKE} DIRPRFX=${_lib}/ install
 .endif
 .endfor
@@ -782,7 +774,7 @@
 _prebuild_libs: ${_prebuild_libs:S/$/__L/}
 _generic_libs: ${_generic_libs:S/$/__L/}
 
-.for __target in clean cleandepend cleandir depend includes obj
+.for __target in clean cleandepend cleandir depend dependall includes obj
 .for entry in ${SUBDIR}
 ${entry}.${__target}__D: .PHONY
 	@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \

==== //depot/user/imp/freebsd-imp/share/mk/bsd.README#3 (text+ko) ====

@@ -169,6 +169,8 @@
 	depend:
 		make the dependencies for the source files, and store
 		them in the file .depend.
+	dependall:
+		make depend then make all
 	install:
 		install the program and its manual pages; if the Makefile
 		does not itself define the target install, the targets

==== //depot/user/imp/freebsd-imp/share/mk/bsd.dep.mk#3 (text+ko) ====

@@ -31,6 +31,9 @@
 #		Make the dependencies for the source files, and store
 #		them in the file ${DEPENDFILE}.
 #
+#	dependall:
+#		make depend and then all
+#
 #	tags:
 #		In "ctags" mode, create a tags file for the source files.
 #		In "gtags" mode, create a (GLOBAL) gtags file for the
@@ -183,3 +186,7 @@
 		echo "LDADD -> $$ldadd1" ; \
 	fi
 .endif
+
+.PHONY: dependall
+.ORDER: afterdepend all
+dependall: depend all

==== //depot/user/imp/freebsd-imp/share/mk/bsd.subdir.mk#2 (text+ko) ====

@@ -25,8 +25,8 @@
 # 		put the stuff into the right "distribution".
 #
 #	afterinstall, all, all-man, beforeinstall, checkdpadd,
-#	clean, cleandepend, cleandir, depend, install, lint, maninstall,
-#	obj, objlink, realinstall, regress, tags
+#	clean, cleandepend, cleandir, depend, dependall, install, lint,
+#	maninstall, obj, objlink, realinstall, regress, tags
 #
 
 .include <bsd.init.mk>
@@ -67,7 +67,7 @@
 
 
 .for __target in all all-man checkdpadd clean cleandepend cleandir \
-    depend distribute lint maninstall \
+    depend dependall distribute lint maninstall \
     obj objlink realinstall regress tags
 ${__target}: _SUBDIR
 .endfor




More information about the freebsd-arch mailing list