From owner-freebsd-current Sat Aug 16 23:18:18 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id XAA09953 for current-outgoing; Sat, 16 Aug 1997 23:18:18 -0700 (PDT) Received: from gw.itfs.nsk.su (gw.itfs.nsk.su [193.124.36.33]) by hub.freebsd.org (8.8.5/8.8.5) with SMTP id XAA09945 for ; Sat, 16 Aug 1997 23:18:11 -0700 (PDT) Received: from itfs.UUCP (root@localhost) by gw.itfs.nsk.su (8.6.12/8.6.12) with UUCP id NAA26775 for current@freebsd.org; Sun, 17 Aug 1997 13:18:07 +0700 Received: by itfs.nsk.su; Sun, 17 Aug 97 13:18:31 +0700 (NST) Received: (from daemon@localhost) by news.itfs.nsk.su (8.7.5/8.6.12) id NAA09497; Sun, 17 Aug 1997 13:15:26 +0700 (NSD) From: nnd@itfs.nsk.su To: current@freebsd.org Subject: Re: Make and SMP - what can be done ? Date: 17 Aug 1997 06:15:24 GMT Message-ID: <5t64ts$7ae@news.itfs.nsk.su> References: <199708130432.VAA06415@silvia.HIP.Berkeley.EDU> Sender: owner-freebsd-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Here is a report of my experiments in "parallel" world making. Let's start from the end ;-) 1) This was done with standard /usr/src/Makefile # time make buildworld >& bw1.out 10842.7u 5987.9s 4:31:58.43 103.1% 360+502k 36885+26932io 2133pf+0w ^^^^^^^^^^^^^^^^^ 2) And this was done with my patches to /usr/src/bin/make, /usr/src/Makefile and /usr/src/games/boggle/Makefile (see below) # time make -dmj -j12 buildworld >& bwj.out 11880.6u 5732.4s 3:10:37.60 153.9% 454+556k 38401+44577io 2254pf+0w ^^^^^^^^^^^^^^^^^ Both makes was on the same system (FreeBSD-3.0 as of 970808, SMP kernel on two P-133 Gateway GA-586DX m/b with 128M EDO memory and /usr/{src,obj} both on ccd0 (two IBM DORS-32160W)). What have I done ? Current buildworld structure is not very suitable for "parallel" making ;-( especially in "make depend" and "make all install ..." cases. So I take an easy path to avoid "parallelism" in this steps while using it in "make all" parts. 1) I've patched /usr/bin/make in such a way that -B flag (compatible mode) will be propagated to "nested" make's (see make.patch below); 2) I've change /usr/src/Makefile so that all 'depend' parts was done in "compatible mode" and all 'all install clean cleandepend' parts splits to 'all' (which can be made "in parallel") and 'install clean cleandepend' which again was done in "compatible mode" (see Makefile.patch below); 3) I've patched /usr/src/games/boggle/Makefile which leads to error in 'make -j12 all" case and is incorrect independently of any "parallell making" (see my PR bin/4314 for this). If you use SMP FreeBSD and build world often you can try to speed-up this task in ~1.49 times :-). After that you can speend some time on Makefile's and mk-files studying and make FreeBSD's buildworld structure fully "parallel"-safe ! ;-) N.Dudorov make.patch================================================= diff -ruN src/usr.bin/make/main.c src/usr.bin/make-patched/main.c --- src/usr.bin/make/main.c Fri Aug 15 17:59:11 1997 +++ src/usr.bin/make-patched/main.c Fri Aug 15 18:07:14 1997 @@ -190,6 +190,7 @@ break; case 'B': compatMake = TRUE; + Var_Append(MAKEFLAGS, "-B", VAR_GLOBAL); break; #ifdef REMOTE case 'L': Makefile.patch============================================= --- src/Makefile Sat Aug 16 20:17:41 1997 +++ src/Makefile.MY Sat Aug 16 20:17:34 1997 @@ -216,8 +216,9 @@ @echo "--------------------------------------------------------------" mkdir -p ${WORLDTMP}/usr/bin cd ${.CURDIR}/usr.bin/make && \ - ${IBMAKE} -I${.CURDIR}/share/mk ${OBJDIR} clean cleandepend depend && \ - ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} all install clean cleandepend + ${IBMAKE} -I${.CURDIR}/share/mk ${OBJDIR} -B clean cleandepend depend && \ + ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} all && \ + ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} -B install clean cleandepend @echo @echo "--------------------------------------------------------------" @echo " Making hierarchy" @@ -251,7 +252,7 @@ @echo "--------------------------------------------------------------" @echo " Rebuilding /usr/include" @echo "--------------------------------------------------------------" - cd ${.CURDIR} && ${BMAKE} includes + cd ${.CURDIR} && ${BMAKE} -B includes @echo @echo "--------------------------------------------------------------" @echo " Rebuilding tools needed to build the libraries" @@ -271,7 +272,7 @@ @echo "--------------------------------------------------------------" @echo " Rebuilding dependencies" @echo "--------------------------------------------------------------" - cd ${.CURDIR} && ${XMAKE} depend + cd ${.CURDIR} && ${XMAKE} -B depend @echo @echo "--------------------------------------------------------------" @echo " Building everything.." @@ -413,12 +414,15 @@ cd ${.CURDIR}/include && find -dx . | cpio -dump ${DESTDIR}/usr/include cd ${.CURDIR}/include && make symlinks .endif - cd ${.CURDIR}/usr.bin/make && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} - cd ${.CURDIR}/usr.bin/xinstall && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} - cd ${.CURDIR}/usr.bin/lex && ${MAKE} bootstrap && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} -DNOLIB all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/make && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/xinstall && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/lex && ${MAKE} bootstrap && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} -DNOLIB all && \ + ${MAKE} ${MK_FLAGS} -DNOLIB -B install ${CLEANDIR} ${OBJDIR} # # include-tools - generally the same as 'bootstrap', except that it's for @@ -429,8 +433,9 @@ # on cleaned away headers in ${WORLDTMP}. # include-tools: - cd ${.CURDIR}/usr.bin/rpcgen && ${MAKE} cleandepend depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/rpcgen && ${MAKE} -B cleandepend depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} # # includes - possibly generate and install the include files. @@ -499,8 +504,9 @@ usr.bin/nm \ usr.bin/ranlib \ usr.bin/uudecode - cd ${.CURDIR}/$d && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/$d && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endfor # @@ -508,44 +514,54 @@ # libraries: .if exists(lib/csu/i386) - cd ${.CURDIR}/lib/csu/i386 && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/lib/csu/i386 && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(lib/libcompat) - cd ${.CURDIR}/lib/libcompat && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/lib/libcompat && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(lib/libncurses) - cd ${.CURDIR}/lib/libncurses && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/lib/libncurses && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(lib/libtermcap) - cd ${.CURDIR}/lib/libtermcap && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/lib/libtermcap && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(gnu) - cd ${.CURDIR}/gnu/lib && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/gnu/lib && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(secure) && !defined(NOCRYPT) && !defined(NOSECURE) - cd ${.CURDIR}/secure/lib && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/secure/lib && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(lib) - cd ${.CURDIR}/lib && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/lib && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(usr.bin/lex/lib) - cd ${.CURDIR}/usr.bin/lex/lib && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/lex/lib && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(eBones) && !defined(NOCRYPT) && defined(MAKE_EBONES) - cd ${.CURDIR}/eBones/lib && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/eBones/lib && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif .if exists(usr.sbin/pcvt/keycap) - cd ${.CURDIR}/usr.sbin/pcvt/keycap && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.sbin/pcvt/keycap && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endif # @@ -615,8 +631,9 @@ usr.sbin/chown \ usr.sbin/mtree \ usr.sbin/zic - cd ${.CURDIR}/$d && ${MAKE} depend && \ - ${MAKE} ${MK_FLAGS} all install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/$d && ${MAKE} -B depend && \ + ${MAKE} ${MK_FLAGS} all && \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} .endfor .include