如何使用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
。 这个目录包含了大量的符号链接,可以调用编译器的每个可能的名称(如gcc
和gcc-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.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
使用RULE_LAUNCH_COMPILE
作为Unix Makefiles和Ninja,但是对于Xcode生成器,它依赖于来自CMake的CMAKE_XCODE_ATTRIBUTE_...
variables支持的帮助。 根据我所知,用于控制编译器命令的CC
和CXX
用户定义的Xcode属性的设置不是Xcode项目的文档化function,但似乎工作正常。 如果有人可以确认它是由苹果公司正式支持,我会更新链接的文章和这个答案。
在我看来,最好的办法是将gcc,g ++符号链接到ccache,但是如果你想在cmake中使用,试试这个:
export CC="ccache gcc" CXX="ccache g++" cmake ...