CCache工具的調(diào)研

CCache是一個能夠把編譯的中間產(chǎn)物緩存起來的工具钢悲;

一.安裝CCache

首先需要在電腦上安裝 Homebrew,通過 Homebrew 安裝 CCache, 在命令行中執(zhí)行

$ brew install ccache

命令跑完后即安裝成功;

二.創(chuàng)建CCache編譯腳本

為了能讓 CCache 介入到整個編譯的過程,要把 CCache 作為項(xiàng)目的 C 編譯器,當(dāng) CCache 找不到編譯緩存時,它會再把編譯指令傳遞給真正的編譯器 clang笼蛛。

新建一個文件命名為ccache-clang, 內(nèi)容為下面這段腳本,放到項(xiàng)目里

#!/bin/shiftype-p ccache >/dev/null 2>&1;thenexportCCACHE_MAXSIZE=10GexportCCACHE_CPP2=trueexportCCACHE_HARDLINK=trueexportCCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches# 指定日志文件路徑到桌面蛉鹿,等下排查集成問題有用滨砍,集成成功后刪除,否則很占磁盤空間exportCCACHE_LOGFILE='~/Desktop/CCache.log'execccache /usr/bin/clang"$@"elseexecclang"$@"fi

在命令行中妖异,cd 到 ccache-clang 文件的目錄惋戏,把它的權(quán)限改成可執(zhí)行文件

$ chmod 777 ccache-clang;

如果代碼或者是第三方庫的代碼用到了C++他膳,則把ccache-clang這個文件復(fù)制一份响逢,重命名成ccache-clang++。相應(yīng)的對clang的調(diào)用也要改成clang++棕孙,否則 CCache 不會應(yīng)用在 C++ 的代碼上

#!/bin/shiftype-p ccache >/dev/null 2>&1;thenexportCCACHE_MAXSIZE=10GexportCCACHE_CPP2=trueexportCCACHE_HARDLINK=trueexportCCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches# 指定日志文件路徑到桌面舔亭,等下排查集成問題有用,集成成功后刪除蟀俊,否則很占磁盤空間exportCCACHE_LOGFILE='~/Desktop/CCache.log'execccache /usr/bin/clang++"$@"elseexecclang++"$@"fi

三.Xcode項(xiàng)目的調(diào)整

1.定義CC常量

在項(xiàng)目的構(gòu)建設(shè)置(Build Settings)中分歇,添加一個常量CC,這個值會讓 Xcode 在編譯時把執(zhí)行路徑的可執(zhí)行文件當(dāng)做 C 編譯器欧漱。


CC常量的值為 $(SRCROOT)/ccache-clang,如果腳本不是放在項(xiàng)目根目錄葬燎,則自行調(diào)整路徑误甚。如果一運(yùn)行項(xiàng)目就報錯缚甩,檢查下路徑是不是填錯了。

2.關(guān)閉 Clang Modules

因?yàn)?CCache 不支持 Clang Modules窑邦,所以需要把 Enable Modules 的選項(xiàng)關(guān)掉擅威;


因?yàn)殛P(guān)閉了 Enable Modules,所以必須刪除所有的 @import語句冈钦,替換為#import的語法

例如將 @import UIKit 替換為 #import 郊丛。之后,如果你用到了其他的系統(tǒng)框架例如 AVFoundation瞧筛、CoreLocation等厉熟,現(xiàn)在 Xcode 不會再幫你自動引入了,你得要在項(xiàng)目 Target 的 Build Phrase -> Link Binary With Libraries 里面自己手動引入较幌。

四.CocoaPods 的處理

CocoaPods 會單獨(dú)把第三方庫打包成一個 Static Library(或者是Dynamic Framework揍瑟,如果用了 use_frameworks!選項(xiàng)),所以 CocoaPods 生成的 Static Library 也需要把 Enable Modules 選項(xiàng)給關(guān)掉乍炉。但是因?yàn)?CocoaPods 每次執(zhí)行 pod update 的時候都會把 Pods 項(xiàng)目重新生成一遍绢片,如果直接在 Xcode 里面修改 Pods 項(xiàng)目里面的 Enable Modules 選項(xiàng),下次執(zhí)行pod update的時候又會被改回來岛琼。我們需要在 Podfile 里面加入下面的代碼底循,讓生成的項(xiàng)目關(guān)閉 Enable Modules 選項(xiàng),同時加入 CC 參數(shù)槐瑞,否則 pod 在編譯的時候就無法使用 CCache 加速:

post_install?do?|installer_representation|

installer_representation.pods_project.targets.each?do?|target|

