聲明: 轉載註明本人或出處, 請在方便的狀況下儘可能告知.html
尊重原創, 共同進步.ios
前兩天聽一個朋友介紹, 業內有CCache這麼個玩意, 聽說能大幅度提升編譯效率. 秉持 "No zuo no die" 的原則, 堅定地嘗試了一把(心酸苦累史), 現把結果記錄彙報一下.git
ccache是個頗有意思的項目.github
它但願經過使用緩存技術, 在儘量不侵入過多項目配置的前提下, 儘量高地提升(團隊)編譯效率.shell
主要針對語言包括: C/C++/Objetive C/Objective C++.編程
對於Swift, 目前本人使用的版本 version 3.4.2 表示無能爲力.緩存
通過自測, 總結適用場景主要爲:bash
CI集成我的較大型項目.post
項目越大, 收益越大區塊鏈
團隊功能模塊CocoaPods/Cathage集成, 在多項目中必須屢次編譯.
可添加配置項開啓緩存, 同一模塊同一版本可共用一個緩存. 集成模塊越多, 收益越大
團隊多Task並行CI.
一個項目(Target)能夠共用一個緩存, Task越多, 項目越大, 收益越大
以上前提, 都是基於同一個平臺的. 涉及到不一樣平臺編譯, 不在本次討論範圍內.
上面純熟我的看法, 歡迎各位吐槽.
安裝, 推薦使用神器HomeBrew:
brew install ccache
部分Mac機器, 特別是從 OSX10 升級上來的版本, bash環境配置可能存在問題, 會致使沒法運行腳本.
建議在各自的shell(bash/csh/zsh)環境配置中添加上如下內容:
export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"
複製代碼
source ~/.zshrc # 讓環境變量在當前Shell生效
注意:項目路徑不能有中文,不然會影響 CCache 的正常工做 -- 沒試過, 內容來自貝聊iOS工程師博客
由於ccache
不支持clang
的modules
, 若是檢測到編譯選項中存在-fmodules
, ccache
就會失效.
所以, 爲了兼容 ccache, 你須要用老舊的#import <UIKit/UIKit.h>
替換你項目中全部優雅的@import UIKit
, 以及全部使用 ccache 帶來的問題, 比方說宏的問題.
-- 儘量不使用宏編程, 由於風險大於收益 ORZ
同時, 你還須要手動連接你所用到的framework, 由於咱們已經關閉了這個選項.
最重要的, 你須要中止使用pch.
通過小半個小時反覆嘗試, 發現新版本依然沒辦法解決這個問題.
這點讓我深惡痛絕, 魚與熊掌不可兼得! ORZ
不過蘋果一直是不推薦使用pch的, 並且使用後跟Swift兼容的問題也多, 體積會變得更臃腫等, 因此見仁見智吧.
內容以下:
#!/bin/sh
command_exists () {
type -p "$1" &> /dev/null ;
}
if command_exists ccache ; then
export CCACHE_MAXSIZE=5G ;
export CCACHE_CPP2=true ;
export CCACHE_HARDLINK=true ;
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches ;
# 指定日誌文件路徑到桌面,等下排查集成問題有用,集成成功後刪除,不然很佔磁盤空間
export CCACHE_LOGFILE='~/Desktop/CCache.log' ;
exec ccache /usr/bin/clang "$@" ;
else
exec /usr/bin/clang "$@"
fi
複製代碼
別忘記修改執行權限
chmod +x ./ccache-clang.sh
直接在XCode上編譯/運行一遍, 而後再從新clean, 再運行一遍.
你會發現, It's amazing! 速度就跟劉翔當年破紀錄那麼High.
緣由以下:
結論已經在前面提過了.
還想再進一步入坑(如共享緩存)的童鞋, 可移步官方文檔, 繼續深根細做.
緩存技術不算什麼新鮮玩意, 可是換一個地方, 換一種方式, 會帶來不少有趣又實用的新產品.
目前最火的區塊鏈其實就是老飯新炒, 可也別有一番滋味, 不是麼?
-- 該文章來自貝聊的iOS開發工程師, 不過涉及到ccache部分解說不夠詳細, 腳本不必定能在各項目運行
Using ccache for Fun and Profit
-- 該文章來自PSPDFKit團隊, 用途描述都很到位, 建議詳細閱讀一遍. 固然腳本配置也屬於須要更新的部分
-- 全部的配置項, 包括更詳盡的說明在此. 有須要(能力)的童鞋能夠直接跳過本文, 直接參考.