Tutorial setup

If you have not done the prior sections, you’ll need to start the docker image:

docker run -it ghcr.io/spack/tutorial:hpcic26

and then set Spack up like this:

git clone --depth=2 --branch=releases/v1.2 https://github.com/spack/spack
. spack/share/spack/setup-env.sh
spack mirror add --unsigned tutorial /mirror
spack bootstrap now
spack compiler find

See the Basic Installation Tutorial for full details on setup. For more help, join us in the #tutorial channel on Slack – get an invitation at slack.spack.io

Scripting with Spack

This tutorial introduces advanced scripting features available in Spack, using the spack find and spack python commands. We’ve already seen how to list and search installed packages with spack find. The spack python command allows us to write more complex queries, as it gives access to all of Spack’s internal APIs.

Since Spack has an extensive API, we’ll only scratch the surface here.

Scripting with spack find

The output we’ve seen from spack find has been for human consumption. We can take advantage of the command’s advanced features to generate machine-readable output suitable for piping to a script.

spack find --format

The main function of spack find is to display concrete specs that correspond to installed packages. By default, they are shown with default attributes, like the @version suffix.

The --format argument allows us to display the specs using custom format strings.

Suppose we only want to see the name, version, and first ten (10) characters of the hash for every package installed in the Spack instance. This output can be generated with the following command:

