我正在尝试用我的CMake项目配置CCache。我打算在我的CI/CD系统中使用它,并首先在本地准备作为测试。当项目本身在不同的目录中时,我无法让CCache正确地为 * 同一个项目 * 重用其缓存。这对我来说是一个交易破坏者,因为在我的CI/CD系统中,我有几种类型的作业,它们在不同的目录中 checkout 项目,包括随机生成名称的目录。
我可以在项目根目录中使用不同的 * 构建目录 *,例如名为foo
的项目:
- Foo
- build_debug_1
- build_debug_2
但不是:
- 项目
- Foo
- 建立调试
- 其他项目
- Foo
- 建立调试
也就是说,即使在前一种情况下,我也不会像在核化构建目录的内容后重建时那样获得100%的缓存命中。
在我看来,CCache * 也 * 旨在使多个用户共享一个缓存,甚至多个服务器;除非我误解了这些用例(或者如何正确地处理它),否则除非所有项目都存储在跨多个用户/系统的相同文件系统中,否则CCache实际上怎么可能希望实现这一点呢?
希望我只是做错了什么。
在CMake中,我按如下方式启用CCache:
find_program(CCACHE_PROGRAM ccache)
if (CCACHE_PROGRAM)
message(NOTICE "Selected CCache: ${CCACHE_PROGRAM}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_PROGRAM}")
get_filename_component(PARENT_DIR ${PROJECT_SOURCE_DIR} DIRECTORY)
set(ENV{CCACHE_BASEDIR} "${PARENT_DIR}")
set(ENV{CCACHE_SLOPPINESS} "pch_defines,file_macro,include_file_ctime")
set(ENV{CCACHE_NOHASHDIR} "1")
else ()
message(WARNING "Could not find ccache, skipping!")
endif ()
2条答案
按热度按时间h9a6wy2h1#
你设置环境变量的方式是有问题的。
它们仅在CMake configuration step期间有效。
IE当你真正尝试构建二进制文件时,这些环境变量不会在任何地方设置。
mutmk8jj2#
也许@jpr42的回答触及了问题的原因,尽管我的一位同事偶然发现了一个解决方案。
我在不同的目录结构中以不同的构建模式测试了多个编译器,它工作正常