diff options
author | Florian Schmaus <flow@gentoo.org> | 2023-07-24 20:54:46 +0200 |
---|---|---|
committer | Florian Schmaus <flow@gentoo.org> | 2023-10-09 12:54:06 +0200 |
commit | 844eece34638a7b93a55d610d32254504bd2be63 (patch) | |
tree | 0d71ad5ba0abc40ab7574df6bdfb0d80d9c110e6 /eclass | |
parent | net-p2p/bitcoin-core-25.0: introduce combined package (diff) | |
download | gentoo-844eece34638a7b93a55d610d32254504bd2be63.tar.gz gentoo-844eece34638a7b93a55d610d32254504bd2be63.tar.bz2 gentoo-844eece34638a7b93a55d610d32254504bd2be63.zip |
multiprocessing.eclass: consider (GNU)MAKEFLAGS, add get_makeopts_{jobs,loadavg}
Since --load-average may not be found in other Make implementations
besides GNU Make, it is potentially found in GNUMAKEFLAGS and not in
MAKEOPTS.
Also, Portage is probably soon setting --load-average in GNUMAKEFLAGS as
default.
Thanks to floppym and mgorny for feedback.
Signed-off-by: Florian Schmaus <flow@gentoo.org>
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/multiprocessing.eclass | 38 | ||||
-rwxr-xr-x | eclass/tests/multiprocessing_makeopts_jobs.sh | 24 |
2 files changed, 55 insertions, 7 deletions
diff --git a/eclass/multiprocessing.eclass b/eclass/multiprocessing.eclass index e55be636a02c..13d6a92f2f2e 100644 --- a/eclass/multiprocessing.eclass +++ b/eclass/multiprocessing.eclass @@ -1,4 +1,4 @@ -# Copyright 1999-2022 Gentoo Authors +# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: multiprocessing.eclass @@ -64,17 +64,35 @@ get_nproc() { fi } +# @FUNCTION: _get_all_makeopts +# @INTERNAL +# @DESCRIPTION: +# Returns ${MAKEOPTS} ${GNUMAKEFLAGS} ${MAKEFLAGS}. +_get_all_makeopts() { + echo "${MAKEOPTS} ${GNUMAKEFLAGS} ${MAKEFLAGS}" +} + +# @FUNCTION: get_makeopts_jobs +# @USAGE: [default-jobs] +# @DESCRIPTION: +# Return the number of jobs extracted from the make options (MAKEOPTS, +# GNUMAKEFLAGS, MAKEFLAGS). If the make options do not specify a number, +# then either the provided default is returned, or 1. +get_makeopts_jobs() { + makeopts_jobs "$(_get_all_makeopts)" "${1:-1}" +} + # @FUNCTION: makeopts_jobs # @USAGE: [${MAKEOPTS}] [${inf:-$(( $(get_nproc) + 1 ))}] # @DESCRIPTION: -# Searches the arguments (defaults to ${MAKEOPTS}) and extracts the jobs number +# Searches the arguments (or sensible defaults) and extracts the jobs number # specified therein. Useful for running non-make tools in parallel too. # i.e. if the user has MAKEOPTS=-j9, this will echo "9" -- we can't return the # number as bash normalizes it to [0, 255]. If the flags haven't specified a # -j flag, then "1" is shown as that is the default `make` uses. If the flags # specify -j without a number, ${inf} is returned (defaults to nproc). makeopts_jobs() { - [[ $# -eq 0 ]] && set -- "${MAKEOPTS}" + [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)" # This assumes the first .* will be more greedy than the second .* # since POSIX doesn't specify a non-greedy match (i.e. ".*?"). local jobs=$(echo " $* " | sed -r -n \ @@ -83,10 +101,20 @@ makeopts_jobs() { echo ${jobs:-1} } +# @FUNCTION: get_makeopts_loadavg +# @USAGE: [default-loadavg] +# @DESCRIPTION: +# Return the value for the load-average extracted from the make options (MAKEOPTS, +# GNUMAKEFLAGS, MAKEFLAGS). If the make options do not specify a value, then +# either the optional provided default is returned, or 999. +get_makeopts_loadavg() { + makeopts_loadavg "$(_get_all_makeopts)" "${1:-999}" +} + # @FUNCTION: makeopts_loadavg # @USAGE: [${MAKEOPTS}] [${inf:-999}] # @DESCRIPTION: -# Searches the arguments (defaults to ${MAKEOPTS}) and extracts the value set +# Searches the arguments (or sensible defaults) and extracts the value set # for load-average. For make and ninja based builds this will mean new jobs are # not only limited by the jobs-value, but also by the current load - which might # get excessive due to I/O and not just due to CPU load. @@ -95,7 +123,7 @@ makeopts_jobs() { # If no limit is specified or --load-average is used without a number, ${inf} # (defaults to 999) is returned. makeopts_loadavg() { - [[ $# -eq 0 ]] && set -- "${MAKEOPTS}" + [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)" # This assumes the first .* will be more greedy than the second .* # since POSIX doesn't specify a non-greedy match (i.e. ".*?"). local lavg=$(echo " $* " | sed -r -n \ diff --git a/eclass/tests/multiprocessing_makeopts_jobs.sh b/eclass/tests/multiprocessing_makeopts_jobs.sh index 37d5a7257775..56d73ef48b3c 100755 --- a/eclass/tests/multiprocessing_makeopts_jobs.sh +++ b/eclass/tests/multiprocessing_makeopts_jobs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 1999-2021 Gentoo Authors +# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=7 @@ -9,7 +9,13 @@ inherit multiprocessing test-makeopts_jobs() { local exp=$1; shift - tbegin "makeopts_jobs($1${2+; inf=${2}}) == ${exp}" + local targs + if [[ -v 1 ]]; then + targs="$1${2+; inf=${2}}" + else + targs="MAKEOPTS=\"${MAKEOPTS}\" GNUMAKEFLAGS=\"${GNUMAKEFLAGS}\" MAKEFLAGS=\"${MAKEFLAGS}\"" + fi + tbegin "makeopts_jobs(${targs}) == ${exp}" local indirect=$(MAKEOPTS="$*" makeopts_jobs) local direct=$(makeopts_jobs "$@") if [[ "${direct}" != "${indirect}" ]] ; then @@ -50,6 +56,20 @@ for (( i = 0; i < ${#tests[@]}; i += 2 )) ; do test-makeopts_jobs "${tests[i]}" "${tests[i+1]}" done +tests=( + 7 "" "--jobs 7" "" + # MAKEFLAGS override GNUMAKEFLAGS + 8 "" "--jobs 7" "--jobs 8" +) + +for (( i = 0; i < ${#tests[@]}; i += 4 )) ; do + MAKEOPTS="${tests[i+1]}" + GNUMAKEFLAGS="${tests[i+2]}" + MAKEFLAGS="${tests[i+3]}" + test-makeopts_jobs "${tests[i]}" + unset MAKEOPTS GNUMAKEFLAGS MAKEFLAGS +done + # test custom inf value test-makeopts_jobs 645 "-j" 645 |