如何在CMake中使用CCache?

时间:2009-11-29 14:36:39

标签: c++ unix cmake ccache

我想执行以下操作:如果PATH中存在CCache,请使用“ccache g ++”进行编译,否则使用g ++。我尝试编写一个包含

的小型my-cmake脚本
    CC="ccache gcc" CXX="ccache g++" cmake $*

但它似乎不起作用(运行make仍然不使用ccache;我使用CMAKE_VERBOSE_MAKEFILE检查了这一点)。

更新

根据this link我尝试将脚本更改为

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

但cmake抱怨说使用编译器ccache测试失败(可以预料)。

8 个答案:

答案 0 :(得分:82)

现在可以将ccache指定为编译命令和链接命令的启动器(自cmake 2.8.0起)。这适用于Makefile和Ninja生成器。为此,只需设置以下属性:

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)

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

对于Ninja来说,从版本3.4开始,这是可能的。 对于XCode,Craig Scott在他的回答中给出了一个解决方法。

编辑:感谢uprego和Lekensteyn的评论,我编辑了答案,检查ccache是​​否可用,然后再将其用作启动器,以及哪些生成器可以使用编译启动器。

答案 1 :(得分:61)

从CMAKE 3.4开始,您可以:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

答案 2 :(得分:59)

我个人/usr/lib/ccache中有$PATH。此目录包含可以调用编译器的每个可能名称的符号链接的加载(如gccgcc-4.3),都指向ccache。

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

答案 3 :(得分:8)

我不想设置从g++ccache的符号链接。并且CXX="ccache g++"对我来说不起作用,因为一些cmake测试用例想要只有没有属性的编译器程序。

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

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

并将其保存为/usr/bin/ccache-g++中的可执行文件。

然后C配置cmake使用/usr/bin/ccache-g++作为C ++编译器。 这样它通过了cmake测试用例,我觉得比在2或3周内忘记的符号链接更舒服,然后可能想知道是否有些东西不起作用......

答案 4 :(得分:8)

从CMake 3.1开始,可以将ccache与Xcode生成器一起使用,从CMake 3.4开始支持Ninja。 Ninja将像Unix Makefiles生成器一样荣誉RULE_LAUNCH_COMPILE(所以@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.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}" "$@"

上面仅针对Unix Makefiles和Ninja使用RULE_LAUNCH_COMPILE,但对于Xcode生成器,它依赖于CMake CMAKE_XCODE_ATTRIBUTE_...变量支持的帮助。用于控制编译器命令的CCCXX用户定义的Xcode属性的设置以及用于链接器命令的LDLDPLUSPLUS的设置不是,据我所知,Xcode项目的文档功能,但它似乎确实有效。如果有人可以确认它是Apple正式支持的,我会相应地更新链接的文章和这个答案。

答案 5 :(得分:6)

我验证了以下作品(来源:this link):

        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抱怨)。

答案 6 :(得分:4)

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

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

答案 7 :(得分:2)

让我添加一个之前未提及的重要项目。

从ubunutu:18.04 docker image引导简约构建系统时,我发现安装顺序有所不同。

在我的情况下,ccache在调用gcc时工作正常,但未能通过其他名称捕获同一编译器的调用:ccc++。 要完全安装ccache,您需要确保首先安装所有编译器,添加对update-ccache符号链接的调用是安全的。

sudo apt-get install ccache build-essential # and everyhting ... sudo /usr/sbin/update-ccache-symlinks export PATH="/usr/lib/ccache/:$PATH"

...然后(由于更新的符号链接)也调用cc和c ++被抓住了!