一次ccache嘗試和實驗結論


聲明: 轉載註明本人出處, 請在方便的狀況下儘可能告知.html

尊重原創, 共同進步.ios


前提介紹

前兩天聽一個朋友介紹, 業內有CCache這麼個玩意, 聽說能大幅度提升編譯效率. 秉持 "No zuo no die" 的原則, 堅定地嘗試了一把(心酸苦累史), 現把結果記錄彙報一下.git

ccache是什麼

ccache是個頗有意思的項目.github

它但願經過使用緩存技術, 在儘量不侵入過多項目配置的前提下, 儘量高地提升(團隊)編譯效率.shell

主要針對語言包括: C/C++/Objetive C/Objective C++.編程

對於Swift, 目前本人使用的版本 version 3.4.2 表示無能爲力.緩存

ccache適用場景

通過自測, 總結適用場景主要爲:bash

  1. CI集成我的較大型項目.post

    項目越大, 收益越大區塊鏈

  2. 團隊功能模塊CocoaPods/Cathage集成, 在多項目中必須屢次編譯.

    可添加配置項開啓緩存, 同一模塊同一版本可共用一個緩存. 集成模塊越多, 收益越大

  3. 團隊多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生效

XCode配置

注意:項目路徑不能有中文,不然會影響 CCache 的正常工做 -- 沒試過, 內容來自貝聊iOS工程師博客

1. 配置用戶定義宏

配置用戶定義宏

2. 關閉Modules配置

由於ccache不支持clangmodules, 若是檢測到編譯選項中存在-fmodules, ccache 就會失效.

所以, 爲了兼容 ccache, 你須要用老舊的#import <UIKit/UIKit.h>替換你項目中全部優雅的@import UIKit, 以及全部使用 ccache 帶來的問題, 比方說宏的問題.

-- 儘量不使用宏編程, 由於風險大於收益 ORZ

同時, 你還須要手動連接你所用到的framework, 由於咱們已經關閉了這個選項.

最重要的, 你須要中止使用pch.

通過小半個小時反覆嘗試, 發現新版本依然沒辦法解決這個問題.

這點讓我深惡痛絕, 魚與熊掌不可兼得! ORZ

不過蘋果一直是不推薦使用pch的, 並且使用後跟Swift兼容的問題也多, 體積會變得更臃腫等, 因此見仁見智吧.

3. 編輯指定路徑的ccache調用腳本

內容以下:

#!/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 項目的編譯速度提升5倍

-- 該文章來自貝聊的iOS開發工程師, 不過涉及到ccache部分解說不夠詳細, 腳本不必定能在各項目運行

Using ccache for Fun and Profit

-- 該文章來自PSPDFKit團隊, 用途描述都很到位, 建議詳細閱讀一遍. 固然腳本配置也屬於須要更新的部分

ccache官方文檔

-- 全部的配置項, 包括更詳盡的說明在此. 有須要(能力)的童鞋能夠直接跳過本文, 直接參考.

相關文章
相關標籤/搜索