cmake CCache -不同目录中的相同项目

1wnzp6jl  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(168)

我正在尝试用我的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 ()
h9a6wy2h

h9a6wy2h1#

你设置环境变量的方式是有问题的。

set(ENV{CCACHE_BASEDIR} "${PARENT_DIR}")
    set(ENV{CCACHE_SLOPPINESS} "pch_defines,file_macro,include_file_ctime")
    set(ENV{CCACHE_NOHASHDIR} "1")

它们仅在CMake configuration step期间有效。
IE当你真正尝试构建二进制文件时,这些环境变量不会在任何地方设置。

cmake -S . -B build .... # Your environment variables are set

cmake --build build ... # Your environment variables are NOT set. So ccache will just run normally.
mutmk8jj

mutmk8jj2#

也许@jpr42的回答触及了问题的原因,尽管我的一位同事偶然发现了一个解决方案。

find_program(CCACHE_PROGRAM ccache)
if (CCACHE_PROGRAM)
    message(NOTICE "Selected CCache: ${CCACHE_PROGRAM}")
    set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM} base_dir=${PROJECT_SOURCE_DIR} hash_dir=false)
    set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM} base_dir=${PROJECT_SOURCE_DIR} hash_dir=false)
else ()
    message(WARNING "Could not find ccache, skipping!")
endif ()

我在不同的目录结构中以不同的构建模式测试了多个编译器,它工作正常

相关问题