target.build_configurations.each?do?|config|

?#關(guān)閉?Enable Modules

? ? ? config.build_settings['CLANG_ENABLE_MODULES'] =?'NO'


?#?在生成的?Pods?項(xiàng)目文件中加入?CC?參數(shù)熙涤,路徑的值根據(jù)你自己的項(xiàng)目來修改

? ? ? config.build_settings['CC'] =?'/Users/admin/Desktop/test/HKr_IOS/ccache-clang.sh'?

?end

?end

???end

需要注意的是,如果你使用的某個 Pod 引用了系統(tǒng)框架随珠,例如AFNetworking引用了System Configuration灭袁,你需要在你自己項(xiàng)目的Build Phrase -> Link Binary With Libraries里面代為引入,否則你編譯時可能會收到 Undefined symbols xxx for architecture yyy一類的錯誤窗看。

五.測試效果

編譯一遍茸歧,然后在命令行里輸入 ccache -s 就能看見類似下面的 ccache 運(yùn)行情況統(tǒng)計(jì):

cache directory? ? ? ? ? ? ? ? ? ? /Users/mac/.ccache

primary config? ? ? ? ? ? ? ? ? ? ? /Users/mac/.ccache/ccache.conf

secondary config? ? ? (readonly)? ? /usr/local/Cellar/ccache/3.3.4_1/etc/ccache.conf

cache hit (direct)? ? ? ? ? ? ? ? 14378

cache hit (preprocessed)? ? ? ? ? ? 1029

cache miss? ? ? ? ? ? ? ? ? ? ? ? ? 7875

cache hit rate? ? ? ? ? ? ? ? ? ? 66.18 %

called for link? ? ? ? ? ? ? ? ? ? ? 61

called for preprocessing? ? ? ? ? ? ? 48

compile failed? ? ? ? ? ? ? ? ? ? ? ? 2

preprocessor error? ? ? ? ? ? ? ? ? ? 4

can't use precompiled header? ? ? ? ? 70

unsupported compiler option? ? ? ? 2332

no input file? ? ? ? ? ? ? ? ? ? ? ? 11

cleanups performed? ? ? ? ? ? ? ? ? ? 0

files in cache? ? ? ? ? ? ? ? ? ? 35495

cache size? ? ? ? ? ? ? ? ? ? ? ? ? 1.3 GB

max cache size? ? ? ? ? ? ? ? ? ? ? 5.0 GB

如果成功接入,就能看見 cache miss 不為0显沈。因?yàn)榈谝淮尉幾g沒有緩存软瞎,肯定是全 miss 的。接著編譯第二遍拉讯,如果能看見 cache hit 的數(shù)字開始飆升涤浇,表示接入成功。

總結(jié):CCache工具能項(xiàng)目構(gòu)建速度提高百分之五十以上魔慷,缺點(diǎn)是手動添加依賴庫只锭,使CocoaPods的很多優(yōu)點(diǎn)得不到發(fā)揮。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末院尔,一起剝皮案震驚了整個濱河市蜻展,隨后出現(xiàn)的幾起案子喉誊,更是在濱河造成了極大的恐慌,老刑警劉巖纵顾,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍茄,死亡現(xiàn)場離奇詭異,居然都是意外死亡施逾,警方通過查閱死者的電腦和手機(jī)敷矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉额,“玉大人曹仗,你說我怎么就攤上這事∶品撸” “怎么了整葡?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讥脐。 經(jīng)常有香客問我遭居,道長,這世上最難降的妖魔是什么旬渠? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任俱萍,我火速辦了婚禮,結(jié)果婚禮上告丢,老公的妹妹穿的比我還像新娘枪蘑。我一直安慰自己,他們只是感情好岖免,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布岳颇。 她就那樣靜靜地躺著,像睡著了一般颅湘。 火紅的嫁衣襯著肌膚如雪话侧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天闯参,我揣著相機(jī)與錄音瞻鹏,去河邊找鬼。 笑死鹿寨,一個胖子當(dāng)著我的面吹牛新博,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脚草,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赫悄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涩蜘,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嚼贡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后同诫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樟澜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年误窖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秩贰。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹俺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毒费,到底是詐尸還是另有隱情丙唧,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布觅玻,位于F島的核電站想际,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溪厘。R本人自食惡果不足惜胡本,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畸悬。 院中可真熱鬧侧甫,春花似錦、人聲如沸蹋宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冷冗。三九已至守屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贾惦,已是汗流浹背胸梆。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留须板,地道東北人碰镜。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像习瑰,于是被迫代替她去往敵國和親绪颖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容