计算化学公社

 找回密码 Forget password
 注册 Register
Views: 4068|回复 Reply: 59
打印 Print 上一主题 Last thread 下一主题 Next thread

[CP2K] 利用cmake编译和安装CP2K

[复制链接 Copy URL]

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 UW_0728. 于 2026-2-11 18:10 编辑

从版本2026.1开始,CP2K的编译将全面转为cmake,彻底放弃原有的GNU makefile和相应的arch文件集。个人感觉在cmake下编译比传统的编译模式报错概率更低一点。然而,目前toolchain尚未实现针对自定义的配置设计合适的cmake指令,因此只能自己根据CMakeLists.txt里面的选项逐个添加与既有toolchain配置相对应的到命令行中,比较麻烦,且开发者貌似并不打算解决这一点;另外,目前无法通过cmake同时编译ssmp和psmp(检测出MPI就只编译psmp,否则只编译ssmp),且编译成的程序没有相应的符号链接sopt和popt,不过这不算什么大问题,毕竟psmp同时支持MPI和OpenMP并行,只要设置OMP_NUM_THREADS为物理核心数且不用mpirun指令就相当于运行ssmp,只要export OMP_NUM_THREADS=1 并利用mpirun -np N (N为并行核数)运行就相当于运行popt了;此外,我发现CP2K对sopt/popt版本中相应设置的实现是通过Fortran主代码中的几行完成的,因此实际上你完全可以在二进制文件目录下自己创建这样的符号链接。(补充:目前开发分支已经在cmake的install一步加回了popt和sopt符号链接的创建命令)

接下来讲一讲从cmake编译CP2K可执行文件的基本步骤:(假设为root用户,使用2026.1版本;更早版本用传统模式编译更省事一点)