$ spack find --format "{name} {version} {hash:10}"
adept-utils 1.0.1 naehq6ldod	   llvm 21.1.8 px4mv6leqp
autoconf 2.72 jo3eg4rjvu	   lmod 8.7.67 wf22jsggn5
automake 1.18.1 yhkgfaibmq	   lua 5.4.8 q66mudlsap
berkeley-db 18.1.40 27d4iypuci	   lua-luafilesystem 1.9.0 su5b2hsgwg
binutils 2.46.1 6ene6zrpqg	   lua-luaposix 36.3 egzwtikjsf
boost 1.72.0 52pdqqjhv3		   lwgrp 1.0.6 vce7blyslk
bzip2 1.0.8 cbtgjrhpwi		   lz4 1.10.0 ozuoqp53ae
bzip2 1.0.8 5kv66tqcv6		   m4 1.4.21 y6uqrtoi6s
callpath 1.0.4 xksxwmqijj	   macsio 1.1 4x6m3h66yg
cmake 3.31.11 a4wqsr7jgu	   macsio 1.1 mwcffrktix
compiler-wrapper 1.1.0 mmywg7x4my  mpc 1.4.1 gxmoxea2jy
curl 8.20.0 j2fa7xlzdv		   mpfr 4.2.2 melg7gafko
dtcmp 1.1.5 cjk3tolu6w		   mpich 5.0.1 xkilhym6dn
dyninst 13.0.0 kurk3h3kbs	   mpich 5.0.1 fxetsgw62g
elfutils 0.194 qqik7au6w4	   munge 0.5.18 2rzdjfo4s3
expat 2.8.1 d462mhwofp		   ncurses 6.6 ekvivpvwxp
expat 2.8.1 kqm2d3gvvu		   ncurses 6.6 romubi25ey
file 5.46 mguwetco63		   netlib-lapack 3.12.1 77mpzq52bk
findutils 4.10.0 punbqrxx5v	   netlib-scalapack 2.2.3 ugsrem2k5c
gcc 14.3.0 5zrvmb3qx7		   netlib-scalapack 2.2.3 y2obsoclpu
gcc 15.2.0 cl66sen4hs		   netlib-scalapack 2.2.3 6twt5ypw7p
gcc 15.2.0 yjlog5xxyg		   netlib-scalapack 2.2.3 faqiqu4wbw
gcc 16.1.0 hkkcdmj2gu		   nghttp2 1.67.1 4lyasazukl
gcc-runtime 15.2.0 yhhe2wecmh	   numactl 2.0.19 2t2useutfy
gcc-runtime 15.2.0 xm76mt35el	   numactl 2.0.19 vn7wvoehm2
gcc-runtime 16.1.0 nn3xbub7zh	   openblas 0.3.33 7kdghmrs2g
gdbm 1.26 cq4dkucz57		   openblas 0.3.33 uh2kn3ctzg
gdbm 1.26 2qw4v6642b		   openmpi 5.0.10 qfut5qqwp2
gettext 1.0 sle3ix4niz		   openmpi 5.0.10 s6hcsd5arf
gettext 1.0 qdxpkom3wt		   openssh 10.3p1 m6yx5j3src
glib 2.88.1 6jow2egi2l		   openssh 10.3p1 plgdjpahip
glibc 2.43 ublhg653t6		   openssl 3.6.1 33yozp5l5c
glibc 2.43 yc4n2ppjkm		   openssl 3.6.1 mladgc5eep
gmake 4.4.1 cdyuto2vcd		   pcre2 10.44 hxboy227go
gmake 4.4.1 r4lhaokbvy		   pdsh 2.35 42p3mgwu44
gmp 6.3.0 xpmsy5xffe		   perl 5.42.0 bvphs3b3ja
hdf5 1.14.6 as6mmcjwjl		   pigz 2.8 afklka7uur
hdf5 1.14.6 7cwv3stkmk		   pigz 2.8 7ppidiedss
hdf5 1.14.6 jceyzq7qva		   pkgconf 2.5.1 yvl6jpilvk
hwloc 2.13.0 ujctyeyjzv		   pmix 6.1.0 ycyqykw634
hwloc 2.13.0 fkki5gmowq		   pmix 6.1.0 2vgljh5yyo
intel-tbb 2023.0.0 tf2gxcsr5v	   prrte 4.1.0 nldxmxwkhu
json-c 0.18 wzb5pq2lxt		   prrte 4.1.0 wwm2ix6ijb
json-cwx 0.12 vluhg4wrbf	   py-numpy 2.4.6 gvvfhjhkhi
kokkos 5.1.1 kpwomw3oxg		   py-pybind11 3.0.2 jv2364qenp
kokkos-kernels 5.1.1 ml3q3dq5ch	   py-scipy 1.17.1 s2p5dpl2sr
krb5 1.22.2 ldqeqfwa76		   python 3.14.5 derywaqkj5
krb5 1.22.2 7a4l5v5nat		   python 3.14.5 vuoqpmohlx
less 692 ohmdb2lfmv		   python-venv 1.0 j76kyd42la
libbsd 0.12.2 7o3mv6c3do	   python-venv 1.0 iyp4dooj6g
libbsd 0.12.2 2zdnupjtph	   readline 8.3 k25xiihp5d
libdwarf 2.3.0 rji2bticj7	   readline 8.3 teh56foom4
libedit 3.1-20251016 uwyh3xy52r	   scr 2.0.0 bdhwshgs2z
libedit 3.1-20251016 4binz2pyum	   scr 2.0.0 fzyxmihh5a
libevent 2.1.12 oopqoagvk4	   silo 4.12.0 lw4y63zl33
libevent 2.1.12 ul3skjateb	   slurm 25-05-1-1 yg45f3qjki
libfabric 2.5.1 itb4a2swgf	   sqlite 3.53.1 unjd5day6p
libfabric 2.5.1 o3dcvlbnly	   sqlite 3.53.1 qy73hymb6h
libffi 3.5.2 aiceoszqyf		   tar 1.35 f5xe4pxauj
libffi 3.5.2 pkl6qupano		   tar 1.35 u62ty4dsid
libgcrypt 1.12.2 ksohnknooj	   tcl 8.6.17 d4ibosbgfm
libgpg-error 1.61 qxxesj62dd	   trilinos 17.1.1 66pfqb7gv7
libiberty 2.46.0 ftcprn47kv	   trilinos 17.1.1 i3pydqndbu
libiconv 1.18 vbwvgwxvjr	   unzip 6.0 4qgksuyoha
libiconv 1.18 xrsocgcig7	   util-linux-uuid 2.41 clufswxoi5
libmd 1.1.0 yvvn7mur5p		   util-linux-uuid 2.41 2wcnb6nky3
libmd 1.1.0 ypuui7vsqi		   xz 5.8.3 hhjyyqygxt
libpciaccess 0.17 qzkk5ymbu3	   xz 5.8.3 rrvhelyvar
libpciaccess 0.17 t5frspjun7	   zlib-ng 2.0.7 aeoqp4ey2p
libsigsegv 2.15 phcmfqkiob	   zlib-ng 2.3.3 g72d7i3bvg
libtool 2.5.4 3gdq456dec	   zlib-ng 2.3.3 gc236khsrb
libxcrypt 4.5.2 bkzcu2s2hn	   zlib-ng 2.3.3 5dji3nxkz5
libxcrypt 4.5.2 aca7p7lojt	   zlib-ng 2.3.3 t7jnrlgayh
libxml2 2.15.3 ujlg2uai6q	   zlib-ng 2.3.3 6l3ycpy4cr
libxml2 2.15.3 3rlsf7j7jg	   zstd 1.5.7 63aruxky3a
libyogrt 1.35 dv2btw3jwr	   zstd 1.5.7 mzuiikvvru

