Build develop on EESSI

This page builds a develop checkout on the European Environment for Scientific Software Installations (EESSI), release 2026.06. The check is meson test --suite eon. The fail count is 0.

EESSI 2026.06 is the tree under /cvmfs/software.eessi.io/versions/2026.06. A clone with no branch name follows the repository default. This build uses develop.

git clone -b develop https://github.com/TheochemUI/eOn.git
cd eOn

The first meson setup downloads the wraps in subprojects/. That step needs a network.

Install the modules

eOn-devel/2026.06-GCCcore-15.2.0 is one EasyBuild bundle. It loads Meson, Ninja, CMake, pkgconf, Eigen, Python, and Rust. Cap’n Proto is a second module. OpenMPI comes from foss/2026.1.

Set the install prefix before the module load. If EESSI_USER_INSTALL is unset, the prefix is $HOME/eessi. If you set it, the directory must already exist. The load stops when that path is missing.

source /cvmfs/software.eessi.io/versions/2026.06/init/bash
mkdir -p "${EESSI_USER_INSTALL:-$HOME/eessi}"
module load EESSI-extend

A user prefix sets EASYBUILD_UMASK to 077. Lmod, running as root, then reports the new module as unknown, because the module directory is not searchable by others. Pass --umask=022 on every eb command.

A shell with nounset (set -u) aborts during this load. EESSI-extend reads LD_LIBRARY_PATH, and the stack leaves that variable unset. Load the module with nounset off.

eb --umask=022 eessi/eOn-devel-2026.06-GCCcore-15.2.0.eb

The direct in-process rgpot arm builds rgpot’s remote procedure call stack. That stack needs the capnp program and the capnp-rpc pkg-config file. EESSI 2026.06 has no CapnProto 1.4.0 module for GCCcore 15.2.0. EasyBuild fetches that CapnProto easyconfig from pull request 26480. Pass the CapnProto filename. The other recipes in that pull request then stay unused.

eb --umask=022 --from-pr 26480 CapnProto-1.4.0-GCCcore-15.2.0.eb

A commit id works in place of the pull request number. The id is the full 40-character string. This one is the pull request head. --from-pr follows later updates. --from-commit stays on this id, and it avoids the GitHub rate limit on pull requests.

eb --umask=022 --from-commit 66fa89934f0476cd4f9ff14154ee4c87ae5c5d82 CapnProto-1.4.0-GCCcore-15.2.0.eb

That commit can still be rejected. EasyBuild rejects toolchain GCCcore 15.2.0 when the pull request build is unsupported in EESSI 2026.06. Read the supported list in that message. When the list is empty, the message prints an export. Set that variable and run eb again.

export EESSI_SITE_TOP_LEVEL_TOOLCHAINS_2026_06='[{"name": "GCCcore", "version": "15.2.0"}]'

capnp --version should print Cap'n Proto version 1.4.0. pkg-config --exists capnp-rpc should return 0.

Configure and build

Open a new shell. Load the compiler stack, the bundle, and CapnProto.

source /cvmfs/software.eessi.io/versions/2026.06/init/bash
module load EESSI-extend
module load foss/2026.1 eOn-devel/2026.06-GCCcore-15.2.0 CapnProto/1.4.0-GCCcore-15.2.0
hash -r
command -v mpicc
command -v capnp

foss/2026.1 provides mpicc, mpicxx, and mpif90. Export those three as CC, CXX, and FC. Meson then stores the Message Passing Interface (MPI) compiler wrappers.

Loaded modules do not set LD_LIBRARY_PATH. Leave it unset. An empty value is not a search path. The bundle writes one run path into LDFLAGS, the GCCcore 15.2.0 lib64 directory. buildenv/default-foss-2026.1 is part of this release, and its LDFLAGS are -L link-search directories. Loading the bundle after that module replaces LDFLAGS with the single GCCcore run path. The loader still needs one -Wl,-rpath for every loaded module library.

Walk each EBROOT variable. Append lib and lib64 when the directory exists.

EON_LDFLAGS=""
for v in $(env | grep -o '^EBROOT[A-Z0-9_]*'); do
  for l in lib lib64; do
    if [ -d "${!v}/$l" ]; then
      EON_LDFLAGS="$EON_LDFLAGS -Wl,-rpath,${!v}/$l"
    fi
  done
done
export LDFLAGS="$EON_LDFLAGS"
export CC=mpicc CXX=mpicxx FC=mpif90
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=gcc

Point CARGO_HOME at an empty directory outside the checkout. Cargo then skips a host cargo configuration in its home. Cargo also reads .cargo/config.toml from the checkout and from every parent directory. A tree under $HOME still reads $HOME/.cargo/config.toml. Move the checkout in that case.

Clear host linker flags and compiler wrappers before configure.

unset RUSTC_WRAPPER CARGO_BUILD_RUSTC_WRAPPER RUSTC_WORKSPACE_WRAPPER
unset RUSTFLAGS CARGO_ENCODED_RUSTFLAGS
export CARGO_HOME="$PWD/../eon-cargo-home"
mkdir -p "$CARGO_HOME"

A git insteadOf rule that rewrites https://github.com/ to SSH also rewrites Meson wrap downloads. Drop that rule for the configure, or the wrap fetch fails.

That configure has two Message Passing Interface (MPI) switches. with_mpi in meson_options.txt is the eOn client switch, and this build leaves it off. Calculator groups are the rgpot subproject switch, -Drgpot:with_mpi=enabled. ranks_per_image greater than 0 throws when that switch is off.

meson setup build-eessi \
  --prefix "$PWD/../eon-prefix" \
  --libdir lib \
  --buildtype release \
  -Dwith_tests=true \
  -Dpython.install_env=prefix \
  -Drgpot:with_mpi=enabled
meson compile -C build-eessi

Run the suite

Give the ranks a writable directory, and put that full path in TMPDIR. Keep OMP_NUM_THREADS at 1 so OpenMP does not multiply the ranks. When the host has fewer free cores than ranks, set OMPI_MCA_rmaps_base_oversubscribe to 1.

Those ranks, on a host whose user id is 0, need two further OpenMPI variables. OpenMPI refuses to start without them. A rootless namespace is that case. PMIX_MCA_psec=none skips the PMIx security handshake, which that namespace does not provide. A normal account can leave the two OMPI_ALLOW_RUN_AS_ROOT variables unset.

mkdir -p "$PWD/../eon-tmp"
export TMPDIR="$PWD/../eon-tmp"
export OMP_NUM_THREADS=1
export OMPI_MCA_rmaps_base_oversubscribe=1
export PMIX_MCA_psec=none
export OMPI_ALLOW_RUN_AS_ROOT=1
export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
meson test -C build-eessi --suite eon

Those ranks, on 2026-09-30, for develop commit 13b3b8a5, gave a suite of 48 passed and a fail count of 0. Later commits on develop add tests, so a newer checkout can report a higher pass count. The fail count on that run was 0.