安装 CCache
如果已经安装过homebrew(Mac OSX上的软件包管理工具),可以通过以下命令直接安装:
brew install ccache
如果没有安装homebrew,需要先安装homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
创建 CCache 编译脚本
安装完ccache之后我们需要让它介入到整个编译过程,新建一个空白文本文件,名称为ccache-clang,并保存如下内容:
将此文件存放在工程目录下,然后进入工程目录,将此文件改为可执行文件:
chmod 777 ccache-clang
如果你的代码或者是第三方库的代码用到了C++,则把ccache-clang这个文件复制一份,重命名成ccache-clang++。相应的对clang的调用也要改成clang++,否则 CCache 不会应用在 C++ 的代码上。
#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
exec ccache /usr/bin/clang++ "$@"
else
exec clang++ "$@"
fi
同样将此文件更改为可执行文件.
Xcode 项目的调整
定义CC常量
在项目的 Build Settings中,点击加号,选择 Add User-Defined Setting.添加一个常量CC,.这个值会让 Xcode 在编译时把执行路径的可执行文件当做 C 编译器。
图111
如果ccache-clang跟工程文件平级,那么CC常量的值为 $(SRCROOT)/ccache-clang.如果的脚本不是放在项目根目录,则自行调整路径。
同理,如果工程中有C++相关,需要创建一个常量CXX,值为
$(SRCROOT)/ccache-clang++.
修改引入
ccache不支持Clang Modules,所以需要把Enable Modules关闭.
图2222
关闭Enable Modules后需要修改@import 为 #import,如果用到了系统框架还需要在Target 的 Build Phrase -> Link Binary With Libraries手动引入.
CocoaPods处理
podfile中添加处理
post_install do |installer_representation|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
#排除的 Pod 的名字
if target.name != 'NXFramework' && target.name != 'YYKit'
# 关闭 Enable Modules
config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'
# 在生成的 Pods 项目文件中加入 CC 参数,路径的值根据你自己的项目来修改
config.build_settings['CC'] = '$(SRCROOT)/ccache-clang'
end
end
# 拷贝主工程的ccache-clang文件到Pods下面
FileUtils.cp('ccache-clang', 'Pods/ccache-clang')
end
end
需要注意的是,如果你使用的某个 Pod 引用了系统框架,例如AFNetworking引用了System Configuration,你需要在你自己项目的Build Phrase -> Link Binary With Libraries里面代为引入,否则你编译时可能会收到 Undefined symbols xxx for architecture yyy一类的错误。
总结
经过测试,使用CCatch,clean后进行编译(选择设备情况下),编译时间从90s左右优化到50s左右.还是有明显提高的.