Note that name, version, and hash are attributes of Spack’s internal Spec object and enclosing them in braces ensures they are output according to the format string.

spack find --format can be combined with typical command line tools like sort or uniq to retrieve information relevant to specific workflows.

spack find --json

Alternatively, we can get a serialized version of Spec objects in the JSON format using the --json option.

For example, to get attributes for all installations of zlib-ng:

$ spack find --json zlib-ng

This command provides complete information about any spec of interest in a structured format. The output of spack find --json can be piped to JSON filtering tools like jq to extract specific information.

Visit basic usage docs for more examples.

Introducing the spack python command

What if we need to perform more advanced queries?

Spack provides the spack python command to launch an interpreter with Spack’s Python modules available to import. The underlying Python instance is used for all other commands. We can write scripts to:

  • run Spack commands

  • explore abstract and concretized specs

  • directly access other internal components of Spack

Let’s launch a Spack-aware Python interpreter by entering:

$ spack python
exit()
Spack version 1.2.1
Python 3.14.5, Linux x86_64
>>> exit()
now exiting InteractiveConsole...

As we are in a Python interpreter, use exit() to end the session and return to the terminal.

Accessing the Spec object

Let’s take a look at the internal representation of the Spack Spec. As previously mentioned, specs can be either abstract or concrete. The specs we’ve seen in package.py files (e.g., in the install() method) have been concrete, or fully specified. Specs typed on the command line have been abstract. Understanding the differences between the two types is key to using Spack’s internal API.

Let’s open another Python interpreter with spack python, instantiate the zlib spec, and check a few properties of an abstract spec:

  >>> from spack.spec import Spec
  >>> zlib = Spec('zlib target=x86_64_v3')
  >>> zlib.concrete
  False
  >>> zlib.version
  Traceback (most recent call last):
    File "<console>", line 1, in <module>
    File "/home/spack/spack/lib/spack/spack/spec.py", line 3166, in version
      raise SpecError("Spec version is not concrete: " + str(self))
  spack.error.SpecError: Spec version is not concrete: zlib target=x86_64_v3
  >>> zlib.versions
  [:]
  >>> str(zlib.architecture)
  'None-None-x86_64_v3'

Notice that there are Spec properties and methods not accessible to abstract specs; specifically:

  • an exception – SpecError – is raised if we try to access its version

  • there are no associated versions

  • the spec’s operating system is None

Without exiting the interpreter, let’s concretize the spec and try again:

  >>> from spack.concretize import concretize_one
  >>> zlib_concrete = spack.concretize.concretize_one(zlib)
  >>> zlib_concrete.concrete
  True
  >>> zlib_concrete.version
  Version("1.3.2")
  >>> zlib_concrete.versions
  [Version("1.3.2")]
  >>> str(zlib_concrete.architecture)
  'linux-ubuntu26.04-x86_64_v3'

Notice that the concretized spec now:

  • has a version

  • has a single entry in its versions list

  • the operating system is now ubuntu22.04

Querying the Spack database

