ami*_*mit 80 c++ unix cmake ccache
我想执行以下操作:如果PATH中存在CCache,请使用"ccache g ++"进行编译,否则使用g ++.我尝试编写一个包含的小型my-cmake脚本
CC="ccache gcc" CXX="ccache g++" cmake $*
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用(运行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" $*
Run Code Online (Sandbox Code Playgroud)
但cmake抱怨说使用编译器ccache测试失败(可以预料).
Bab*_*ool 86
现在可以将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)
Run Code Online (Sandbox Code Playgroud)
也可以仅为特定目录或目标设置这些属性.
对于忍者来说,这可能是因为版本3.4.对于XCode,Craig Scott在他的回答中给出了一个解决方法.
编辑:感谢uprego和Lekensteyn的评论,我编辑了答案,检查ccache是否可用,然后再将其用作启动器,以及哪些生成器可以使用编译启动器.
Jac*_*cob 72
从CMAKE 3.4开始,您可以:
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
Run Code Online (Sandbox Code Playgroud)
Nic*_*lás 62
我个人有/usr/lib/ccache我的$PATH.这个目录包含了编译器可能被调用的每个可能名称的符号链接的加载(比如gcc和gcc-4.3),都指向ccache.
我甚至没有创建符号链接.当我在Debian上安装ccache时,该目录已预先填充.
从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()
Run Code Online (Sandbox Code Playgroud)
这两个脚本模板文件launch-c.in和launch-cxx.in看起来像这样(他们应该在同一个目录中的CMakeLists.txt文件):
launch-c.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"
Run Code Online (Sandbox Code Playgroud)
launch-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
Run Code Online (Sandbox Code Playgroud)
以上RULE_LAUNCH_COMPILE用于Unix Makefiles和Ninja,但对于Xcode生成器,它依赖于CMake CMAKE_XCODE_ATTRIBUTE_...变量支持的帮助.的设置CC和CXX用户自定义的Xcode的属性来控制编译器指令,LD并LDPLUSPLUS为连接器命令不是,据我所知,Xcode的项目的记录功能,但它似乎工作.如果有人可以确认它是Apple正式支持的,我会相应地更新链接的文章和这个答案.
小智 8
我不喜欢从设置一个符号链接g++到ccache.并CXX="ccache g++"没有为我工作,因为一些cmake测试用例想要只有没有属性的编译器程序.
所以我用了一个小的bash脚本代替:
#!/bin/bash
ccache g++ "$@"
Run Code Online (Sandbox Code Playgroud)
并将其保存为可执行文件/usr/bin/ccache-g++.
然后C配置cmake /usr/bin/ccache-g++用作C++编译器.这样它通过了cmake测试用例,我感觉比在2或3周内忘记的符号链接更舒服,然后可能想知道是否有什么不起作用......
我验证了以下工作(来源:此链接):
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" $*
Run Code Online (Sandbox Code Playgroud)
更新:我后来意识到即使这样也行不通.奇怪的是,它每隔一段时间都有效(其他时候cmake抱怨).
在我看来,最好的方法是将 gcc,g++ 符号链接到 ccache,但如果您想在 cmake 中使用,请尝试以下操作:
export CC="ccache gcc" CXX="ccache g++" cmake ...
Run Code Online (Sandbox Code Playgroud)
让我添加一项之前未提及的重要事项。
当从 ubuntu:18.04 docker 镜像引导一个简约的构建系统时,我发现安装顺序会有所不同。
就我而言,ccache 在调用 时工作正常gcc,但无法捕获其他名称对同一编译器的调用:cc和c++。要完全安装 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!
Run Code Online (Sandbox Code Playgroud)