利用全自动化的“make_cp2k.sh”从Spack构建依赖并编译安装CP2K

Last Updated: 2026-04-15

自CP2K v2026.1发布以来,开发者正推动继迁移至CMake后的另一重大改变:放弃原有的toolchain安装链,转为利用几乎专为科学计算服务的第三方包管理器Spack为CP2K提供和安装依赖。目前的开发分支在CP2K程序包根目录下新增了一个脚本make_cp2k.sh,旨在很好地实现这一目的;用户只需按照提示运行这个脚本,就可以构建依赖+编译CP2K一条龙全自动化实现,相当方便。

目前这个脚本make_cp2k.sh已经相当完善,不过还是难免有一些漏洞之处;但照现在非常迅速的发展进度,我预计等到2026.2版本发布时,这一脚本应该已经能够几乎完全平替toolchain。

用户可以随时通过./make_cp2k.sh -h命令来获得该脚本的使用帮助和提示。以下是我使用make_cp2k.sh时的构建指令:

./make_cp2k.sh \
 -cv psmp \
 -df ace \
 -df deepmd \
 -df dlaf \
 -df greenx \
 -df libsmeagol \
 -df libtorch \
 -df mimic \
 -df openpmd \
 -df pexsi \
 -df plumed \
 -df sirius \
 -df trexio \
 -dlc -ue \
 -j 24 -np 2

以下做一点解释:

  • -cv--cp2k_version,指定你想安装的CP2K版本,目前该脚本支持三种:psmpssmpssmp-static,默认为psmp,即允许MPI并行,这也是最常用的版本。如果用了-cv psmp,则-mpi--mpi_mode将会起作用,默认为mpich,还可以用openmpi;如果用了-cv ssmp-cv ssmp-static,则-mpi将被设为no。如果你手动指定了与所想构建的CP2K版本不符的MPI选项,脚本将报错退出。

  • -df--disable_feature,这个选项可以用来取消你不需要的依赖支持,这样Spack就不会下载和安装你所需要的依赖,其余的都安装;相应地,还有个-ef--enable_feature,意思与上面恰好相反,若手动指定-ef所跟的安装包,Spack就下载和安装相应的包。相应地,下面自动执行的CMake指令也会实施上述更改。默认为-ef all。注意:1. 这两个选项不能同时跟多个包,必须为你想实施操作的每个依赖单独使用-df-ef;2.-ef选项 不会覆盖默认的-ef all ,因此如果你想 只安装 某些依赖,应当先加-df all来禁用所有可选依赖,然后再用-ef来加你想装的可选以来(也可以像我一样直接使用-df选项去掉你不想要的其他依赖);3. libvdwxc、spfft、spla、sirius这四个包有相互捆绑和依赖的关系,因此启用或禁用其中任何一个都会导致其中剩余的几个包一并被启用或禁用。

  • -dlc--disable_local_cache,的意思是不添加/保留本地缓存。好处是可以节省一些空间,且事先需要的依赖更少;代价就是万一中间某一步失败了,重新运行的时候所有依赖都要从头下载和安装(有了本地缓存,在利用Spack安装依赖这一阶段就会从断掉的地方继续,但起初的Spack自身等基础架构仍然会被重新下载和安装)。

  • -ue--use_externals,用了这个就会把一些系统已有的Spack依赖比如python添加进Spack所使用的环境变量中。注意一些非系统基础包,比如MPI和数学库,需要你在配置文件中额外指定路径才可以使得-ue对其生效。目前在使用-ue时,如果你的系统安装了meson,那么Spack会尝试使用自带的Python作为meson构建的依赖,这可能与系统已有的Python发生冲突(预计Spack v1.2中会得到解决),此时应当去掉-ue或者同时加上-dlc禁用本地缓存功能来解决该问题。

  • -j M-np N均为并行相关设置。“M”就是总的并行核数,如果不设置,脚本将通过nproc检测你的电脑CPU的可用线程数并将其设为默认值(然而这一命令受到额外的cgroup限制)。N则为Spack安装依赖过程中并行安装的包的数目,默认为4;由于部分包的个别编译步骤时间较长(例如libxc),因此可以通过恰当设置这一选项来加快整体构建速度。