我想执行以下操作:如果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测试失败(可以预料)。
答案 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
。此目录包含可以调用编译器的每个可能名称的符号链接的加载(如gcc
和gcc-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.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}" "$@"
上面仅针对Unix Makefiles和Ninja使用RULE_LAUNCH_COMPILE
,但对于Xcode生成器,它依赖于CMake CMAKE_XCODE_ATTRIBUTE_...
变量支持的帮助。用于控制编译器命令的CC
和CXX
用户定义的Xcode属性的设置以及用于链接器命令的LD
和LDPLUSPLUS
的设置不是,据我所知,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
时工作正常,但未能通过其他名称捕获同一编译器的调用:cc
和c++
。
要完全安装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 ++被抓住了!