More powerful queries are available when we look at the information stored in the Spack database. The Database object in Spack is in the spack.store.STORE.db variable. We’ll interact with it mainly through the query() method. Let’s see the documentation available for query() using Python’s built-in help() function:

>>> import spack.store
>>> help(spack.store.STORE.db.query)
Help on method query in module spack.database:

query(query_spec: Union[str, ForwardRef('spack.spec.Spec'), NoneType] = None, *, predicate_fn: Optional[Callable[[spack.database.InstallRecord], bool]] = None, installed: Union[bool, spack.enums.InstallRecordStatus] = True, explicit: Optional[bool] = None, start_date: Optional[datetime.datetime] = None, end_date: Optional[datetime.datetime] = None, in_buildcache: Optional[bool] = None, hashes: Optional[List[str]] = None, origin: Optional[str] = None, install_tree: str = 'all') -> List[ForwardRef('spack.spec.Spec')] method of spack.database.Database instance
    Queries the Spack database including all upstream databases.

    Args:
        query_spec:  if query_spec is ``None``, match all specs in the database.
            If it is a spec, return all specs matching ``spec.satisfies(query_spec)``.

        predicate_fn: optional predicate taking an InstallRecord as argument, and returning
            whether that record is selected for the query. It can be used to craft criteria
            that need some data for selection not provided by the Database itself.

        installed: if ``True``, includes only installed specs in the search. If ``False`` only
            missing specs, and if ``any``, all specs in database. If an InstallStatus or
            iterable of InstallStatus, returns specs whose install status matches at least
            one of the InstallStatus.

        explicit: a spec that was installed following a specific user request is marked as
            explicit. If instead it was pulled-in as a dependency of a user requested spec
            it's considered implicit.

        start_date: if set considers only specs installed from the starting date.

        end_date: if set considers only specs installed until the ending date.

        in_buildcache: specs that are marked in this database as part of an associated binary
            cache are ``in_buildcache``. All other specs are not. This field is used for
            querying mirror indices. By default, it does not check this status.

        hashes: list of hashes used to restrict the search

        install_tree: query 'all' (default), 'local', 'upstream', or upstream path

        origin: origin of the spec
(END)

We’ll primarily make use of the query_spec argument.

Recall that spack find is limited to queries of attributes with matching values. It cannot be used to find packages that do not meet a specific condition.

We can use the Python interface to write these types of queries. For example, let’s find all packages that were compiled with gcc but do not depend on mpich. We can do this by using custom Python code and Spack database queries. We will use the spack.cmd.display_specs for output to achieve the same printing functionality as the spack find command:

  >>> gcc_query_spec = Spec('%gcc')
  >>> gcc_specs = spack.store.STORE.db.query(gcc_query_spec)
  >>> result = [spec for spec in gcc_specs if not spec.satisfies('^mpich')]
  >>> import spack.cmd
  >>> spack.cmd.display_specs(result)
  -- linux-ubuntu26.04-x86_64_v3 / gcc@15.2.0 -------------------------
autoconf@2.72                       gdbm@1.23             libsigsegv@2.14   perl@5.38.0
automake@1.16.5                     gettext@0.22.5        libtool@2.4.7     pigz@2.8
berkeley-db@18.1.40                 glibc@2.35            libxcrypt@4.4.35  pkgconf@2.2.0
bison@3.8.2                         gmake@4.4.1           libxml2@2.10.3    pmix@5.0.1
bzip2@1.0.8                         hdf5@1.14.3           m4@1.4.19         readline@8.2
ca-certificates-mozilla@2023-05-30  hwloc@2.9.1           ncurses@6.5       tar@1.34
cmake@3.27.9                        krb5@1.20.1           nghttp2@1.57.0    util-macros@1.19.3
curl@8.7.1                          libedit@3.1-20230828  numactl@2.0.14    xz@5.4.6
diffutils@3.10                      libevent@2.1.12       openmpi@5.0.3     zlib-ng@2.1.6
findutils@4.9.0                     libiconv@1.17         openssh@9.7p1     zstd@1.5.6
gcc-runtime@11.4.0                  libpciaccess@0.17     openssl@3.3.0

