Co-author/spack guy/occasional frequenter of Nix fora here.
Aside from what p4ul said above, the main architectural differences between Nix and Spack are:
1. Spack has a dependency solver (the "concretizer"), Nix does not
2. Spack packages are parameterized, and we solve for parameters
like build options, compilers, virtual dependencies, etc.,
so the user can say what tweaks they want on the CLI or in
an environment. To do this same with Nix packages you typically need
to hack on some nixpkgs. The goal of Spack is to be able to compose
and swap libraries, compilers, and other options easily.
3. Spack has more support for external packages (or "impure" packages
as the Nix people say). You can point it at an existing installation
on your system to use as a dependency.
Hashing installation directories, the store-based installation model described in the paper are things the two have in common.
Aside from what p4ul said above, the main architectural differences between Nix and Spack are: 1. Spack has a dependency solver (the "concretizer"), Nix does not 2. Spack packages are parameterized, and we solve for parameters like build options, compilers, virtual dependencies, etc., so the user can say what tweaks they want on the CLI or in an environment. To do this same with Nix packages you typically need to hack on some nixpkgs. The goal of Spack is to be able to compose and swap libraries, compilers, and other options easily. 3. Spack has more support for external packages (or "impure" packages as the Nix people say). You can point it at an existing installation on your system to use as a dependency.
Hashing installation directories, the store-based installation model described in the paper are things the two have in common.
More on the solver aspect in this other paper that we're also presenting next week: https://arxiv.org/abs/2210.08404