clang作为LLVM提供的编译器前端,可将用户的源代码(C/C++/Objective-C)编译成语言/目标设备无关的IR(Intermediate Representation)实现。其可提供良好的插件支持,容许用户在编译时,运行额外的自定义动作。
本篇是基于clang的插件特性,编写一个clang插件作为一个源代码级别的分析工具(或编译器)生成各种中间文件。编译完成后,还需编写一个工具去分析所有包含源码的方法(包括用户编写,以及引入的第三方库源代码),检查这些方法中哪些最终可被程序主入口调用,剩余即是疑似无用代码。从而分析出源代码中那些确定无用的代码,便可以有效去除无用的代码从而减少包大小。
LLVM工程包含了一组模块化,可复用的编辑器和工具链:
1、clang源码并编译安装
查看clang源码并编译安装
2、编写clang插件
要实现自定义的Clang插件(以C++为例),应按照以下步骤:
编写clang插件:
编译生成插件(dylib):
使用clang编译oc文件(载入生成的your-clang-plugin-name.dylib):
Xcode集成Clang插件:
要在Xcode中使用Clang插件,需要Hack Xcode.app。
XcodeHacking.zip
通过command-line方式或者手动拷贝的方式将XcodeHack拷贝到Xcode目录中,如果Specifications文件不存在则手动创建一个。
之后在Xcode->Target-Build Settings->Build Options->Compiler for C/C++/Objective-C选择Clang LLVM Trunk即可使得Xcode使用1生成的的Clang来编译。至于其他的命令行参数,均可以通过Xcode设置完成。
3、clang插件在Xcode工程的配置:
clang插件示例工程
a、首先通过Xcode将自定义clang插件编译成动态库(dylib)。
b、其次编译生成分析工具XcodeCodeAnalyser
c、设置工程
使用用户编译的Clang载入ClangPlugin去编译并生成各种中间文件。编译完成之后使用Xcode提供的post_build_action_shell机制调用分析工具,生成最终结果。
参考:
http://railsware.com/blog/2014/02/28/creation-and-using-clang-plugin-with-xcode/
http://blog.mrriddler.com/2017/02/24/Clang插件-Sherlock/
https://lmsgsendnilself.github.io/blog/2017/02/28/clangtojszi-yuan/
http://kangwang1988.github.io/tech/2016/11/01/validate-ios-api-using-clang-plugin.html
https://github.com/kangwang1988/XcodeValidAPI
http://www.cocoachina.com/ios/20151211/14562.html
http://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=2651112096&idx=1&sn=ce8fccce7d5f70e30c078e63e8ea0d15&scene=21#wechat_redirect