From e7ebeccd2527589cc5b8ddaec583355c103bc944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Sun, 17 Jul 2022 12:34:42 +0200 Subject: [PATCH] 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) --- .github/workflows/ci.yml | 6 +++--- Makefile | 2 +- SConstruct | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7ff1fb9..03525bcb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -79,17 +79,17 @@ jobs: - name: Build godot-cpp (debug) 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) run: | 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) run: | cd test - scons platform=${{ matrix.platform }} target=release ${{ matrix.flags }} -j2 + scons platform=${{ matrix.platform }} target=release ${{ matrix.flags }} - name: Run test GDNative library if: ${{ matrix.platform == 'linux' || matrix.platform == 'osx' }} diff --git a/Makefile b/Makefile index 12ed8213..74290582 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ HEADERS = godot-headers TARGET = debug 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 WINDOWS = $(BASE) platform=windows OSX = $(BASE) platform=osx diff --git a/SConstruct b/SConstruct index 8343fa0f..9a2a460b 100644 --- a/SConstruct +++ b/SConstruct @@ -81,6 +81,25 @@ else: 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 if ( env["TARGET_ARCH"] == "amd64"