从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
文件):
launch-c.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"
launch-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
上面的代码RULE_LAUNCH_COMPILE
单独用于Unix Makefile和Ninja,但是对于Xcode生成器,它依赖于CMakeCMAKE_XCODE_ATTRIBUTE_...
变量支持。的设置CC
和CXX
用户自定义的Xcode的属性来控制编译器指令,LD
并且LDPLUSPLUS
对连接器的命令是没有的,据我所知,Xcode的项目的记录功能,但它似乎工作。如果任何人都可以确认它得到Apple的正式支持,我将更新链接的文章,并相应地更新此答案。