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ā)揮。