multiprocessing.eclass: Introduce get_nproc() to get no of CPUs
authorMichał Górny <mgorny@gentoo.org>
Tue, 13 Dec 2016 09:08:22 +0000 (10:08 +0100)
committerMichał Górny <mgorny@gentoo.org>
Sun, 18 Dec 2016 13:46:42 +0000 (14:46 +0100)
Introduce get_nproc(), a portable 'nproc' wrapper. It uses either
'nproc' or a fallback Python multiprocessing module call to attempt to
determine the number of available processing units.

This can be used e.g. to determine a safe number of jobs to run when
MAKEOPTS specifies unlimited --jobs and the build system in question
does not support --load-average.

eclass/multiprocessing.eclass

index 5a5fe9acb56ab55a602563c32a851e33573e1375..3c5dfff2d11c54d8aa78c3f68953e55c5f871af2 100644 (file)
@@ -53,6 +53,38 @@ bashpid() {
        sh -c 'echo ${PPID}'
 }
 
+# @FUNCTION: get_nproc
+# @USAGE: [${fallback:-1}]
+# @DESCRIPTION:
+# Attempt to figure out the number of processing units available.
+# If the value can not be determined, prints the provided fallback
+# instead. If no fallback is provided, defaults to 1.
+get_nproc() {
+       local nproc
+
+       # GNU
+       if type -P nproc &>/dev/null; then
+               nproc=$(nproc)
+       fi
+
+       # BSD
+       if [[ -z ${nproc} ]] && type -P sysctl &>/dev/null; then
+               nproc=$(sysctl -n hw.ncpu 2>/dev/null)
+       fi
+
+       # fallback to python2.6+
+       # note: this may fail (raise NotImplementedError)
+       if [[ -z ${nproc} ]] && type -P python &>/dev/null; then
+               nproc=$(python -c 'import multiprocessing; print(multiprocessing.cpu_count());' 2>/dev/null)
+       fi
+
+       if [[ -n ${nproc} ]]; then
+               echo "${nproc}"
+       else
+               echo "${1:-1}"
+       fi
+}
+
 # @FUNCTION: makeopts_jobs
 # @USAGE: [${MAKEOPTS}]
 # @DESCRIPTION: