Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
[submodule "repos/builtin"]
path = repos/builtin
url = https://github.com/jcsda/spack-packages
branch = spack-stack-dev
#branch = spack-stack-dev
branch = feature/merge_rel22_to_spackstackdev
4 changes: 4 additions & 0 deletions configs/common/modules_lmod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ modules:
'MADIS_ROOT': '{prefix}'
mapl:
suffixes:
^esmf@=8.9.1~debug ~openmp: 'esmf-8.9.1-noopenmp'
^esmf@=8.9.1+debug ~openmp: 'esmf-8.9.1-debug-noopenmp'
^esmf@=8.9.1~debug +openmp: 'esmf-8.9.1'
^esmf@=8.9.1+debug +openmp: 'esmf-8.9.1-debug'
^esmf@=9.0.0~debug ~openmp: 'esmf-9.0.0-noopenmp'
^esmf@=9.0.0+debug ~openmp: 'esmf-9.0.0-debug-noopenmp'
^esmf@=9.0.0~debug +openmp: 'esmf-9.0.0'
Expand Down
4 changes: 4 additions & 0 deletions configs/common/modules_tcl.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ modules:
'MADIS_ROOT': '{prefix}'
mapl:
suffixes:
^esmf@=8.9.1~debug ~openmp: 'esmf-8.9.1-noopenmp'
^esmf@=8.9.1+debug ~openmp: 'esmf-8.9.1-debug-noopenmp'
^esmf@=8.9.1~debug +openmp: 'esmf-8.9.1'
^esmf@=8.9.1+debug +openmp: 'esmf-8.9.1-debug'
^esmf@=9.0.0~debug ~openmp: 'esmf-9.0.0-noopenmp'
^esmf@=9.0.0+debug ~openmp: 'esmf-9.0.0-debug-noopenmp'
^esmf@=9.0.0~debug +openmp: 'esmf-9.0.0'
Expand Down
1 change: 1 addition & 0 deletions configs/common/packages.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ packages:
- +shared
- +external-parallelio
- any_of:
- '@=8.9.1'
- '@=9.0.0b17'
- '@=9.0.0b18'
- any_of:
Expand Down
421 changes: 421 additions & 0 deletions configs/sites/tier1/aws-ubuntu/README.md

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions configs/sites/tier1/aws-ubuntu/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
config:
build_jobs: 8

# Build stage and caches use the common defaults under
# ${SPACK_STACK_DIR}/cache on the root disk. Don't point them at /tmp: on
# Ubuntu 26.04 /tmp is a RAM-backed tmpfs (half of RAM, with per-user quotas),
# and a unified-env build fills it ("Disk quota exceeded").
121 changes: 121 additions & 0 deletions configs/sites/tier1/aws-ubuntu/packages.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
packages:
# Package constraints.
ewok-env:
require:
- +ecflow
# Soft preference, as on other tier1 sites. With gcc 14, +lidar2nc and +modis
# are dropped: they need hdf-eos2, and common pins hdf-eos2@2.20v1.00, which
# conflicts with %gcc@14: (3.0+ is required).
met:
variants: +python +grib2 +graphics +lidar2nc +modis
py-netcdf4:
require:
- "@1.7.2"
jedi-base-env:
require: [+fftw, +hdf4]
# jedi-ufs-env needs +bufrquery; unconstrained, the root splits in two.
jedi-python-env:
require: [+bufrquery]
# Unconstrained, jedi-tools-env falls back to py-myst-parser@1/py-sphinx@6,
# which cap py-attrs@:21 and py-docutils@:0.19 and split py-attrs, py-eccodes,
# py-rasterio, jedi-python-env and awscli-v2. common/packages_oneapi.yaml
# already requires py-sphinx@9: for the same reason.
py-myst-parser:
require: ['@5:']
py-sphinx:
require: ['@9:']
fontconfig:
variants: +pic
pixman:
variants: +pic
cairo:
variants: +pic

# System packages (Ubuntu 26.04). Derived with `spack external find`
# excluding cmake, curl, openssl, openssh, python and zlib (the multiarch
# libdir breaks pmix's zlib detection). coreutils (uutils) and binutils
# (2.46, no gold) aren't detected and are left for spack to build if needed.
autoconf:
externals:
- spec: autoconf@2.72
prefix: /usr
automake:
externals:
- spec: automake@1.18.1
prefix: /usr
diffutils:
externals:
- spec: diffutils@3.12
prefix: /usr
findutils:
externals:
- spec: findutils@4.10.0
prefix: /usr
flex:
externals:
- spec: flex@2.6.4+lex
prefix: /usr
gawk:
externals:
- spec: gawk@5.3.2
prefix: /usr
gettext:
externals:
- spec: gettext@0.23.2
prefix: /usr
git:
externals:
- spec: git@2.53.0~tcltk
prefix: /usr
git-lfs:
externals:
- spec: git-lfs@3.7.1
prefix: /usr
gmake:
externals:
- spec: gmake@4.4.1
prefix: /usr
grep:
externals:
- spec: grep@3.12
prefix: /usr
groff:
externals:
- spec: groff@1.23.0
prefix: /usr
libtool:
externals:
- spec: libtool@2.5.4
prefix: /usr
m4:
externals:
- spec: m4@1.4.21
prefix: /usr
perl:
externals:
- spec: perl@5.40.1~cpanm+opcode+open+shared+threads
prefix: /usr
pkgconf:
externals:
- spec: pkgconf@2.5.1
prefix: /usr
sed:
externals:
- spec: sed@4.9
prefix: /usr
tar:
buildable: false
externals:
- spec: tar@1.35
prefix: /usr
wget:
buildable: false
externals:
- spec: wget@1.25.0
prefix: /usr
# Not auto-detected (qmake is a qtchooser shim); apt qtbase5-dev. common requires qt@5.
qt:
buildable: false
externals:
- spec: qt@5.15.18
prefix: /usr
13 changes: 13 additions & 0 deletions configs/sites/tier1/aws-ubuntu/packages_gcc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
packages:
gcc:
buildable: false
externals:
- spec: gcc@14.3.0 languages:='c,c++,fortran'
prefix: /usr
extra_attributes:
compilers:
c: /usr/bin/gcc-14
cxx: /usr/bin/g++-14
fortran: /usr/bin/gfortran-14
mpi:
require: ['openmpi@5.0.10']
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
packages:

# Compilers.
# Language preferences for oneAPI come from common/packages_oneapi.yaml. Don't
# add "all: prefer: ['%oneapi']": it acts as a dependency constraint and makes
# spack rebuild system externals.
all:
prefer:
- '%oneapi'
conflict:
- '%c=oneapi %fortran=gcc'
- '%c,cxx=oneapi %fortran=gcc'
Expand All @@ -13,8 +14,6 @@ packages:
- '%fortran=oneapi %c,cxx=gcc'
- '%fortran=gcc %c,cxx=oneapi'
- '%fortran=gcc %c=oneapi'
providers:
mpi:: [intel-oneapi-mpi@2021.18]

intel-oneapi-compilers:
buildable: false
Expand All @@ -33,6 +32,13 @@ packages:
fortran: /opt/intel/oneapi/compiler/2026.1/bin/ifx
c: /opt/intel/oneapi/compiler/2026.1/bin/icx
cxx: /opt/intel/oneapi/compiler/2026.1/bin/icpx
# Ubuntu 26.04's default gcc is 15. Left alone, icx/icpx pick the newest
# installed GCC for libstdc++ headers and libs, and ifx links its
# runtime. Pin them to gcc 14 so they match the gcc env.
flags:
cflags: --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/14
cxxflags: --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/14
fflags: -gcc-name=/usr/bin/gcc-14 -gxx-name=/usr/bin/g++-14
openmpi:
buildable: false
mpich:
Expand All @@ -43,13 +49,13 @@ packages:
- intel-oneapi-mpi@2021.18
gcc:
externals:
- spec: gcc@13.3.0 languages:='c,c++,fortran'
- spec: gcc@14.3.0 languages:='c,c++,fortran'
prefix: /usr
extra_attributes:
compilers:
c: /usr/bin/gcc
cxx: /usr/bin/g++
fortran: /usr/bin/gfortran
c: /usr/bin/gcc-14
cxx: /usr/bin/g++-14
fortran: /usr/bin/gfortran-14
buildable: false
intel-oneapi-mkl:
buildable: false
Expand Down Expand Up @@ -83,6 +89,15 @@ packages:
- tbb/2023.1

# Package constraints.
# Avoid duplicates. Unpinned, gmao-swell-env and py-pyresample pull two
# py-dask versions, which splits py-setuptools-scm (8 vs 9) and cascades into
# py-netcdf4, py-xarray, py-zarr and jedi-python-env. The gcc env settles on
# 2024.12.1 without a pin.
py-dask:
require: ['@2024.12.1']
# Unconstrained, one met concretizes ~graphics. Keep common's +shared-intel.
met:
require: ['+graphics +shared-intel']
jedi-base-env:
require: [+fftw, +hdf4]
jedi-python-env:
Expand Down
47 changes: 30 additions & 17 deletions configs/sites/tier1/container/Dockerfile.gcc
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
# See the README.md for building instructions.

## ---------- build base container used by builder and runtime ----------
FROM ubuntu:24.04 AS ubuntu_base
FROM ubuntu:26.04 AS ubuntu_base

ARG BUILD_JOBS=4
ARG BUILD_JOBS=8
ARG SPACK_STACK_TEMPLATE=unified-dev

SHELL ["/bin/bash", "-c"]
Expand All @@ -22,14 +22,14 @@ RUN set -euo pipefail; \
apt-get -yqq update && \
apt-get -yqq upgrade && \
apt-get -yqq install --no-install-recommends \
# Core build tools.
# Core build tools. build-essential pulls in the default gcc-15; we add
# gcc-14 alongside it, since spack-stack supports gcc up to 14.x.
build-essential \
gcc-13 \
gcc++-13 \
gfortran-13 \
cpp-13 \
gcc-14 \
g++-14 \
gfortran-14 \
cpp-14 \
make \
llvm-14 \
autoconf \
# External dependencies.
libcurl4-openssl-dev \
Expand All @@ -55,10 +55,11 @@ RUN set -euo pipefail; \
locales && \
locale-gen en_US.UTF-8 && \
# Update alternatives for compilers and tools
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 && \
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-13 100 && \
update-alternatives --install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-14 100 && \
# Make gcc-14 the default gcc/g++/gfortran for container users. Spack uses
# the -14 binaries by full path (see packages_gcc.yaml).
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 100 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 100 && \
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-14 100 && \
rm -rf /var/lib/apt/lists/*


Expand All @@ -80,7 +81,8 @@ COPY --exclude=configs/sites/tier1/container/Dockerfile.oneapi \

# Create spack-stack environment
WORKDIR /opt/spack-stack
RUN mkdir -p /tmp/spack-stack && \
RUN set -o pipefail && \
mkdir -p /tmp/spack-stack && \
source setup.sh && \
spack stack create env \
--site container \
Expand All @@ -93,7 +95,7 @@ RUN mkdir -p /tmp/spack-stack && \
spack concretize 2>&1 | tee log.concretize

# Build the spack environment.
RUN source setup.sh && cd ${SPACK_STACK_DIR}/envs/container && spack env activate . && \
RUN set -o pipefail && source setup.sh && cd ${SPACK_STACK_DIR}/envs/container && spack env activate . && \
spack install --fail-fast -j ${BUILD_JOBS} 2>&1 | tee log.install

# Setup modules and meta-modules.
Expand Down Expand Up @@ -126,16 +128,19 @@ RUN echo "ulimit -s unlimited" > /etc/spack_container_rc.sh \
&& echo "export PRTE_MCA_rmaps_default_mapping_policy=:oversubscribe" >> /etc/spack_container_rc.sh \
&& echo "# TCL module path for the spack-stack environment." >> /etc/spack_container_rc.sh \
&& echo "source /etc/profile.d/modules.sh" >> /etc/spack_container_rc.sh \
&& echo "module use /opt/spack-software/modulefiles" >> /etc/spack_container_rc.sh \
&& echo "module use /opt/spack-software/modulefiles/Core" >> /etc/spack_container_rc.sh \
&& echo "# Bash function to load modules necessary to build the JEDI bundle." >> /etc/spack_container_rc.sh \
&& echo "load_jedi_bundle_env() {" >> /etc/spack_container_rc.sh \
&& echo " module purge" >> /etc/spack_container_rc.sh \
&& echo " module load stack-gcc" >> /etc/spack_container_rc.sh \
&& echo " module load stack-openmpi" >> /etc/spack_container_rc.sh \
&& echo " module load stack-gcc/14.3.0" >> /etc/spack_container_rc.sh \
&& echo " module load stack-openmpi/5.0.10" >> /etc/spack_container_rc.sh \
&& echo " module load base-env" >> /etc/spack_container_rc.sh \
&& echo " module load jedi-mpas-env" >> /etc/spack_container_rc.sh \
&& echo " module load jedi-python-env" >> /etc/spack_container_rc.sh \
&& echo " module load py-fortranformat" >> /etc/spack_container_rc.sh \
&& echo " module load py-matplotlib" >> /etc/spack_container_rc.sh \
&& echo " module load py-cartopy" >> /etc/spack_container_rc.sh \
&& echo " module load py-pyproj" >> /etc/spack_container_rc.sh \
&& echo " module load jedi-fv3-env" >> /etc/spack_container_rc.sh \
&& echo " module load ewok-env" >> /etc/spack_container_rc.sh \
&& echo " module load ip" >> /etc/spack_container_rc.sh \
Expand All @@ -153,6 +158,14 @@ RUN useradd -U -k /etc/skel -s /bin/bash -d /home/nonroot -m nonroot --uid 43891
&& mkdir /home/nonroot/.pmix \
&& chown -R nonroot:nonroot /home/nonroot/.gitconfig /home/nonroot/.pmix

# Fail the build if the stack meta-modules don't resolve to real compiler and
# MPI modules (and nothing else) in the final image.
RUN source /etc/spack_container_rc.sh && \
module load stack-gcc/14.3.0 stack-openmpi/5.0.10 && \
module is-loaded gcc/14.3.0 && module is-loaded openmpi/5.0.10 && \
! module is-loaded ufs-weather-model-env && \
which mpicc mpif90 && mpif90 --version | grep -q " 14\.3\."

# Ensure the container rc is run by non-login shells too.
ENV BASH_ENV=/etc/spack_container_rc.sh

Expand Down
Loading
Loading