如何使用CMake的CCache?

我想这样做:如果CCache存在于PATH中,请使用“ccache g ++”进行编译,否则使用g ++。 我试图写一个小的my-cmake脚本包含

CC="ccache gcc" CXX="ccache g++" cmake $* 

但它似乎并没有工作(运行make仍然不使用ccache;我检查了这个使用CMAKE_VERBOSE_MAKEFILE)。

更新:

按照这个链接,我尝试改变我的脚本

  cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $* 

但cmake救了抱怨,使用编译器ccachetesting失败(可以预料)。

我个人的$PATH/usr/lib/ccache 。 这个目录包含了大量的符号链接,可以调用编译器的每个可能的名称(如gccgcc-4.3 ),全部指向ccache。

而我甚至没有创build符号链接。 当我在Debian上安装ccache时,该目录是预先填充的。

现在可以指定ccache作为编译命令和链接命令的启动程序(自cmake 2.8.0以来)。 这适用于Makefile和忍者生成器。 要做到这一点,只需设置以下属性:

 find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) 

也可以只为特定的目录或目标设置这些属性。

对于忍者,这是可能的3.4版本。 对于XCode,Craig Scott在他的回答中给出了一个解决方法。

编辑:由于uprego和Lekensteyn的评论,我编辑了答案,以检查ccache是​​否可用之前,使用它作为启动程序和哪些发电机是可以使用一个编译启动。

从CMAKE 3.4开始,你可以这样做:

 -DCMAKE_CXX_COMPILER_LAUNCHER=ccache 

我不喜欢设置从g++ccache的符号链接。 而CXX="ccache g++"不适用于我,因为一些cmaketesting用例只想编译程序没有属性。

所以我用了一个小的bash脚本:

 #!/bin/bash ccache g++ "$@" 

并将其作为可执行文件保存在/usr/bin/ccache-g++

然后Cconfigurationcmake使用/usr/bin/ccache-g++作为C ++编译器。 这样,它通过了cmaketesting用例,我感觉比在2或3周内可能会忘记的符号链接更舒服,然后也许会奇怪是否有什么不起作用的…

我validation了以下作品(来源: 此链接 ):

  CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $* 

更新 :我后来意识到,即使这是行不通的。 奇怪的是,它每隔一段时间都工作(其他时间cmake抱怨)。

从CMake 3.1开始,可以在Xcode生成器中使用ccache,从CMake 3.4开始支持Ninja。 忍者将会像RULE_LAUNCH_COMPILE一样使用Unix Makefiles生成器(所以@ Babcool的答案也能让你在忍者那里),但是让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") endif() 

两个脚本模板文件launch-c.inlaunch-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使用RULE_LAUNCH_COMPILE作为Unix Makefiles和Ninja,但是对于Xcode生成器,它依赖于来自CMake的CMAKE_XCODE_ATTRIBUTE_...variables支持的帮助。 根据我所知,用于控制编译器命令的CCCXX用户定义的Xcode属性的设置不是Xcode项目的文档化function,但似乎工作正常。 如果有人可以确认它是由苹果公司正式支持,我会更新链接的文章和这个答案。

在我看来,最好的办法是将gcc,g ++符号链接到ccache,但是如果你想在cmake中使用,试试这个:

 export CC="ccache gcc" CXX="ccache g++" cmake ...