multiprocessing.eclass: Introduce get_nproc() to get no of CPUs

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.
This commit is contained in:
Michał Górny
2016-12-13 10:08:22 +01:00
parent 639d76a02d
commit d9cde86b8e

View 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: