Module Name: src
Committed By: sjg
Date: Sat Sep 9 01:30:59 UTC 2023
Modified Files:
src/usr.bin/make: main.c make.1
src/usr.bin/make/unit-tests: varname-dot-make-jobs.exp
varname-dot-make-jobs.mk
Log Message:
make: allow -j to compute a multiple of ncpu
If _SC_NPROCESSORS_ONLN is supported; and -j arg is a floating point
number or ends in 'C' compute .MAKE.JOBS as a multiple of _SC_NPROCESSORS_ONLN
Based on a suggestion from des at freebsd.org
Discussed with: rillig, christos
To generate a diff of this commit:
cvs rdiff -u -r1.593 -r1.594 src/usr.bin/make/main.c
cvs rdiff -u -r1.368 -r1.369 src/usr.bin/make/make.1
cvs rdiff -u -r1.2 -r1.3 \
src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp
cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/make/main.c
diff -u src/usr.bin/make/main.c:1.593 src/usr.bin/make/main.c:1.594
--- src/usr.bin/make/main.c:1.593 Tue Mar 28 14:39:31 2023
+++ src/usr.bin/make/main.c Sat Sep 9 01:30:59 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.593 2023/03/28 14:39:31 rillig Exp $ */
+/* $NetBSD: main.c,v 1.594 2023/09/09 01:30:59 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -111,7 +111,7 @@
#include "trace.h"
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: main.c,v 1.593 2023/03/28 14:39:31 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.594 2023/09/09 01:30:59 sjg Exp $");
#if defined(MAKE_NATIVE) && !defined(lint)
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
"The Regents of the University of California. "
@@ -398,18 +398,37 @@ static void
MainParseArgJobs(const char *argvalue)
{
char *p;
+ char v[12];
forceJobs = true;
opts.maxJobs = (int)strtol(argvalue, &p, 0);
+#ifdef _SC_NPROCESSORS_ONLN
+ if (*p != '\0') {
+ double d;
+
+ if (*p == 'C') {
+ d = (opts.maxJobs > 0) ? opts.maxJobs : 1;
+ } else if (*p == '.') {
+ d = strtod(argvalue, &p);
+ } else
+ d = 0;
+ if (d > 0) {
+ p = strchr(argvalue, 0);
+ opts.maxJobs = sysconf(_SC_NPROCESSORS_ONLN);
+ opts.maxJobs = (int)(d * (double)opts.maxJobs);
+ }
+ }
+#endif
if (*p != '\0' || opts.maxJobs < 1) {
(void)fprintf(stderr,
"%s: illegal argument to -j -- must be positive integer!\n",
progname);
exit(2); /* Not 1 so -q can distinguish error */
}
+ snprintf(v, sizeof(v), "%d", opts.maxJobs);
Global_Append(MAKEFLAGS, "-j");
- Global_Append(MAKEFLAGS, argvalue);
- Global_Set(".MAKE.JOBS", argvalue);
+ Global_Append(MAKEFLAGS, v);
+ Global_Set(".MAKE.JOBS", v);
maxJobTokens = opts.maxJobs;
}
Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.368 src/usr.bin/make/make.1:1.369
--- src/usr.bin/make/make.1:1.368 Sun Aug 20 19:58:15 2023
+++ src/usr.bin/make/make.1 Sat Sep 9 01:30:59 2023
@@ -1,4 +1,4 @@
-.\" $NetBSD: make.1,v 1.368 2023/08/20 19:58:15 sjg Exp $
+.\" $NetBSD: make.1,v 1.369 2023/09/09 01:30:59 sjg Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
.\"
-.Dd August 20, 2023
+.Dd September 9, 2023
.Dt MAKE 1
.Os
.Sh NAME
@@ -267,6 +267,12 @@ cooperate to avoid overloading the syste
Specify the maximum number of jobs that
.Nm
may have running at any one time.
+If
+.Ar max_jobs
+is a floating point number, or ends with
+.Ql C ,
+then the value is multiplied by the number of CPUs reported online by
+.Xr sysconf 3 .
The value of
.Ar max_jobs
is saved in
Index: src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp
diff -u src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp:1.2 src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp:1.3
--- src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp:1.2 Wed Jan 26 22:47:03 2022
+++ src/usr.bin/make/unit-tests/varname-dot-make-jobs.exp Sat Sep 9 01:30:59 2023
@@ -4,5 +4,5 @@ undefined
5
--- echo ---
20
-00000000000000000000000000000001
+1
exit status 0
Index: src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk
diff -u src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk:1.3 src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk:1.4
--- src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk:1.3 Wed Jan 26 22:47:03 2022
+++ src/usr.bin/make/unit-tests/varname-dot-make-jobs.mk Sat Sep 9 01:30:59 2023
@@ -1,4 +1,4 @@
-# $NetBSD: varname-dot-make-jobs.mk,v 1.3 2022/01/26 22:47:03 rillig Exp $
+# $NetBSD: varname-dot-make-jobs.mk,v 1.4 2023/09/09 01:30:59 sjg Exp $
#
# Tests for the special .MAKE.JOBS variable, which is defined in jobs mode
# only. There it contains the number of jobs that may run in parallel.
@@ -15,10 +15,33 @@ all:
@${MAKE} -r -f ${MAKEFILE} echo -j20
@${MAKE} -r -f ${MAKEFILE} echo -j00000000000000000000000000000001
+.if !make(echo)
+# These results will not be static, we need NCPU
+# to compute expected results.
+# We only support -jC if _SC_NPROCESSORS_ONLN is defined,
+# otherwise we will get NCPU=0
+NCPU!= ${MAKE} -r -f /dev/null -jC -V .MAKE.JOBS 2> /dev/null || echo 0
+
+.if ${NCPU} > 0
+all: jC
+
+# If -j arg is floating point or ends in C;
+# .MAKE.JOBS is a multiple of _SC_NPROCESSORS_ONLN
+# No news is good news here.
+jCvals ?= 1 1.2 2
+
+jC:
+ @for j in ${jCvals}; do \
+ e=`echo "${NCPU} * $$j" | bc | sed 's/\.[0-9]*//'`; \
+ g=`${MAKE} -r -f /dev/null -V .MAKE.JOBS -j$${j}C`; \
+ test $$g = $$e || echo "$$g != $$e"; \
+ done
+
+.endif
+.endif
+
# expect: undefined
# expect: 1
# expect: 5
# expect: 20
-# The value of .MAKE.JOBS is the exact text given in the command line, not the
-# canonical number. This doesn't have practical consequences though.
-# expect: 00000000000000000000000000000001
+# expect: 1