[PATCH 2/2] Add option to run bootstrap in parallel

Martin Erik Werner martinerikwerner at gmail.com
Fri Feb 19 13:07:26 UTC 2016


Using the -t|--threads <n> option, it is now possible to specify the
amount of threads to use when running autoreconf, for example:

  $ bootstrap -t 5

Since each file is autoreconf'd individually, this should not cause any
sequencing issues.

This reduces bootstrap runtime to about a half when using 5 threads on a
dual-core machine.
---
 bootstrap | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/bootstrap b/bootstrap
index 3434e51..00457ff 100755
--- a/bootstrap
+++ b/bootstrap
@@ -18,6 +18,7 @@ quiet="false"
 mode="autoreconf"
 force=0
 bsp_to_build=
+threads=1
 
 usage()
 {
@@ -29,6 +30,7 @@ usage()
   echo "	-h .. display this message and exit"
   echo "	-p .. regenerate preinstall.am files"
   echo "	-o <arch> .. only generate for given <arch>"
+  echo "	-t <n> .. use <n> threads to run autoreconf in parallel"
   echo "	-q .. quiet, don't display directories"
   echo "	-v .. verbose, pass -v to autotools"
   echo
@@ -101,6 +103,11 @@ case $1 in
   bsp_to_build=$2
   shift
   shift;;
+-t|--th|--thr|--thre|--thread|--threads)
+  test $# -gt 1 || usage
+  threads=$2
+  shift
+  shift;;
 -*) echo "unknown option $1"
   usage ;;
 *) echo "invalid parameter $1"
@@ -220,6 +227,11 @@ autoreconf)
   fi
 
   confs=`find . -name 'configure.ac' -print`
+  if test "$threads" -gt 1; then
+    # Since jobs can't be called from a subshell, use a tempfile to store output
+    trap 'rm -f "$jobs_tempfile"' EXIT
+    jobs_tempfile=$(mktemp)
+  fi
   for i in $confs; do
   if test -n "$bsp_to_build"; then
     case $i in
@@ -246,8 +258,21 @@ autoreconf)
     ${AUTORECONF} -i --no-recursive $verbose
     test -f Makefile.am && test -n "`grep 'stamp-h\.in' Makefile.in`" \
       && echo timestamp > stamp-h.in
-  )
+  ) &
+  if test "$threads" -gt 1; then
+    # Wait for amount of threads to drop below max
+    jobs >"$jobs_tempfile"
+    while test "$(wc -l "$jobs_tempfile")" -ge "$threads"; do
+      sleep 1
+      jobs >"$jobs_tempfile"
+    done
+    rm -f "$jobs_tempfile"
+    trap - EXIT
+  else
+    wait
+  fi
   done
+  wait
   ;;
 
 clean)
-- 
1.9.1



More information about the devel mailing list