commit:     844eece34638a7b93a55d610d32254504bd2be63
Author:     Florian Schmaus <flow <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 24 18:54:46 2023 +0000
Commit:     Florian Schmaus <flow <AT> gentoo <DOT> org>
CommitDate: Mon Oct  9 10:54:06 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=844eece3

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 <AT> gentoo.org>

 eclass/multiprocessing.eclass                 | 38 +++++++++++++++++++++++----
 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
 

Reply via email to