2009-11-29 155 views
68

我想做以下事情:如果CCache存在於PATH中,請使用「ccache g ++」進行編譯,否則使用g ++。我試着寫一個小我,cmake的含如何在CMake中使用CCache?

CC="ccache gcc" CXX="ccache g++" cmake $* 

腳本,但它似乎沒有工作(運行使仍然沒有使用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(可預期的)。

+4

你爲什麼不只是符號鏈接GCC來CCACHE?如果你正在發佈這個,我會認爲如果用戶自己安裝了ccache並希望它被使用,他自己會完成符號鏈接。 – int3 2009-11-29 14:46:47

+1

@ int3是的,這可能會起作用(我不知道ccache有編譯器作爲可選參數)。然而,更明確的說法會更清晰。 – 2009-11-29 15:00:16

回答

51

我個人有/usr/lib/ccache$PATH。該目錄包含負載符號鏈接,用於編譯器可能從中調用的每個可能的名稱(如gccgcc-4.3),全部指向ccache。

而我甚至沒有創建符號鏈接。當我在Debian上安裝ccache時,該目錄預填充。

+0

哇,這幾乎是完美的。 – 2009-12-24 08:22:13

+8

請注意,此ccache路徑必須放置在*真正編譯器位於'$ PATH'中的路徑之前。類似於'export PATH =/usr/lib/ccache:$ PATH' $ – Gui13 2011-02-24 17:06:44

+2

@ Gui13:比更新PATH更好的是將cmake明確告訴它應該使用的gcc,例如, cmake的-DCMAKE_CXX_COMPILER =/usr/lib中/ ccache的/ bin中/克++ – cib 2014-04-29 14:36:40

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

3

在我看來,最好的辦法是符號鏈接GCC,G ++來CCACHE,但如果你想cmake的內使用,試試這個:

export CC="ccache gcc" CXX="ccache g++" cmake ... 
8

我不喜歡設置從g++ccache的符號鏈接。並且CXX="ccache g++"不適合我,因爲一些cmake測試用例希望只編譯沒有屬性的編譯器程序。

所以我用一個小的bash腳本:

#!/bin/bash 
ccache g++ "[email protected]" 

,並保存它作爲/usr/bin/ccache-g++的可執行文件。

然後C配置cmake使用/usr/bin/ccache-g++作爲C++編譯器。 這樣它通過cmake測試用例,我感覺比在2或3周內可能忘記的符號鏈接更舒服,然後可能想知道是否有什麼不起作用...

70

現在可以指定ccache作爲編譯命令和鏈接命令的啓動程序(自cmake 2.8.0以來)。這適用於Makefile和忍者生成器。要做到這一點,只需設置以下屬性:

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) 

它也可以只對特定目錄或目標設置這些屬性。

對於忍者,這是可能的版本3.4。 對於XCode,Craig Scott在他的回答中給出了一個解決方法。

編輯:由於uprego和Lekensteyn的評論,我編輯了答案以檢查ccache是​​否可用,然後將其用作啓動程序,以及哪些生成器可以使用編譯啓動器。

+0

許多網站隱含地使用'find_program(CCACHE_FOUND「ccache」)''中的雙引號來建議,我不知道哪一個更便攜,我的里程沒有需要雙引號就完全正確。 – uprego 2015-06-16 11:33:30

+4

值得注意的是,這個目前僅適用於Makefile生成器(從cmake 3.3.2開始)。請參閱'cmake-properties'的手冊頁。 – Lekensteyn 2015-10-05 14:34:17

7

從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.inlaunch-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屬性控制編譯器命令LDLDPLUSPLUS用於鏈接器命令的設置並不像我所知的那樣是Xcode項目的文檔化功能,但它似乎工作正常。如果任何人都可以確認它是由Apple正式支持的,我會相應地更新鏈接的文章和此答案。

+0

我還需要提到的文章中的set(CMAKE_XCODE_ATTRIBUTE_LD「$ {CMAKE_C_COMPILER}」) set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS「$ {CMAKE_CXX_COMPILER}」)''。 – 2018-01-10 06:19:00

+0

感謝您的提醒,我已經更新了包含設置LD和LDPLUSPLUS的答案。 – 2018-01-10 19:56:13

28

隨着CMake的3.4的你可以這樣做:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache 
+0

和'-DCMAKE_CXX_COMPILER_LAUNCHER = ccache'。這些工作非常漂亮!我不知道爲什麼** cmake **堅持從'/ Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc'中找到'clang'(所以符號鏈接技巧不起作用) ,而不是從'$ PATH',但是你的答案無論如何都是有效的。 – cdunn2001 2017-05-09 07:56:57