1. 按照社长的文章(http://sobereva.com/586)正常完成toolchain工具链安装步骤,然后执行source /root/CP2K/src/cp2k-2026.1/tools/toolchain/install/setup

2. 切到cp2k源码目录,执行mkdir build && cd build,进入构建和编译专用目录。

3. 运行构建指令。如上所述,这里需要手动输入构建选项。假如完全按照社长文章里的选项配置好toolchain,那么你所需要的cmake命令为:
cmake .. -DCMAKE_INSTALL_PREFIX=../install -DCP2K_USE_MPI=ON -DCP2K_USE_FFTW3=ON -DCP2K_USE_LIBINT2=ON -DCP2K_USE_LIBXC=ON -DCP2K_USE_SPGLIB=ON -DCP2K_USE_VORI=ON -DCP2K_USE_COSMA=ON -DCP2K_USE_ELPA=ON -DCP2K_USE_LIBXSMM=ON -DCP2K_USE_PLUMED=ON -DCP2K_USE_SIRIUS=ON -DCP2K_USE_TBLITE=ON -DCP2K_DATA_DIR=/root/CP2K/src/cp2k-2026.1/data

这里包括toolchain默认安装的,以及根据自己的设置选择多安装或不安装的包。命令中的-DCMAKE_INSTALL_PREFIX 设置到自己想安装到的路径(可以使用相对路径;为省事我直接设置在了父目录下的一个新文件夹;如果不设置,默认将为/usr/local)。由于OpenBLAS是强制性的、Scalapack在有MPI的情况下是强制性的,因此无论如何它们都会被检查,这里无需写出。之所以特别设置-DCP2K_DATA_DIR=/root/CP2K/src/cp2k-2026.1/data是因为cmake构建系统安装好后默认读取基组的位置是${CMAKE_INSTALL_PREFIX}/shared/cp2k/data,会导致编译时生成与/root/CP2K/src/cp2k-2026.1/data内容完全重复的/root/CP2K/src/cp2k-2026.1/install/shared/cp2k/data目录,加上这一设置可以避免这一问题(但注意这里不能使用相对路径)

2026-01-26补充:根据
https://github.com/cp2k/cp2k/commit/9513a73f5c67e4b564ec780b7019669123e3b5ce目前的CP2K开发分支已经能够在toolchain安装结束时给出与toolchain设置相匹配的CMake配置选项,预计下一个版本2026.2中会包含。大家可以直接看那里面的文件修改详情(generate_cmake_options.sh在后来也有些细节上的修补),然后把经修改和添加的文件直接复制粘贴到自己下载好的源代码包相应位置,就可以正常用了;此时toolchain安装结束后会在最后输出推荐的cmake选项,可以直接将整个命令复制粘贴使用。

4. 构建完成后,运行
make install -jN,N是并行核数。

5. 写入以下三行至~/.bashrc中以添加环境变量:
export PATH=$PATH:/root/CP2K/src/cp2k-2026.1/install/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/CP2K/src/cp2k-2026.1/install/lib64
source /root/CP2K/src/cp2k-2026.1/tools/toolchain/install/setup


6. 如果硬盘有点吃紧,可以
删除该build文件夹(或者不删除但在build目录内执行make clean)以腾出部分空间。

评分 Rate

参与人数
Participants 3
eV +10 收起 理由
Reason
北大-陶豫 + 5
牧生 + 2 终于装上2025.2了
LittlePupil + 3 谢谢分享

查看全部评分 View all ratings

Failed to load the content due to unknown reasons.

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

60#
 楼主 Author| 发表于 Post on 2026-4-18 21:20:28 | 只看该作者 Only view this author
Uus/pMeC6H4-/キ 发表于 2026-3-11 12:31
我想问个小问题。上周PR #4865在更新toolchain里的libint到2.13.1版的同时也新增了系统包管理器安装boost和 ...

https://github.com/cp2k/cp2k/pull/5072 把这两个需要包管理器安装的硬依赖去掉了,eigen3不再需要,boost用libint源码包自带的
Failed to load the content due to unknown reasons.

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

59#
 楼主 Author| 发表于 Post on 2026-3-31 12:16:39 | 只看该作者 Only view this author
Uus/pMeC6H4-/キ 发表于 2026-3-31 11:41
明白了,这样现行开发版建议的 cmake 指令确实是比较省事的。(发帖发重了哦)之前 @乐平 提的https://gi ...

直接进入build目录,加载好该有的环境,运行make install即可。构建系统会自动检查哪些代码发生了变化,然后只重新编译那些代码与可能受相关改动影响的另外几个代码。

评分 Rate

参与人数
Participants 1
eV +1 收起 理由
Reason
Uus/pMeC6H4-/キ + 1 谢谢分享

查看全部评分 View all ratings

Failed to load the content due to unknown reasons.

1330

帖子

6

威望

2828

eV
积分
4278

Level 6 (一方通行)

傻傻的木瓜

58#
发表于 Post on 2026-3-31 11:41:50 | 只看该作者 Only view this author
UW_0728. 发表于 2026-3-31 11:07
对于同一个构建流程,--target install安装到的地方就是CMAKE_INSTALL_PREFIX设置的地方,两者毫无区别, ...

明白了,这样现行开发版建议的 cmake 指令确实是比较省事的。(发帖发重了哦)之前 @乐平 提的https://github.com/cp2k/cp2k/issues/4705应该已经解决、可以关闭了。

还有一个小问题,如果已经编译安装了一次CP2K的二进制可执行文件,然后修改了./src里的fortran源代码,有没有比“用整套源代码文件在不冲突的目录下从头跑完整的build和install流程”更短的编译安装方式来做测试?
√546=23.36664289109

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

57#
 楼主 Author| 发表于 Post on 2026-3-31 11:07:52 | 只看该作者 Only view this author
Uus/pMeC6H4-/キ 发表于 2026-3-31 10:44
cmake里面install目录具体是以-DCMAKE_INSTALL_PREFIX选项为准,还是以--target install设置的为准,特别 ...

对于同一个构建流程,--target install安装到的地方就是CMAKE_INSTALL_PREFIX设置的地方,两者毫无区别,所以要换install目录要么重运行一遍cmake(但是接下来应该不会再经历后面长时间的编译流程,而是只影响安装部分,因为只有CMAKE_INSTALL_PREFIX这一个选项被覆盖了),要么临时设置新的环境变量,比如运行"CMAKE_INSTALL_PREFIX=./install cmake --install build"(纠正:这里不应该跟install,而是build,从构建目录安装)。

"cmake --build build --target install"相当于是"cmake --build build"和"cmake --install build"合二为一;后者只是把构建好的东西安装在指定目录下,无法执行build操作。这与"make install"的情况确实不同,"make install"在cmake下严格等价于"cmake --build . --target install",同理"make clean"就是"cmake --build . --target clean"。
Failed to load the content due to unknown reasons.

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

56#
 楼主 Author| 发表于 Post on 2026-3-31 11:02:25 | 只看该作者 Only view this author
本帖最后由 UW_0728. 于 2026-3-31 11:07 编辑

对于同一个构建流程,--target install安装到的地方就是CMAKE_INSTALL_PREFIX设置的地方,两者毫无区别,所以要换install目录要么重运行一遍cmake(但是接下来应该不会再经历后面长时间的编译流程,而是只影响安装部分,因为只有CMAKE_INSTALL_PREFIX这一个选项被覆盖了),要么临时设置新的环境变量,比如运行"CMAKE_INSTALL_PREFIX=./install cmake --install build"(纠正:这里不应该跟install,而是build,从构建目录安装)。

"cmake --build build --target install"相当于是"cmake --build build"和"cmake --install build"合二为一;后者只是把构建好的东西安装在指定目录下,无法执行build操作。这与"make install"的情况确实不同,"make install"在cmake下严格等价于"cmake --build . --target install",同理"make clean"就是"cmake --build . --target clean"。
Failed to load the content due to unknown reasons.

1330

帖子

6

威望

2828

eV
积分
4278

Level 6 (一方通行)

傻傻的木瓜

55#
发表于 Post on 2026-3-31 10:44:20 | 只看该作者 Only view this author
UW_0728. 发表于 2026-3-27 05:37
1. 是的,动态库和静态库不能同时构建。最好是分两个构建目录,不过即使在相同build目录也不会导致冲突, ...

cmake里面install目录具体是以-DCMAKE_INSTALL_PREFIX选项为准,还是以--target install设置的为准,特别是二者不同的情况下?
cmake --build build --target install(目前开发版本推荐的指令)和cmake --install install有什么区别?
√546=23.36664289109

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

54#
 楼主 Author| 发表于 Post on 2026-3-27 10:35:26 | 只看该作者 Only view this author
本帖最后由 UW_0728. 于 2026-3-27 10:38 编辑
Uus/pMeC6H4-/キ 发表于 2026-3-27 10:16
1. 同时有用 CP2K 本身跑单独的 DFT 任务(所以需要 libcp2k.so )和链接 GROMACS 跑 QM/MM 任务(所以需 ...

直接全用静态版(链接.a的)就可以吧,不应该有问题。当然,我会在说明中补充静态链接这一点(尽管我觉得直接在手册中相应部分补充说明会更好)。
Ninja我计划将来如果要砍toolchain的话会把它砍掉,因为它当时被加进去的唯一原因就是dftd4“需要”ninja,但现在看来实际上根本用不到。至于为什么在Spack里面专门要用-G Ninja,我也不清楚。
Failed to load the content due to unknown reasons.

1330

帖子

6

威望

2828

eV
积分
4278

Level 6 (一方通行)

傻傻的木瓜

53#
发表于 Post on 2026-3-27 10:16:52 | 只看该作者 Only view this author
UW_0728. 发表于 2026-3-27 05:37
1. 是的,动态库和静态库不能同时构建。最好是分两个构建目录,不过即使在相同build目录也不会导致冲突, ...

1. 同时有用 CP2K 本身跑单独的 DFT 任务(所以需要 libcp2k.so )和链接 GROMACS 跑 QM/MM 任务(所以需要 libcp2k.a)的需求是什么很奇怪的事情吗?当然如果 libcp2k.a 的版本也能像 libcp2k.so 的版本那样直接跑是更好的,可以省一次编译,但是我不知道是不是真能这样。我觉得您可以开 PR 把这个问题在 generate_cmake_options.sh 末尾生成的安装指南里说说。
2. 基于 Spack 的 make_cp2k.sh 的 CMake 指令默认都要用 -GNinja 这点,应当在 make_cp2k.sh 的帮助语句或者注释里说明缘故。目前在 toolchain 里面并没有哪个依赖库是只有 CMake 及 GNU Make 就不能编译、必须要使用 CMake 带 Ninja 的,哪怕官网号称要求 Ninja 的 tblite 也是,之前我测试 tblite 离线安装时没用 Ninja 也照样能编译通过、获得二进制可执行文件。
√546=23.36664289109

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

52#
 楼主 Author| 发表于 Post on 2026-3-27 05:37:56 | 只看该作者 Only view this author
Uus/pMeC6H4-/キ 发表于 2026-3-27 00:48
现行的 CMake 系统如何同时构建动态库链接的 libcp2k.so 和静态库链接的 libcp2k.a 呢?我的猜想是在跑完 t ...

1. 是的,动态库和静态库不能同时构建。最好是分两个构建目录,不过即使在相同build目录也不会导致冲突,只是会把之前的BUILD_SHARED_LIBS选项设置覆盖掉而已;install目录应该分开,否则后面构建的会把前面构建的完全覆盖掉,达不成“同时构建动态库链接的 libcp2k.so 和静态库链接的 libcp2k.a”的目的(虽然我也不知道这个意义在哪里)。
2. cmake --build 指令是属于CMake自己的,对于任何generator生成的构建文件都适用,在构建阶段用了-G Ninja只是意味着不能直接在build目录下直接用make/gmake指令了,这两个生成器生成的东西除了组织架构上也没啥区别。
Failed to load the content due to unknown reasons.

1330

帖子

6

威望

2828

eV
积分
4278

Level 6 (一方通行)

傻傻的木瓜

51#
发表于 Post on 2026-3-27 00:48:50 | 只看该作者 Only view this author
现行的 CMake 系统如何同时构建动态库链接的 libcp2k.so 和静态库链接的 libcp2k.a 呢?我的猜想是在跑完 toolchain 以后到 CP2K 主目录下分几步执行:
  1. # shared library libcp2k.so
  2. cmake -S . -B ./build-shared -DCMAKE_INSTALL_PREFIX=./install-shared {...other cmake options...}
  3. cmake --build build-shared --target install -j
  4. # static library libcp2k.a
  5. cmake -S . -B ./build-static -DCMAKE_INSTALL_PREFIX=./install-static -DBUILD_SHARED_LIBS=OFF {...other cmake options...}
  6. cmake --build build-static --target install -j
复制代码

目前的 generate_cmake_options.sh 生成的 $CP2K_CMAKE_OPTIONS 包括了 -DCMAKE_INSTALL_PREFIX=./install 选项,但我不确定两次都用同一个 install 的目录会不会冲突,所以才有这个问题。最好能在自动生成的安装指南里讲清楚这点。

(顺便,安装/链接了 Ninja 后编译选项里是否启用 -GNinja 带来的 makefile 的区别也应该有解释。)
√546=23.36664289109

199

帖子

1

威望

681

eV
积分
900

Level 4 (黑子)

50#
 楼主 Author| 发表于 Post on 2026-3-11 14:54:06 | 只看该作者 Only view this author
本帖最后由 UW_0728. 于 2026-3-11 15:00 编辑
Uus/pMeC6H4-/キ 发表于 2026-3-11 12:31
我想问个小问题。上周PR #4865在更新toolchain里的libint到2.13.1版的同时也新增了系统包管理器安装boost和 ...

dnf config-manager --set-enabled crb

这个建议随同EPEL一起默认开启,用处不小(而且我记得安装epel-release后默认就会附带启用crb的建议和指令)

评分 Rate

参与人数
Participants 1
eV +1 收起 理由
Reason
Uus/pMeC6H4-/キ + 1 谢谢

查看全部评分 View all ratings

Failed to load the content due to unknown reasons.

2434

帖子

1

威望

6283

eV
积分
8737

Level 6 (一方通行)

49#
发表于 Post on 2026-3-11 13:15:40 | 只看该作者 Only view this author
Uus/pMeC6H4-/キ 发表于 2026-3-11 12:31
我想问个小问题。上周PR #4865在更新toolchain里的libint到2.13.1版的同时也新增了系统包管理器安装boost和 ...

Enable repo, crb.
High-Performance Computing for You
为您专属定制的高性能计算解决方案

更多讯息,请访问:
https://labitc.top
http://tophpc.top:8080
电邮: ask@hpc4you.top

1330

帖子

6

威望

2828

eV
积分
4278

Level 6 (一方通行)

傻傻的木瓜

48#
发表于 Post on 2026-3-11 12:31:51 | 只看该作者 Only view this author
我想问个小问题。上周PR #4865在更新toolchain里的libint到2.13.1版的同时也新增了系统包管理器安装boost和eigen3依赖的要求,这点也在您的博文里提到了。若在Rocky Linux 10.1用dnf,那应该从哪个repo或者channel找eigen3-devel呢?我现在无法直接找到eigen3-devel,搜eigen的唯一结果也似乎不对:
  1. $ dnf repolist
  2. repo id                                             repo name
  3. appstream                                           Rocky Linux 10 - AppStream
  4. baseos                                              Rocky Linux 10 - BaseOS
  5. epel                                                Extra Packages for Enterprise Linux 10 - x86_64
  6. extras                                              Rocky Linux 10 - Extras
  7. $ dnf search eigen3-devel
  8. Last metadata expiration check: 18:47:56 ago on Tue 10 Mar 2026 05:30:42 PM CST.
  9. No matches found.
  10. $ dnf search eigen
  11. ========================================================== Summary Matched: eigen ===========================================================
  12. arpack.x86_64 : Fortran 77 subroutines for solving large scale eigenvalue problems
  13. $
复制代码
√546=23.36664289109

63

帖子

0

威望

826

eV
积分
889

Level 4 (黑子)

47#
发表于 Post on 2026-2-21 23:00:21 | 只看该作者 Only view this author
UW_0728. 发表于 2026-2-21 18:21
先看:
在网上求助计算化学问题的时候必须把问题描述得详细、具体、准确、清楚
http://sobereva.com/62 ...

已经搞定了,我把自己的cmake、openmpi、fftw、mkl之类的bashrc全注释掉才行。虽然我的版本跟cp2k要求的基本一样,但是就是不行。报错基本与cmake、gfortran有关,高了半天没搞定,哎,注释完以后,一点问题都没有,一遍过

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-4-29 00:43 , Processed in 0.229066 second(s), 24 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list