Now we have a powerful query not available through spack find.

Exit the interpreter to return to the command line:

>>> exit()

before generalizing the functionality for reuse.

Using scripts

Next, the script can be updated to accept arguments from the command line. By generalizing the script to take include and exclude specs as arguments, it becomes a flexible, general-purpose query tool.

Open a file called find_exclude.py in a text editor and add the following code:

from spack.spec import Spec
import spack.store
import spack.cmd
import sys

include_spec = Spec(sys.argv[1])
exclude_spec = Spec(sys.argv[2])

all_included = spack.store.STORE.db.query(include_spec)
result = [spec for spec in all_included if not spec.satisfies(exclude_spec)]

spack.cmd.display_specs(result)

We added importing and using the system package (sys) to access the first and second command line arguments.

Now we can run our new script by entering the following:

$ spack python find_exclude.py %gcc ^mpich
-- linux-ubuntu26.04-x86_64_v3 / %c,cxx,fortran=gcc@15.2.0 ------
mpich@5.0.1	 openmpi@5.0.10	 scr@2.0.0    trilinos@17.1.1
openblas@0.3.33	 scr@2.0.0	 silo@4.12.0

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx,fortran=gcc@16.1.0 ------
mpich@5.0.1  openblas@0.3.33  openmpi@5.0.10  py-scipy@1.17.1

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx=gcc@15.2.0 --------------
adept-utils@1.0.1    dyninst@13.0.0  hwloc@2.13.0	 m4@1.4.21	 python@3.14.5
berkeley-db@18.1.40  elfutils@0.194  intel-tbb@2023.0.0	 macsio@1.1	 tcl@8.6.17
binutils@2.46.1	     expat@2.8.1     krb5@1.22.2	 macsio@1.1	 zlib-ng@2.0.7
boost@1.72.0	     gcc@16.1.0	     libdwarf@2.3.0	 ncurses@6.6	 zlib-ng@2.3.3
callpath@1.0.4	     gettext@1.0     libffi@3.5.2	 nghttp2@1.67.1	 zlib-ng@2.3.3
cmake@3.31.11	     glib@2.88.1     libiberty@2.46.0	 openssh@10.3p1	 zlib-ng@2.3.3
curl@8.20.0	     gmp@6.3.0	     lz4@1.10.0		 openssl@3.6.1	 zstd@1.5.7

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx=gcc@16.1.0 --------------
expat@2.8.1  hwloc@2.13.0  libffi@3.5.2	 openssh@10.3p1	 py-numpy@2.4.6	 zlib-ng@2.3.3
gettext@1.0  krb5@1.22.2   ncurses@6.6	 openssl@3.6.1	 python@3.14.5	 zstd@1.5.7

-- linux-ubuntu26.04-x86_64_v3 / %c,fortran=gcc@15.2.0 ----------
libyogrt@1.35

-- linux-ubuntu26.04-x86_64_v3 / %c,fortran=gcc@16.1.0 ----------
netlib-lapack@3.12.1  netlib-scalapack@2.2.3  netlib-scalapack@2.2.3

-- linux-ubuntu26.04-x86_64_v3 / %c=gcc@15.2.0 ------------------
automake@1.18.1	  libbsd@0.12.2		lmod@8.7.67		 pkgconf@2.5.1
bzip2@1.0.8	  libedit@3.1-20251016	lua@5.4.8		 pmix@6.1.0
dtcmp@1.1.5	  libevent@2.1.12	lua-luafilesystem@1.9.0	 prrte@4.1.0
file@5.46	  libfabric@2.5.1	lua-luaposix@36.3	 readline@8.3
findutils@4.10.0  libgcrypt@1.12.2	lwgrp@1.0.6		 slurm@25-05-1-1
gdbm@1.26	  libgpg-error@1.61	mpc@1.4.1		 sqlite@3.53.1
gmake@4.4.1	  libiconv@1.18		mpfr@4.2.2		 tar@1.35
gmake@4.4.1	  libmd@1.1.0		munge@0.5.18		 unzip@6.0
hdf5@1.14.6	  libpciaccess@0.17	numactl@2.0.19		 util-linux-uuid@2.41
hdf5@1.14.6	  libsigsegv@2.15	pcre2@10.44		 xz@5.8.3
json-c@0.18	  libtool@2.5.4		pdsh@2.35
json-cwx@0.12	  libxcrypt@4.5.2	perl@5.42.0
less@692	  libxml2@2.15.3	pigz@2.8

