从 Spack v0.17 开始,新的具体化器(concretizer)将成为默认设置,Spack 将自动从二进制文件安装一个新的依赖项(Clingo)。您可以选择禁用此引导程序(bootstrapping)。

Spack 及其自身依赖项

自发布之初,Spack 就有了软件要求,我们一直尽量将其限制在大多数机器上都能找到的基本系统要求之内。编译器、patchmake 等工具通常至少在 Linux 和 macOS 系统上是现成的,我们一直期望用户自行配置这些工具。

在 Spack v0.16 中,我们引入了一个选项来使用新的具体化器(依赖求解器),它基于底层的 Clingo。Clingo 是一个非常强大的答案集编程(Answer Set Programming)系统——它让我们能够解决 Spack 包之间复杂的约束问题——所有的版本、冲突、功能需求、可选依赖项以及编译器/目标兼容性问题现在都由 Clingo 处理(更多信息请点击此处)。通过使用 Clingo,我们能够处理更复杂的 Spack 环境,并修复了旧的贪婪具体化器在可具体化规范上失败,或者做出错误决策的问题。新的具体化器更易于维护,并使我们能够快速开发功能。它将使我们能够在未来更积极地重用依赖项并对更复杂的软件关系进行建模。

我们正在将新的具体化器设为默认设置

在 Spack v0.17 中,我们将使新的具体化器成为默认设置,但这意味着 Clingo 将成为一项先决条件,而大多数人默认情况下并没有安装它。然而,我们希望 Spack 在此更改后依然能够实现“开箱即用”。特别是,我们希望您在克隆 Spack 后能像以前一样立即使用 spack install

我们正在通过二进制文件引导它

我们的决定是:从 v0.17 开始,Spack 默认将从一个公共的构建缓存(buildcache)中安装部分依赖项,这些缓存包含可移植的二进制文件。我们用来创建此构建缓存的源代码是公开的,并托管在 GitHub 上。引导过程将是透明的——您执行的第一次具体化过程会稍微慢一些,因为二进制包会从构建缓存中获取,并通过其 SHA256 校验和进行验证。它看起来像这样

$ spack find -b
==> Showing internal bootstrap store at "/home/spack/.spack/bootstrap/store"
==> 0 installed packages

$ spack spec zlib
Input spec
--------------------------------
zlib

Concretized
--------------------------------
zlib@1.2.11%gcc@11.1.0+optimize+pic+shared arch=linux-ubuntu18.04-broadwell

$ spack find -b
==> Showing internal bootstrap store at "/home/spack/.spack/bootstrap/store"
==> 2 installed packages
-- linux-rhel5-x86_64 / gcc@9.3.0 -------------------------------
clingo-bootstrap@spack  python@3.6

此默认设置应能保持您习惯的 Spack 设置中“克隆即用”的简便性。

如果我不想使用 Spack 的二进制文件怎么办?

对于那些不想使用我们提供的公共二进制文件的用户,您可以选择退出引导程序,转而从源代码构建 Clingo。若要禁止从二进制文件进行引导,但仍允许 Spack 从源码引导,只需运行

$ spack bootstrap untrust github-actions
==> "github-actions" is now untrusted and will not be used for bootstrapping

若要完全禁用任何引导程序,您可以运行

$ spack bootstrap disable

如果您这样做,则需要确保自行正确安装了 Spack 的先决条件。例如,如果您知道运行 Spack 所使用的 python 环境中已经安装了 Clingo(例如使用 pip 安装的),则可以使用此选项。

有关引导程序工作原理的更多详细信息,您可以查看 pull request #22720。此外,请关注我们永久置顶的问题,了解即将进入 Spack develop 分支的其他重要更改。