让cmake使用它自己的构建缓存
Make cmake use its own build cache
我正在使用 Google Cloud Build 构建一个 CI/CD 管道(整个构建过程发生在 Docker 容器中)。在某些时候,我从 build
目录中这样调用 cmake
:
cmake -DCMAKE_BUILD_TYPE=Release ../ && \
cmake --build . --target all --config Release -- -j 25
项目结构(如果简化的话)如下所示:
> build/
> src/
> CMakeLists.txt
问题是每次开始新构建时,无论源是否更改,整个项目都会重新编译。为了避免这种情况,我使用 gsutil
将整个 build
目录保存到 Cloud Storage,然后在每次构建开始时使用相同的 gsutil
我将缓存检索回 build
。但是当上面的 cmake
命令开始时,项目仍然在完全重新编译。
据我所知cmake
(或底层make
)使用愚蠢的“最后修改”时间戳来确定是否重新编译任何东西。问题是 gsutil
完全删除了这些时间戳(除了云存储我不会使用任何其他东西)。
那么,问题是如何让 cmake
正确处理构建缓存?
关于使用 <LANG>_COMPILER_LAUNCHER
使用 ccache 并复制 ccache 缓存而不是构建目录(IIRC ccache 使用散列而不是时间戳...)有何意义?
参考:https://cmake.org/cmake/help/latest/prop_tgt/LANG_COMPILER_LAUNCHER.html
我正在使用 Google Cloud Build 构建一个 CI/CD 管道(整个构建过程发生在 Docker 容器中)。在某些时候,我从 build
目录中这样调用 cmake
:
cmake -DCMAKE_BUILD_TYPE=Release ../ && \
cmake --build . --target all --config Release -- -j 25
项目结构(如果简化的话)如下所示:
> build/
> src/
> CMakeLists.txt
问题是每次开始新构建时,无论源是否更改,整个项目都会重新编译。为了避免这种情况,我使用 gsutil
将整个 build
目录保存到 Cloud Storage,然后在每次构建开始时使用相同的 gsutil
我将缓存检索回 build
。但是当上面的 cmake
命令开始时,项目仍然在完全重新编译。
据我所知cmake
(或底层make
)使用愚蠢的“最后修改”时间戳来确定是否重新编译任何东西。问题是 gsutil
完全删除了这些时间戳(除了云存储我不会使用任何其他东西)。
那么,问题是如何让 cmake
正确处理构建缓存?
关于使用 <LANG>_COMPILER_LAUNCHER
使用 ccache 并复制 ccache 缓存而不是构建目录(IIRC ccache 使用散列而不是时间戳...)有何意义?
参考:https://cmake.org/cmake/help/latest/prop_tgt/LANG_COMPILER_LAUNCHER.html