-- linux-ubuntu26.04-x86_64_v3 / %c=gcc@16.1.0 ------------------
bzip2@1.0.8	      libevent@2.1.12  libpciaccess@0.17  pigz@2.8	sqlite@3.53.1
gdbm@1.26	      libfabric@2.5.1  libxcrypt@4.5.2	  pmix@6.1.0	tar@1.35
libbsd@0.12.2	      libiconv@1.18    libxml2@2.15.3	  prrte@4.1.0	util-linux-uuid@2.41
libedit@3.1-20251016  libmd@1.1.0      numactl@2.0.19	  readline@8.3	xz@5.8.3

-- linux-ubuntu26.04-x86_64_v3 / %cxx=gcc@15.2.0 ----------------
kokkos@5.1.1  kokkos-kernels@5.1.1

-- linux-ubuntu26.04-x86_64_v3 / %cxx=gcc@16.1.0 ----------------
py-pybind11@3.0.2

-- linux-ubuntu26.04-x86_64_v3 / no compilers -------------------
gcc-runtime@15.2.0  gcc-runtime@15.2.0	gcc-runtime@16.1.0

This works well, as long as we remember to use Spack’s python command to run it.

Using the spack-python executable

What if the script needs to be shared with others, without requiring them to remember to use spack python?

This can be done by adding a shebang line as the first line of the Python script, which allows it to be run as an executable. However, there is an important limitation to be aware of, as shown in the next example.

Open the find_exclude.py script we created above and add the shebang line with spack python as the arguments to env:

#!/usr/bin/env spack python
from spack.spec import Spec
import spack.store
import spack.cmd
import sys

include_spec = Spec(sys.argv[1])
exclude_spec = Spec(sys.argv[2])

all_included = spack.store.STORE.db.query(include_spec)
result = [spec for spec in all_included if not spec.satisfies(exclude_spec)]

spack.cmd.display_specs(result)

Exit the editor and add execute permissions to the script before running it as follows:

$ chmod u+x find_exclude.py
$ ./find_exclude.py %gcc ^mpich
env: 'spack python': Permission denied

If we’re lucky, it ran successfully, but there’s no guarantee this will work for every system. Some systems only support a single argument on the shebang line (see here). spack-python, which is a wrapper script for spack python, solves this issue.

Bring up the file in the editor again and change the env argument to spack-python as follows:

#!/usr/bin/env spack-python
from spack.spec import Spec
import spack.store
import spack.cmd
import sys

include_spec = Spec(sys.argv[1])
exclude_spec = Spec(sys.argv[2])

all_included = spack.store.STORE.db.query(include_spec)
result = [spec for spec in all_included if not spec.satisfies(exclude_spec)]

spack.cmd.display_specs(result)

Exit the editor and run the script again:

$ ./find_exclude.py %gcc ^mpich
-- linux-ubuntu26.04-x86_64_v3 / %c,cxx,fortran=gcc@15.2.0 ------
mpich@5.0.1	 openmpi@5.0.10	 scr@2.0.0    trilinos@17.1.1
openblas@0.3.33	 scr@2.0.0	 silo@4.12.0

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx,fortran=gcc@16.1.0 ------
mpich@5.0.1  openblas@0.3.33  openmpi@5.0.10  py-scipy@1.17.1

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx=gcc@15.2.0 --------------
adept-utils@1.0.1    dyninst@13.0.0  hwloc@2.13.0	 m4@1.4.21	 python@3.14.5
berkeley-db@18.1.40  elfutils@0.194  intel-tbb@2023.0.0	 macsio@1.1	 tcl@8.6.17
binutils@2.46.1	     expat@2.8.1     krb5@1.22.2	 macsio@1.1	 zlib-ng@2.0.7
boost@1.72.0	     gcc@16.1.0	     libdwarf@2.3.0	 ncurses@6.6	 zlib-ng@2.3.3
callpath@1.0.4	     gettext@1.0     libffi@3.5.2	 nghttp2@1.67.1	 zlib-ng@2.3.3
cmake@3.31.11	     glib@2.88.1     libiberty@2.46.0	 openssh@10.3p1	 zlib-ng@2.3.3
curl@8.20.0	     gmp@6.3.0	     lz4@1.10.0		 openssl@3.6.1	 zstd@1.5.7

