From 1836b78af63f781b6c82832c5ff82d8f308e4d5c Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 18 Feb 2026 13:38:40 +0100 Subject: [PATCH 1/4] py-*: respect jobserver Signed-off-by: Harmen Stoppels --- .../builtin/packages/py_matplotlib/package.py | 8 ++++++-- repos/spack_repo/builtin/packages/py_numpy/package.py | 6 +++++- repos/spack_repo/builtin/packages/py_scipy/package.py | 10 ++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/repos/spack_repo/builtin/packages/py_matplotlib/package.py b/repos/spack_repo/builtin/packages/py_matplotlib/package.py index 2b327125cf5..9a3278376b0 100644 --- a/repos/spack_repo/builtin/packages/py_matplotlib/package.py +++ b/repos/spack_repo/builtin/packages/py_matplotlib/package.py @@ -298,9 +298,8 @@ def flag_handler(self, name, flags): @when("@3.9:") def config_settings(self, spec, prefix): - return { + settings = { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { "-Dsystem-freetype": True, "-Dsystem-qhull": True, @@ -309,6 +308,11 @@ def config_settings(self, spec, prefix): "-Db_lto": not (self.spec.satisfies("%clang") or self.spec.satisfies("%oneapi")), }, } + # Do not pass -jN if we're running under a jobserver + jobs = get_effective_jobs(make_jobs, supports_jobserver=True) + if jobs is not None: + settings["compile-args"] = f"-j{jobs}" + return settings @run_after("install") @on_package_attributes(run_tests=True) diff --git a/repos/spack_repo/builtin/packages/py_numpy/package.py b/repos/spack_repo/builtin/packages/py_numpy/package.py index 453341f2ddc..317af10266f 100644 --- a/repos/spack_repo/builtin/packages/py_numpy/package.py +++ b/repos/spack_repo/builtin/packages/py_numpy/package.py @@ -337,7 +337,6 @@ def config_settings(self, spec, prefix): settings = { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { # https://scipy.github.io/devdocs/building/blas_lapack.html "-Dblas": blas, @@ -350,6 +349,11 @@ def config_settings(self, spec, prefix): }, } + # Do not pass -jN if we're running under a jobserver + jobs = get_effective_jobs(make_jobs, supports_jobserver=True) + if jobs is not None: + settings["compile-args"] = f"-j{jobs}" + # Disable AVX512 features for Intel Classic compilers # https://numpy.org/doc/stable/reference/simd/build-options.html # https://github.com/numpy/numpy/issues/27840 diff --git a/repos/spack_repo/builtin/packages/py_scipy/package.py b/repos/spack_repo/builtin/packages/py_scipy/package.py index 28be6e3418a..c0380281e09 100644 --- a/repos/spack_repo/builtin/packages/py_scipy/package.py +++ b/repos/spack_repo/builtin/packages/py_scipy/package.py @@ -225,9 +225,8 @@ def config_settings(self, spec, prefix): else: fortran_std = "legacy" - return { + settings = { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { # http://scipy.github.io/devdocs/building/blas_lapack.html "-Dfortran_std": fortran_std, @@ -236,6 +235,13 @@ def config_settings(self, spec, prefix): }, } + # Do not pass -jN if we're running under a jobserver + jobs = get_effective_jobs(make_jobs, supports_jobserver=True) + if jobs is not None: + settings["compile-args"] = f"-j{jobs}" + + return settings + @run_before("install", when="@:1.8") def set_blas_lapack(self): self["py-numpy"].blas_lapack_site_cfg() From 0c2b294377a3b43611a1547736e022a807bb69f0 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 18 Feb 2026 15:51:58 +0100 Subject: [PATCH 2/4] Revert "py-*: respect jobserver" This reverts commit 1836b78af63f781b6c82832c5ff82d8f308e4d5c. --- .../builtin/packages/py_matplotlib/package.py | 8 ++------ repos/spack_repo/builtin/packages/py_numpy/package.py | 6 +----- repos/spack_repo/builtin/packages/py_scipy/package.py | 10 ++-------- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/repos/spack_repo/builtin/packages/py_matplotlib/package.py b/repos/spack_repo/builtin/packages/py_matplotlib/package.py index 9a3278376b0..2b327125cf5 100644 --- a/repos/spack_repo/builtin/packages/py_matplotlib/package.py +++ b/repos/spack_repo/builtin/packages/py_matplotlib/package.py @@ -298,8 +298,9 @@ def flag_handler(self, name, flags): @when("@3.9:") def config_settings(self, spec, prefix): - settings = { + return { "builddir": "build", + "compile-args": f"-j{make_jobs}", "setup-args": { "-Dsystem-freetype": True, "-Dsystem-qhull": True, @@ -308,11 +309,6 @@ def config_settings(self, spec, prefix): "-Db_lto": not (self.spec.satisfies("%clang") or self.spec.satisfies("%oneapi")), }, } - # Do not pass -jN if we're running under a jobserver - jobs = get_effective_jobs(make_jobs, supports_jobserver=True) - if jobs is not None: - settings["compile-args"] = f"-j{jobs}" - return settings @run_after("install") @on_package_attributes(run_tests=True) diff --git a/repos/spack_repo/builtin/packages/py_numpy/package.py b/repos/spack_repo/builtin/packages/py_numpy/package.py index 317af10266f..453341f2ddc 100644 --- a/repos/spack_repo/builtin/packages/py_numpy/package.py +++ b/repos/spack_repo/builtin/packages/py_numpy/package.py @@ -337,6 +337,7 @@ def config_settings(self, spec, prefix): settings = { "builddir": "build", + "compile-args": f"-j{make_jobs}", "setup-args": { # https://scipy.github.io/devdocs/building/blas_lapack.html "-Dblas": blas, @@ -349,11 +350,6 @@ def config_settings(self, spec, prefix): }, } - # Do not pass -jN if we're running under a jobserver - jobs = get_effective_jobs(make_jobs, supports_jobserver=True) - if jobs is not None: - settings["compile-args"] = f"-j{jobs}" - # Disable AVX512 features for Intel Classic compilers # https://numpy.org/doc/stable/reference/simd/build-options.html # https://github.com/numpy/numpy/issues/27840 diff --git a/repos/spack_repo/builtin/packages/py_scipy/package.py b/repos/spack_repo/builtin/packages/py_scipy/package.py index c0380281e09..28be6e3418a 100644 --- a/repos/spack_repo/builtin/packages/py_scipy/package.py +++ b/repos/spack_repo/builtin/packages/py_scipy/package.py @@ -225,8 +225,9 @@ def config_settings(self, spec, prefix): else: fortran_std = "legacy" - settings = { + return { "builddir": "build", + "compile-args": f"-j{make_jobs}", "setup-args": { # http://scipy.github.io/devdocs/building/blas_lapack.html "-Dfortran_std": fortran_std, @@ -235,13 +236,6 @@ def config_settings(self, spec, prefix): }, } - # Do not pass -jN if we're running under a jobserver - jobs = get_effective_jobs(make_jobs, supports_jobserver=True) - if jobs is not None: - settings["compile-args"] = f"-j{jobs}" - - return settings - @run_before("install", when="@:1.8") def set_blas_lapack(self): self["py-numpy"].blas_lapack_site_cfg() From 39202086ade7bb3d3f967deec5827c34a19ea2ec Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 18 Feb 2026 16:00:12 +0100 Subject: [PATCH 3/4] py-meson-python: support jobserver Signed-off-by: Harmen Stoppels --- .../spack_repo/builtin/build_systems/python.py | 18 +++++++++++++++--- .../builtin/packages/py_matplotlib/package.py | 1 - .../builtin/packages/py_numpy/package.py | 1 - .../builtin/packages/py_scipy/package.py | 1 - 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/repos/spack_repo/builtin/build_systems/python.py b/repos/spack_repo/builtin/build_systems/python.py index f4ca6c190fe..9945ca0df5b 100644 --- a/repos/spack_repo/builtin/build_systems/python.py +++ b/repos/spack_repo/builtin/build_systems/python.py @@ -19,10 +19,12 @@ build_system, classproperty, depends_on, + determine_number_of_jobs, execute_install_time_tests, extends, filter_file, find, + get_effective_jobs, has_shebang, join_path, path_contains_subdirectory, @@ -313,7 +315,7 @@ def build_directory(self) -> str: """ return self.pkg.stage.source_path - def config_settings(self, spec: Spec, prefix: Prefix) -> Mapping[str, object]: + def config_settings(self, spec: Spec, prefix: Prefix) -> Dict[str, object]: """Configuration settings to be passed to the PEP 517 build backend. Requires pip 22.1 or newer for keys that appear only a single time, @@ -363,8 +365,18 @@ def install(self, pkg: PythonPackage, spec: Spec, prefix: Prefix) -> None: pip.add_default_arg("-m", "pip") args = PythonPipBuilder.std_args(pkg) + [f"--prefix={prefix}"] - - for setting in _flatten_dict(self.config_settings(spec, prefix)): + config_settings = self.config_settings(spec, prefix) + + # Pass -jN for compile-args if supported and needed + if spec.satisfies("%py-pip@22.1: %py-meson-python@0.11:"): + # get_effective_jobs returns None when a jobserver is active, then we don't pass -j. + jobs = get_effective_jobs( + jobs=determine_number_of_jobs(parallel=pkg.parallel), supports_jobserver=True + ) + if jobs is not None: + config_settings["compile-args"] = f"-j{jobs}" + + for setting in _flatten_dict(config_settings): args.append(f"--config-settings={setting}") for option in self.install_options(spec, prefix): args.append(f"--install-option={option}") diff --git a/repos/spack_repo/builtin/packages/py_matplotlib/package.py b/repos/spack_repo/builtin/packages/py_matplotlib/package.py index 2b327125cf5..99ade6cb6b1 100644 --- a/repos/spack_repo/builtin/packages/py_matplotlib/package.py +++ b/repos/spack_repo/builtin/packages/py_matplotlib/package.py @@ -300,7 +300,6 @@ def flag_handler(self, name, flags): def config_settings(self, spec, prefix): return { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { "-Dsystem-freetype": True, "-Dsystem-qhull": True, diff --git a/repos/spack_repo/builtin/packages/py_numpy/package.py b/repos/spack_repo/builtin/packages/py_numpy/package.py index 453341f2ddc..b923de9286a 100644 --- a/repos/spack_repo/builtin/packages/py_numpy/package.py +++ b/repos/spack_repo/builtin/packages/py_numpy/package.py @@ -337,7 +337,6 @@ def config_settings(self, spec, prefix): settings = { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { # https://scipy.github.io/devdocs/building/blas_lapack.html "-Dblas": blas, diff --git a/repos/spack_repo/builtin/packages/py_scipy/package.py b/repos/spack_repo/builtin/packages/py_scipy/package.py index 28be6e3418a..00f697484a4 100644 --- a/repos/spack_repo/builtin/packages/py_scipy/package.py +++ b/repos/spack_repo/builtin/packages/py_scipy/package.py @@ -227,7 +227,6 @@ def config_settings(self, spec, prefix): return { "builddir": "build", - "compile-args": f"-j{make_jobs}", "setup-args": { # http://scipy.github.io/devdocs/building/blas_lapack.html "-Dfortran_std": fortran_std, From 41e8539d06073a93fcaa1d0a7e50bd4d241ac715 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 18 Feb 2026 16:39:24 +0100 Subject: [PATCH 4/4] py-scikit-learn: do not set redundant variable Signed-off-by: Harmen Stoppels --- repos/spack_repo/builtin/packages/py_scikit_learn/package.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/repos/spack_repo/builtin/packages/py_scikit_learn/package.py b/repos/spack_repo/builtin/packages/py_scikit_learn/package.py index 12a117b5449..3e8db6b1ad6 100644 --- a/repos/spack_repo/builtin/packages/py_scikit_learn/package.py +++ b/repos/spack_repo/builtin/packages/py_scikit_learn/package.py @@ -119,8 +119,9 @@ def url_for_version(self, version): return url.format(name, version) def setup_build_environment(self, env: EnvironmentModifications) -> None: - # Enable parallel builds of the sklearn backend - env.append_flags("SKLEARN_BUILD_PARALLEL", str(make_jobs)) + if self.spec.satisfies("@:1.4"): + # Enable parallel builds for the pre py-meson-python build system + env.append_flags("SKLEARN_BUILD_PARALLEL", str(make_jobs)) # https://scikit-learn.org/stable/developers/advanced_installation.html#macos if self.spec.satisfies("%apple-clang"):