Author: dim
Date: Wed Mar 26 22:30:38 2014
New Revision: 263778
URL: http://svnweb.freebsd.org/changeset/base/263778

Log:
  Add a SUBDIR_PARALLEL option to bsd.subdir.mk, to allow make to process
  all the SUBDIR entries in parallel, instead of serially.  Apply this
  option to a selected number of Makefiles, which can greatly speed up the
  build on multi-core machines, when using make -j.
  
  This can be extended to more Makefiles later on, whenever they are
  verified to work correctly with parallel building.
  
  I tested this on a 24-core machine, with make -j48 buildworld (N = 6):
  
                  before    stddev       after    stddev
                  =======   ======       =======  ======
  real time        1741.1     16.5         959.8     2.7
  user time       12468.7     16.4       14393.0    16.8
  sys  time        1825.0     54.8        2110.6    22.8
  
  (user+sys)/real     8.2                   17.1
  
  E.g. the build was approximately 45% faster in real time.  On machines
  with less cores, or with lower -j settings, the speedup will not be as
  impressive.  But at least you can now almost max out a machine with
  buildworld!
  
  Submitted by: jilles
  MFC after:    2 weeks

Modified:
  head/bin/Makefile
  head/lib/Makefile
  head/lib/clang/Makefile
  head/sbin/Makefile
  head/share/mk/bsd.subdir.mk
  head/usr.bin/Makefile
  head/usr.sbin/Makefile

Modified: head/bin/Makefile
==============================================================================
--- head/bin/Makefile   Wed Mar 26 20:43:40 2014        (r263777)
+++ head/bin/Makefile   Wed Mar 26 22:30:38 2014        (r263778)
@@ -60,4 +60,6 @@ SUBDIR+=      tests
 
 SUBDIR:=       ${SUBDIR:O}
 
+SUBDIR_PARALLEL=
+
 .include <bsd.subdir.mk>

Modified: head/lib/Makefile
==============================================================================
--- head/lib/Makefile   Wed Mar 26 20:43:40 2014        (r263777)
+++ head/lib/Makefile   Wed Mar 26 22:30:38 2014        (r263778)
@@ -276,4 +276,8 @@ afterinstall:
        ${INSTALL_SYMLINK} ../include ${DESTDIR}/usr/lib/include
 .endif
 
+.if !make(install)
+SUBDIR_PARALLEL=
+.endif
+
 .include <bsd.subdir.mk>

Modified: head/lib/clang/Makefile
==============================================================================
--- head/lib/clang/Makefile     Wed Mar 26 20:43:40 2014        (r263777)
+++ head/lib/clang/Makefile     Wed Mar 26 22:30:38 2014        (r263778)
@@ -147,4 +147,6 @@ SUBDIR+=liblldb \
 
 SUBDIR+= include
 
+SUBDIR_PARALLEL=
+
 .include <bsd.subdir.mk>

Modified: head/sbin/Makefile
==============================================================================
--- head/sbin/Makefile  Wed Mar 26 20:43:40 2014        (r263777)
+++ head/sbin/Makefile  Wed Mar 26 22:30:38 2014        (r263778)
@@ -126,4 +126,6 @@ SUBDIR+=    tests
 
 SUBDIR:=       ${SUBDIR:O}
 
+SUBDIR_PARALLEL=
+
 .include <bsd.subdir.mk>

Modified: head/share/mk/bsd.subdir.mk
==============================================================================
--- head/share/mk/bsd.subdir.mk Wed Mar 26 20:43:40 2014        (r263777)
+++ head/share/mk/bsd.subdir.mk Wed Mar 26 22:30:38 2014        (r263778)
@@ -71,7 +71,26 @@ ${SUBDIR}: .PHONY .MAKE
 .for __target in all all-man checkdpadd clean cleandepend cleandir \
     cleanilinks depend distribute lint maninstall manlint obj objlink \
     realinstall regress tags ${SUBDIR_TARGETS}
+.ifdef SUBDIR_PARALLEL
+.for __dir in ${SUBDIR}
+${__target}: ${__target}_subdir_${__dir}
+${__target}_subdir_${__dir}: .MAKE
+       @${_+_}set -e; \
+               if test -d ${.CURDIR}/${__dir}.${MACHINE_ARCH}; then \
+                       ${ECHODIR} "===> ${DIRPRFX}${__dir}.${MACHINE_ARCH} 
(${__target:realinstall=install})"; \
+                       edir=${__dir}.${MACHINE_ARCH}; \
+                       cd ${.CURDIR}/$${edir}; \
+               else \
+                       ${ECHODIR} "===> ${DIRPRFX}${__dir} 
(${__target:realinstall=install})"; \
+                       edir=${__dir}; \
+                       cd ${.CURDIR}/$${edir}; \
+               fi; \
+               ${MAKE} ${__target:realinstall=install} \
+                   DIRPRFX=${DIRPRFX}$$edir/
+.endfor
+.else
 ${__target}: _SUBDIR
+.endif
 .endfor
 
 .for __target in files includes

Modified: head/usr.bin/Makefile
==============================================================================
--- head/usr.bin/Makefile       Wed Mar 26 20:43:40 2014        (r263777)
+++ head/usr.bin/Makefile       Wed Mar 26 22:30:38 2014        (r263778)
@@ -379,4 +379,6 @@ SUBDIR+=    svn
 
 SUBDIR:=       ${SUBDIR:O}
 
+SUBDIR_PARALLEL=
+
 .include <bsd.subdir.mk>

Modified: head/usr.sbin/Makefile
==============================================================================
--- head/usr.sbin/Makefile      Wed Mar 26 20:43:40 2014        (r263777)
+++ head/usr.sbin/Makefile      Wed Mar 26 22:30:38 2014        (r263778)
@@ -320,4 +320,6 @@ SUBDIR+=    wpa
 
 SUBDIR:=       ${SUBDIR:O}
 
+SUBDIR_PARALLEL=
+
 .include <bsd.subdir.mk>
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to