-- linux-ubuntu26.04-x86_64_v3 / %c,cxx=gcc@16.1.0 --------------
expat@2.8.1  hwloc@2.13.0  libffi@3.5.2	 openssh@10.3p1	 py-numpy@2.4.6	 zlib-ng@2.3.3
gettext@1.0  krb5@1.22.2   ncurses@6.6	 openssl@3.6.1	 python@3.14.5	 zstd@1.5.7

-- linux-ubuntu26.04-x86_64_v3 / %c,fortran=gcc@15.2.0 ----------
libyogrt@1.35

-- linux-ubuntu26.04-x86_64_v3 / %c,fortran=gcc@16.1.0 ----------
netlib-lapack@3.12.1  netlib-scalapack@2.2.3  netlib-scalapack@2.2.3

-- linux-ubuntu26.04-x86_64_v3 / %c=gcc@15.2.0 ------------------
automake@1.18.1	  libbsd@0.12.2		lmod@8.7.67		 pkgconf@2.5.1
bzip2@1.0.8	  libedit@3.1-20251016	lua@5.4.8		 pmix@6.1.0
dtcmp@1.1.5	  libevent@2.1.12	lua-luafilesystem@1.9.0	 prrte@4.1.0
file@5.46	  libfabric@2.5.1	lua-luaposix@36.3	 readline@8.3
findutils@4.10.0  libgcrypt@1.12.2	lwgrp@1.0.6		 slurm@25-05-1-1
gdbm@1.26	  libgpg-error@1.61	mpc@1.4.1		 sqlite@3.53.1
gmake@4.4.1	  libiconv@1.18		mpfr@4.2.2		 tar@1.35
gmake@4.4.1	  libmd@1.1.0		munge@0.5.18		 unzip@6.0
hdf5@1.14.6	  libpciaccess@0.17	numactl@2.0.19		 util-linux-uuid@2.41
hdf5@1.14.6	  libsigsegv@2.15	pcre2@10.44		 xz@5.8.3
json-c@0.18	  libtool@2.5.4		pdsh@2.35
json-cwx@0.12	  libxcrypt@4.5.2	perl@5.42.0
less@692	  libxml2@2.15.3	pigz@2.8

-- linux-ubuntu26.04-x86_64_v3 / %c=gcc@16.1.0 ------------------
bzip2@1.0.8	      libevent@2.1.12  libpciaccess@0.17  pigz@2.8	sqlite@3.53.1
gdbm@1.26	      libfabric@2.5.1  libxcrypt@4.5.2	  pmix@6.1.0	tar@1.35
libbsd@0.12.2	      libiconv@1.18    libxml2@2.15.3	  prrte@4.1.0	util-linux-uuid@2.41
libedit@3.1-20251016  libmd@1.1.0      numactl@2.0.19	  readline@8.3	xz@5.8.3

-- linux-ubuntu26.04-x86_64_v3 / %cxx=gcc@15.2.0 ----------------
kokkos@5.1.1  kokkos-kernels@5.1.1

-- linux-ubuntu26.04-x86_64_v3 / %cxx=gcc@16.1.0 ----------------
py-pybind11@3.0.2

-- linux-ubuntu26.04-x86_64_v3 / no compilers -------------------
gcc-runtime@15.2.0  gcc-runtime@15.2.0	gcc-runtime@16.1.0

It will now work on any system with Spack installed.

With these tools, we can create custom Spack queries and prototype new ideas. Contributions that improve or extend common Spack workflows are always welcome in the community.