Browse Source

SCons: Default `num_jobs` to max CPUs minus 1 if not specified

This doesn't change the behavior when `--jobs`/`-j` is specified as a
command-line argument or in `SCONSFLAGS`.

The SCons hack used to know if `num_jobs` was set by the user is derived
from the MongoDB setup.

We use `os.cpu_count()` for portability (available since Python 3.4).

With 4 CPUs or less, we use the max. With more than 4 we use max - 1 to
preserve some bandwidth for the user's other programs.

Makefile: Dehardcode -j4, SCons defaults to max - 1

(cherry picked from commits cdcd473371018bc2e268d9f8eab4e2de231828d4 and
c2b35fb226bd5e706fce7a9e23926fffefc0498d)
Rémi Verschelde 3 years ago
parent
commit
e7ebeccd25
3 changed files with 23 additions and 4 deletions
  1. 3 3
      .github/workflows/ci.yml
  2. 1 1
      Makefile
  3. 19 0
      SConstruct

+ 3 - 3
.github/workflows/ci.yml

@@ -79,17 +79,17 @@ jobs:
 
 
       - name: Build godot-cpp (debug)
       - name: Build godot-cpp (debug)
         run: |
         run: |
-          scons platform=${{ matrix.platform }} target=debug generate_bindings=yes ${{ matrix.flags }} -j2
+          scons platform=${{ matrix.platform }} target=debug generate_bindings=yes ${{ matrix.flags }}
 
 
       - name: Build test without rebuilding godot-cpp (debug)
       - name: Build test without rebuilding godot-cpp (debug)
         run: |
         run: |
           cd test
           cd test
-          scons platform=${{ matrix.platform }} target=debug ${{ matrix.flags }} build_library=no -j2
+          scons platform=${{ matrix.platform }} target=debug ${{ matrix.flags }} build_library=no
 
 
       - name: Build test and godot-cpp (release)
       - name: Build test and godot-cpp (release)
         run: |
         run: |
           cd test
           cd test
-          scons platform=${{ matrix.platform }} target=release ${{ matrix.flags }} -j2
+          scons platform=${{ matrix.platform }} target=release ${{ matrix.flags }}
 
 
       - name: Run test GDNative library
       - name: Run test GDNative library
         if: ${{ matrix.platform == 'linux' || matrix.platform == 'osx' }}
         if: ${{ matrix.platform == 'linux' || matrix.platform == 'osx' }}

+ 1 - 1
Makefile

@@ -3,7 +3,7 @@ HEADERS = godot-headers
 TARGET = debug
 TARGET = debug
 USE_CLANG = no
 USE_CLANG = no
 
 
-BASE = scons use_llvm=$(USE_CLANG) generate_bindings=$(GENERATE_BINDINGS) target=$(TARGET) headers=$(HEADERS) -j4
+BASE = scons use_llvm=$(USE_CLANG) generate_bindings=$(GENERATE_BINDINGS) target=$(TARGET) headers=$(HEADERS)
 LINUX = $(BASE) platform=linux
 LINUX = $(BASE) platform=linux
 WINDOWS = $(BASE) platform=windows
 WINDOWS = $(BASE) platform=windows
 OSX = $(BASE) platform=osx
 OSX = $(BASE) platform=osx

+ 19 - 0
SConstruct

@@ -81,6 +81,25 @@ else:
 
 
 env = Environment(ENV=os.environ)
 env = Environment(ENV=os.environ)
 
 
+# Default num_jobs to local cpu count if not user specified.
+# SCons has a peculiarity where user-specified options won't be overridden
+# by SetOption, so we can rely on this to know if we should use our default.
+initial_num_jobs = env.GetOption("num_jobs")
+altered_num_jobs = initial_num_jobs + 1
+env.SetOption("num_jobs", altered_num_jobs)
+# os.cpu_count() requires Python 3.4+.
+if hasattr(os, "cpu_count") and env.GetOption("num_jobs") == altered_num_jobs:
+    cpu_count = os.cpu_count()
+    if cpu_count is None:
+        print("Couldn't auto-detect CPU count to configure build parallelism. Specify it with the -j argument.")
+    else:
+        safer_cpu_count = cpu_count if cpu_count <= 4 else cpu_count - 1
+        print(
+            "Auto-detected %d CPU cores available for build parallelism. Using %d cores by default. You can override it with the -j argument."
+            % (cpu_count, safer_cpu_count)
+        )
+        env.SetOption("num_jobs", safer_cpu_count)
+
 is64 = sys.maxsize > 2 ** 32
 is64 = sys.maxsize > 2 ** 32
 if (
 if (
     env["TARGET_ARCH"] == "amd64"
     env["TARGET_ARCH"] == "amd64"