Spack is aimed at end users, developers, and admins. It's used primarily in HPC at the moment but it would be great to see use outside of the HPC community.
Spack supports:
1. Basic installation (spack install foo, foo@3.1.2, foo@3.1.2 +option, etc.)
2. Reproducible environments, via `spack.yaml` and `spack.lock` files that you can version in a repo. You can use this to build a custom software stack, build some dependencies for a project, etc.
3. Building many versions of the same package, e.g. these are perfectly fine and can coexist:
- spack install hdf5
- spack install hdf5 %clang
- spack install hdf5 %oneapi@2023.2.0
- spack install hdf5@1.18.0 cxxflags="-O3 -fast" target=cascadelake
- spack install hdf5 +mpi ^mpich
- spack install hdf5 +mpi ^openmpi
4. Both source builds and installation from relocatable binary caches5. Lots of conditional features in packages that other systems do not offer, e.g.:
- injecting compiler flags
- building for specific uarch targets
- optional dependencies
- very fine-grained options (e.g. +/- cuda, set cuda_arch, etc.)
- building the same package with different compilers
- building the same package with different potentially ABI-incompatible dependencies like MPI or different boost versions.
5. Autogenerating things like container recipes, CI pipelines, Lmod/environment modules, etc.6. Good support for building against external packages that may already be on your system.
At a very high level, Spack has:
* Nix's installation model and configuration hashing
* Homebrew-like packages, but in a more expressive Python DSL, and with more versions/options
* A very powerful dependency resolver that doesn't just pick from a set of available configurations -- it configures your build according to possible configurations.
You could think of it like Nix with dependency resolution, but with a nice Python DSL. There is more on the "concretizer" (resolver) and how we've used ASP for it here:
* "Using Answer Set Programming for HPC Dependency Solving", https://arxiv.org/abs/2210.08404