Spack – scientific software package manager for supercomputers, Linux, and macOS
Original author here -- since I know that people click the comments to decide whether to read further, here&#x27;s a (biased?) summary:<p>Spack is aimed at end users, developers, and admins. It&#x27;s used primarily in HPC at the moment but it would be <i>great</i> to see use <i>outside</i> of the HPC community.<p>Spack supports:<p>1. Basic installation (spack install foo, foo@3.1.2, foo@3.1.2 +option, etc.)<p>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.<p>3. Building <i>many</i> versions of the same package, e.g. these are perfectly fine and can coexist:<p><pre><code>    - spack install hdf5
    - spack install hdf5 %clang
    - spack install hdf5 %oneapi@2023.2.0
    - spack install hdf5@1.18.0 cxxflags=&quot;-O3 -fast&quot; target=cascadelake
    - spack install hdf5 +mpi ^mpich
    - spack install hdf5 +mpi ^openmpi
</code></pre>
4. Both source builds and installation from relocatable binary caches<p>5. Lots of conditional features in packages that other systems do not offer, e.g.:<p><pre><code>  - injecting compiler flags
  - building for specific uarch targets
  - optional dependencies
  - very fine-grained options (e.g. +&#x2F;- 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.
</code></pre>
5. Autogenerating things like container recipes, CI pipelines, Lmod&#x2F;environment modules, etc.<p>6. Good support for building against external packages that may already be on your system.<p>At a <i>very</i> high level, Spack has:<p>* Nix&#x27;s installation model and configuration hashing<p>* Homebrew-like packages, but in a more expressive Python DSL, and with more versions&#x2F;options<p>* A very powerful dependency resolver that doesn&#x27;t just pick from a set of available configurations -- it configures your build according to <i>possible</i> configurations.<p>You could think of it like Nix with dependency resolution, but with a nice Python DSL. There is more on the &quot;concretizer&quot; (resolver) and how we&#x27;ve used ASP for it here:<p>* &quot;Using Answer Set Programming for HPC Dependency Solving&quot;, <a href="https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2210.08404" rel="nofollow">https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2210.08404</a>