从 CMake 3.1 开始,可以将 ccache 与 Xcode 生成器一起使用,并且从 CMake 3.4 开始支持 Ninja。Ninja 将RULE_LAUNCH_COMPILE
像 Unix Makefiles 生成器一样尊重(所以@Babcool 的答案也让你也可以使用 Ninja),但是让 ccache 为 Xcode 生成器工作需要更多的工作。以下文章详细解释了该方法,重点介绍适用于所有三个 CMake 生成器的通用实现,并且不假设设置 ccache 符号链接或使用的底层编译器(它仍然让 CMake 决定编译器):
https://crascit.com/2016/04/09/using-ccache-with-cmake/
文章的一般要点如下。你的CMakeLists.txt
文件的开头应该是这样设置的:
cmake_minimum_required(VERSION 2.8)
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
# Support Unix Makefiles and Ninja
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()
project(SomeProject)
get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
# Set up wrapper scripts
configure_file(launch-c.in launch-c)
configure_file(launch-cxx.in launch-cxx)
execute_process(COMMAND chmod a+rx
"${CMAKE_BINARY_DIR}/launch-c"
"${CMAKE_BINARY_DIR}/launch-cxx")
# Set Xcode project attributes to route compilation through our scripts
set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/launch-c")
set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/launch-cxx")
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/launch-c")
set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
endif()
这两个脚本模板文件看起来像这样(它们应该与文件在同一目录中launch-c.in
):launch-cxx.in
CMakeLists.txt
启动-c.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"
启动-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
以上RULE_LAUNCH_COMPILE
仅用于 Unix Makefiles 和 Ninja,但对于 Xcode 生成器,它依赖于 CMakeCMAKE_XCODE_ATTRIBUTE_...
变量支持的帮助。CC
和CXX
用户定义的 Xcode 属性的设置来控制编译器命令LD
和LDPLUSPLUS
链接器命令,据我所知,这不是 Xcode 项目的记录功能,但它似乎确实有效。如果有人可以确认它得到 Apple 的官方支持,我会相应地更新链接的文章和这个答案。