当前位置:  开发笔记 > 编程语言 > 正文

如何在CMake中使用CCache?

如何解决《如何在CMake中使用CCache?》经验,为你挑选了6个好方法。

我想执行以下操作:如果PATH中存在CCache,请使用"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测试失败(可以预料).



1> Babcool..:

现在可以将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)

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

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

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


值得注意的是,这当前仅适用于Makefile生成器(从cmake 3.3.2开始).请参阅`cmake-properties`的手册页.

2> Jacob..:

从CMAKE 3.4开始,您可以:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache



3> Nicolás..:

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

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


请注意,此ccache路径必须放在*真实编译器所在的路径之前*$ PATH`才能工作.像`export PATH =/usr/lib/ccache:$ PATH`之类的东西
@Gui13:比更新PATH更好的是告诉cmake它应该使用的gcc在哪里,例如cmake -DCMAKE_CXX_COMPILER =/usr/lib/ccache/bin/g ++
在'brew install ccache`之后,我有`/ usr/local/Cellar/ccache/3.2.1/libexec /`.

4> Craig Scott..:

从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.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用于Unix Makefiles和Ninja,但对于Xcode生成器,它依赖于CMake CMAKE_XCODE_ATTRIBUTE_...变量支持的帮助.的设置CCCXX用户自定义的Xcode的属性来控制编译器指令,LDLDPLUSPLUS为连接器命令不是,据我所知,Xcode的项目的记录功能,但它似乎工作.如果有人可以确认它是Apple正式支持的,我会相应地更新链接的文章和这个答案.



5> 小智..:

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



6> amit..:

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

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

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有