106

我想做以下事情:如果 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 会抱怨使用编译器 ccache 的测试失败(这是可以预料的)。

4

9 回答 9

132

从 CMAKE 3.4 开始,您可以执行以下操作:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
于 2016-06-15T07:19:31.613 回答
111

现在可以将 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) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

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

对于 Ninja,从 3.4 版本开始就可以做到这一点。对于 XCode,Craig Scott 在他的回答中给出了一个解决方法。

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

Edit2:@Emilio Cobos 建议避免对链接部分这样做,因为 ccache 不会提高链接速度,并且可能会与其他类型的缓存(如 sccache)混淆

于 2014-06-19T11:48:08.670 回答
72

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

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

于 2009-12-23T17:21:12.157 回答
11

从 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.inCMakeLists.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_...变量支持的帮助。CCCXX用户定义的 Xcode 属性的设置来控制编译器命令LDLDPLUSPLUS链接器命令,据我所知,这不是 Xcode 项目的记录功能,但它似乎确实有效。如果有人可以确认它得到 Apple 的官方支持,我会相应地更新链接的文章和这个答案。

于 2016-04-09T10:22:00.553 回答
8

我不喜欢从 to 设置符号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 周内忘记的符号链接更舒服,然后可能想知道是否有什么不起作用......

于 2012-10-29T19:53:14.307 回答
6

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

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

于 2009-11-29T14:58:48.960 回答
5

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

export CC="ccache gcc" CXX="ccache g++" cmake ...
于 2009-11-30T10:25:52.747 回答
5

让我补充一个之前没有提到的重要项目。

在从 ubuntu:18.04 docker 映像引导一个简约的构建系统时,我发现安装顺序会有所不同。

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

sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"```

... and then (due to updated symlinks) also calls to cc and c++ get caught!
于 2018-04-13T13:04:38.820 回答
0

它正在扩展@Nicolas answer

将以下行添加到您的cmake文件中:

list(PREPEND CMAKE_PROGRAM_PATH /usr/lib/ccache)

或者将其作为参数添加到cmake配置步骤:

cmake -DCMAKE_PROGRAM_PATH=/usr/lib/ccache
于 2021-11-18T08:41:50.893 回答