From 1005ea7d6b3b265896d7d490e4735267283ccc60 Mon Sep 17 00:00:00 2001 From: Evan Parker Date: Thu, 24 Sep 2026 21:59:29 +0000 Subject: [PATCH 1/5] Split JEDI python dependencies into a new jedi-python-env jedi-base-env pulled in 12 python packages, so every environment built on it inherited python whether or not it needed it -- including the model interface environments jedi-mpas-env and jedi-fv3-env. Move 11 of them into a new jedi-python-env bundle, following the existing neptune-env / neptune-python-env split. py-pybind11 stays in jedi-base-env because core JEDI packages link its headers. jedi-mpas-env and jedi-fv3-env are left with no python dependency other than py-pybind11. The other eight jedi-base-env dependents (ai-env, ewok-env, gmao-swell-env, jedi-geos-env, jedi-neptune-env, jedi-ufs-env, jedi-um-env, soca-env) gain an explicit jedi-python-env dependency so their content is unchanged. jedi-python-env is added to the unified-dev and skylab-dev templates. --- configs/templates/skylab-dev/spack.yaml | 1 + configs/templates/unified-dev/spack.yaml | 1 + .../spack_stack/packages/ai_env/package.py | 1 + .../spack_stack/packages/ewok_env/package.py | 1 + .../packages/gmao_swell_env/package.py | 1 + .../packages/jedi_base_env/package.py | 14 +------ .../packages/jedi_geos_env/package.py | 1 + .../packages/jedi_neptune_env/package.py | 1 + .../packages/jedi_python_env/package.py | 40 +++++++++++++++++++ .../packages/jedi_ufs_env/package.py | 1 + .../packages/jedi_um_env/package.py | 1 + .../spack_stack/packages/soca_env/package.py | 1 + 12 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py diff --git a/configs/templates/skylab-dev/spack.yaml b/configs/templates/skylab-dev/spack.yaml index 36f1bc989c..4a5190dc7d 100644 --- a/configs/templates/skylab-dev/spack.yaml +++ b/configs/templates/skylab-dev/spack.yaml @@ -15,6 +15,7 @@ spack: - jedi-geos-env ^esmf@=8.9.1 - jedi-mpas-env - jedi-neptune-env ^esmf@=9.0.0b18 + - jedi-python-env - jedi-tools-env - jedi-ufs-env ^esmf@=8.8.0 - neptune-env ^esmf@=9.0.0b18 diff --git a/configs/templates/unified-dev/spack.yaml b/configs/templates/unified-dev/spack.yaml index b59aa498b6..f16a5aafda 100644 --- a/configs/templates/unified-dev/spack.yaml +++ b/configs/templates/unified-dev/spack.yaml @@ -20,6 +20,7 @@ spack: - jedi-geos-env ^esmf@=9.0.0b18 - jedi-mpas-env - jedi-neptune-env ^esmf@=9.0.0b18 + - jedi-python-env - jedi-ufs-env ^esmf@=8.8.0 - neptune-env ^esmf@=9.0.0b18 - neptune-python-env ^esmf@=9.0.0b18 diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/ai_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/ai_env/package.py index 902d6ddfb4..fdf5cb2d91 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/ai_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/ai_env/package.py @@ -19,6 +19,7 @@ class AiEnv(BundlePackage): version("1.0.0") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("py-torch", type="run") # There is no need for install() since there is no code. diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/ewok_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/ewok_env/package.py index 3573828cfd..4c39207bef 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/ewok_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/ewok_env/package.py @@ -39,6 +39,7 @@ class EwokEnv(BundlePackage): ) depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("awscli-v2", type="run") depends_on("py-boto3", type="run") depends_on("py-cartopy", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/gmao_swell_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/gmao_swell_env/package.py index bd5292977b..748406165a 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/gmao_swell_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/gmao_swell_env/package.py @@ -20,6 +20,7 @@ class GmaoSwellEnv(BundlePackage): # Main JEDI modules depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") # Add CRTM 2.4.0 depends_on("crtm", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py index d3530c72f2..ea909896f6 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py @@ -54,19 +54,9 @@ class JediBaseEnv(BundlePackage): #depends_on("sp", type="run", when="^ip@:4") depends_on("udunits", type="run") - # Python packages - depends_on("py-eccodes", type="run") - depends_on("py-f90nml", type="run") - depends_on("py-h5py", type="run") - depends_on("py-netcdf4", type="run") - depends_on("py-pandas", type="run") - depends_on("py-pycodestyle", type="run") + # Python packages. Everything else moved to jedi-python-env; py-pybind11 + # stays because core JEDI packages link its headers. depends_on("py-pybind11", type="run") - depends_on("py-pyhdf", when="+hdf4", type="run") - depends_on("py-python-dateutil", type="run") - depends_on("py-pyyaml", type="run") - depends_on("py-scipy", type="run") - depends_on("py-xarray", type="run") conflicts( "platform=darwin %gcc", diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_geos_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_geos_env/package.py index 78abbf1256..3bad939023 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_geos_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_geos_env/package.py @@ -18,6 +18,7 @@ class JediGeosEnv(BundlePackage): version("1.0.0") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") #depends_on("blas", type="run") depends_on("mepo", type="run") depends_on("esmf", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_neptune_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_neptune_env/package.py index 23f85d8c2d..e4abf3848a 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_neptune_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_neptune_env/package.py @@ -27,6 +27,7 @@ class JediNeptuneEnv(BundlePackage): variant("jedi", default=False, description="Build JEDI components required for JEDI-NEPTUNE") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("neptune-env", type="run") depends_on("neptune-python-env", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py new file mode 100644 index 0000000000..34da90e274 --- /dev/null +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py @@ -0,0 +1,40 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack_repo.builtin.build_systems.bundle import BundlePackage +from spack.package import * + + +class JediPythonEnv(BundlePackage): + """Python dependencies for JEDI applications, on top of jedi-base-env""" + + homepage = "https://github.com/jcsda/spack-stack" + git = "https://github.com/jcsda/spack-stack.git" + + maintainers("climbfuji", "srherbener") + + version("1.0.0") + + # Mirrors the jedi-base-env variant so py-pyhdf tracks the hdf4 library + variant("hdf4", default=True, description="Build hdf4 library and python hdf module") + + depends_on("jedi-base-env", type="run") + depends_on("jedi-base-env +hdf4", when="+hdf4", type="run") + depends_on("jedi-base-env ~hdf4", when="~hdf4", type="run") + + # Python packages + depends_on("py-eccodes", type="run") + depends_on("py-f90nml", type="run") + depends_on("py-h5py", type="run") + depends_on("py-netcdf4", type="run") + depends_on("py-pandas", type="run") + depends_on("py-pycodestyle", type="run") + depends_on("py-pyhdf", when="+hdf4", type="run") + depends_on("py-python-dateutil", type="run") + depends_on("py-pyyaml", type="run") + depends_on("py-scipy", type="run") + depends_on("py-xarray", type="run") + + # There is no need for install() since there is no code. diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_ufs_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_ufs_env/package.py index bf788588fd..6fcbb56efa 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_ufs_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_ufs_env/package.py @@ -18,6 +18,7 @@ class JediUfsEnv(BundlePackage): version("1.0.0") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("fms +gfs_phys constants=GFS", type="run") depends_on("bacio", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_um_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_um_env/package.py index a04f74e51b..5cb49eb085 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_um_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_um_env/package.py @@ -20,6 +20,7 @@ class JediUmEnv(BundlePackage): version("1.0.0") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("ectrans", type="run") depends_on("fiat", type="run") depends_on("shumlib", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/soca_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/soca_env/package.py index a730a72a10..9f14785226 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/soca_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/soca_env/package.py @@ -18,6 +18,7 @@ class SocaEnv(BundlePackage): version("1.0.0") depends_on("jedi-base-env", type="run") + depends_on("jedi-python-env", type="run") depends_on("nco", type="run") # There is no need for install() since there is no code. From 8d022ab178646d60147a09b76bc511673ec39da9 Mon Sep 17 00:00:00 2001 From: Evan Parker Date: Thu, 24 Sep 2026 22:28:44 +0000 Subject: [PATCH 2/5] move bufr query --- configs/sites/tier2/aws-ubuntu2404/README.md | 4 +++- configs/sites/tier2/aws-ubuntu2404/packages.yaml | 4 +++- configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml | 4 +++- .../spack_stack/packages/jedi_base_env/package.py | 3 --- .../spack_stack/packages/jedi_python_env/package.py | 6 ++++++ 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/configs/sites/tier2/aws-ubuntu2404/README.md b/configs/sites/tier2/aws-ubuntu2404/README.md index 654ba0993f..9961aed733 100644 --- a/configs/sites/tier2/aws-ubuntu2404/README.md +++ b/configs/sites/tier2/aws-ubuntu2404/README.md @@ -362,9 +362,11 @@ cat << 'EOF' >> ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml - 'cxxflags="-O1"' jedi-base-env: require: - - ~bufrquery - +fftw - +hdf4 + jedi-python-env: + require: + - ~bufrquery py-pyyaml: require: - +libyaml diff --git a/configs/sites/tier2/aws-ubuntu2404/packages.yaml b/configs/sites/tier2/aws-ubuntu2404/packages.yaml index bb4ad8a49d..8ee1d27dd4 100644 --- a/configs/sites/tier2/aws-ubuntu2404/packages.yaml +++ b/configs/sites/tier2/aws-ubuntu2404/packages.yaml @@ -18,7 +18,9 @@ packages: require: - "@1.7.2" jedi-base-env: - require: [+fftw, +hdf4, +bufrquery] + require: [+fftw, +hdf4] + jedi-python-env: + require: [+bufrquery] # System packages. autoconf: diff --git a/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml b/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml index 55149ad0ae..a49908993a 100644 --- a/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml +++ b/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml @@ -84,7 +84,9 @@ packages: # Package constraints. jedi-base-env: - require: [+fftw, +hdf4, +bufrquery] + require: [+fftw, +hdf4] + jedi-python-env: + require: [+bufrquery] eccodes: require: - "jp2k=jasper" diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py index ea909896f6..43e5514261 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_base_env/package.py @@ -21,15 +21,12 @@ class JediBaseEnv(BundlePackage): # Need to find a free fftw provider for fftw-api ... variant("fftw", default=True, description="Build fftw") variant("hdf4", default=True, description="Build hdf4 library and python hdf module") - variant("bufrquery", default=True, description="Build bufr-query library") depends_on("libbacktrace", type="run") depends_on("base-env", type="run") depends_on("bison", type="run") depends_on("blas", type="run") depends_on("boost", type="run") - depends_on("bufr", type="run") - depends_on("bufr-query", when="+bufrquery", type="run") # Force users to load manually # depends_on("crtm@v2.4.1-jedi", type="run") depends_on("ecbuild", type="run") diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py index 34da90e274..05bcd697c8 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py @@ -19,11 +19,17 @@ class JediPythonEnv(BundlePackage): # Mirrors the jedi-base-env variant so py-pyhdf tracks the hdf4 library variant("hdf4", default=True, description="Build hdf4 library and python hdf module") + variant("bufrquery", default=True, description="Build bufr-query library") depends_on("jedi-base-env", type="run") depends_on("jedi-base-env +hdf4", when="+hdf4", type="run") depends_on("jedi-base-env ~hdf4", when="~hdf4", type="run") + # bufr is built +python in configs/common/packages.yaml, so it carries a + # py-numpy run dependency; bufr-query is its python-bindings companion. + depends_on("bufr", type="run") + depends_on("bufr-query", when="+bufrquery", type="run") + # Python packages depends_on("py-eccodes", type="run") depends_on("py-f90nml", type="run") From 5db8091831d2930b9d8c2607bee290b60ebb43f8 Mon Sep 17 00:00:00 2001 From: Evan Parker Date: Thu, 24 Sep 2026 22:32:55 +0000 Subject: [PATCH 3/5] jedi_python_env s/climbfuji/eap/ --- .../spack_repo/spack_stack/packages/jedi_python_env/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py index 05bcd697c8..8ace2e43b9 100644 --- a/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py +++ b/repos/spack_stack/spack_repo/spack_stack/packages/jedi_python_env/package.py @@ -13,7 +13,7 @@ class JediPythonEnv(BundlePackage): homepage = "https://github.com/jcsda/spack-stack" git = "https://github.com/jcsda/spack-stack.git" - maintainers("climbfuji", "srherbener") + maintainers("eap", "srherbener") version("1.0.0") From 36ac2712c9944e5db1334b094f4a1c731ee0b4aa Mon Sep 17 00:00:00 2001 From: Evan Parker Date: Wed, 14 Oct 2026 03:09:04 +0000 Subject: [PATCH 4/5] add +fix_rt_linkage to container and aws-ubuntu2404 --- configs/sites/tier1/container/packages_oneapi.yaml | 2 +- configs/sites/tier2/aws-ubuntu2404/README.md | 2 +- configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configs/sites/tier1/container/packages_oneapi.yaml b/configs/sites/tier1/container/packages_oneapi.yaml index 0ab8599b11..88edc96092 100644 --- a/configs/sites/tier1/container/packages_oneapi.yaml +++ b/configs/sites/tier1/container/packages_oneapi.yaml @@ -10,7 +10,7 @@ packages: intel-oneapi-compilers: buildable: false externals: - - spec: intel-oneapi-compilers@2025.3.0 + - spec: intel-oneapi-compilers@2025.3.0 +fix_rt_linkage prefix: /opt/intel/oneapi modules: - umf/1.0.2 diff --git a/configs/sites/tier2/aws-ubuntu2404/README.md b/configs/sites/tier2/aws-ubuntu2404/README.md index 9961aed733..c5527c8bb0 100644 --- a/configs/sites/tier2/aws-ubuntu2404/README.md +++ b/configs/sites/tier2/aws-ubuntu2404/README.md @@ -314,7 +314,7 @@ pico ${PWD}/site/packages.yaml # intel-oneapi-compilers: # buildable: false # externals: -# - spec: intel-oneapi-compilers@2026.1.1 +# - spec: intel-oneapi-compilers@2026.1.1 +fix_rt_linkage # prefix: /opt/intel/oneapi # modules: # - umf/1.1.0 diff --git a/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml b/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml index a49908993a..d56b47ec40 100644 --- a/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml +++ b/configs/sites/tier2/aws-ubuntu2404/packages_oneapi.yaml @@ -19,7 +19,7 @@ packages: intel-oneapi-compilers: buildable: false externals: - - spec: intel-oneapi-compilers@2026.1.1 + - spec: intel-oneapi-compilers@2026.1.1 +fix_rt_linkage prefix: /opt/intel/oneapi modules: - umf/1.1.0 From f8f819d02e973f328c9c2a429461fcbda3052b1c Mon Sep 17 00:00:00 2001 From: Evan Parker Date: Wed, 14 Oct 2026 03:17:38 +0000 Subject: [PATCH 5/5] Restore py-versioneer@0.28 as a py-pandas require, not a prefer --- configs/common/packages.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/common/packages.yaml b/configs/common/packages.yaml index 72464e694f..52f3dec0f4 100644 --- a/configs/common/packages.yaml +++ b/configs/common/packages.yaml @@ -479,13 +479,13 @@ packages: py-pandas: require: - '@:2' - prefer: - - '~performance' # py-versioneer is unavoidably duplicated by pins in py-pyogrio (@0.28) and # py-partd (@0.29). py-pandas is unconstrained and can further cascade splits # into py-xarray/met/metplus/jedi-base-env. This constraints py-versioneer to @0.28 # (shared with py-pyogrio) so only py-versioneer itself is duplicated. - ^py-versioneer@0.28 + prefer: + - '~performance' # To avoid duplicate packages py-poetry-core: require: