從CMake的3.1,可以使用ccache的使用Xcode的發電機和忍者從CMake的3.4開始支持。 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}" "[email protected]"
launch-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]"
上述用途RULE_LAUNCH_COMPILE
單獨用於Unix的Makefile和忍者,但Xcode的發電機它依賴於從CMake的的CMAKE_XCODE_ATTRIBUTE_...
變量的支持幫助。用戶定義的Xcode屬性控制編譯器命令LD
和LDPLUSPLUS
用於鏈接器命令的設置並不像我所知的那樣是Xcode項目的文檔化功能,但它似乎工作正常。如果任何人都可以確認它是由Apple正式支持的,我會相應地更新鏈接的文章和此答案。
你爲什麼不只是符號鏈接GCC來CCACHE?如果你正在發佈這個,我會認爲如果用戶自己安裝了ccache並希望它被使用,他自己會完成符號鏈接。 – int3 2009-11-29 14:46:47
@ int3是的,這可能會起作用(我不知道ccache有編譯器作爲可選參數)。然而,更明確的說法會更清晰。 – 2009-11-29 15:00:16