我想执行以下操作:如果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测试失败(可以预料).
现在可以将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是否可用,然后再将其用作启动器,以及哪些生成器可以使用编译启动器.
从CMAKE 3.4开始,您可以:
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
我个人有/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()
这两个脚本模板文件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}" "$@"
以上RULE_LAUNCH_COMPILE
用于Unix Makefiles和Ninja,但对于Xcode生成器,它依赖于CMake CMAKE_XCODE_ATTRIBUTE_...
变量支持的帮助.的设置CC
和CXX
用户自定义的Xcode的属性来控制编译器指令,LD
并LDPLUSPLUS
为连接器命令不是,据我所知,Xcode的项目的记录功能,但它似乎工作.如果有人可以确认它是Apple正式支持的,我会相应地更新链接的文章和这个答案.
我不喜欢从设置一个符号链接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周内忘记的符号链接更舒服,然后可能想知道是否有什么不起作用......
我验证了以下工作(来源:此链接):
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抱怨).