接上一篇LLVM的介绍,我们认识了LLVM,现在可以尝试用前端-clang
自定义我们需要的东西了。
注意:编写插件需要有C++基础。
一、准备工作
在
clang/tools
目录下新建插件文件夹(例:yb-plugin
)1
2cd llvm/tools/clang/tools/
mkdir yb-plugin打开
CMakeLists.txt
(路径:llvm/tools/clang/tools/CMakeLists.txt
),把要加载的插件加入到里面
1.1. 新建文件
在yb-plugin
目录下编写插件(插件是用C++编写的):
- 新建
CMakeLists.txt
,目的是让llvm加载插件中哪些C++文件。文件内容:
1 | add_llvm_library(YBPlugin MODULE BUILDTREE_ONLY YBPlugin.cpp) |
- YBPlugin是插件名,YBPlugin.cpp是源代码文件。
1.2. 编译插件
- 利用cmake生成的Xcode项目来编译插件(第一次编写完插件,需要利用cmake重新生成一下Xcode项目:
$ cmake -G Xcode ../llvm
)。
- 打开工程,选择
Automatically Create Schemes
。
- 插件源代码在
Sources/Loadable modules
目录下可以找到,这样就可以直接在Xcode里编写插件代码。
二、编写插件
选择YBPlugin这个target进行编译,编译完会生成一个动态库文件(路径:llvm_xcode/Debug/lib/YBPlugin.dylib
)
三、加载插件
3.1. 新增加载项
在Xcode项目中指定加载插件动态库:在BuildSettings > Other C Flags
里面添加-Xclang -load -Xclang 动态库路径 -Xclang -add-plugin -Xclang 插件名称
。
3.2. 修改自定义编译器(Hack Xcode)
编译后发现报错,是因为Xcode默认的编译器不允许使用插件,需要修改自定义编译器。
- 首先要对Xcode进行Hack,才能修改默认的编译器。
- 下载
XcodeHacking.zip
,解压,修改HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec
的内容,设置一下自己编译好的clang的路径(之前安装好的llvm_release/bin/clang
)。
然后在XcodeHacking目录下输入命令(将XcodeHacking的内容剪切到Xcode内部)。
1
2
3sudo mv HackedClang.xcplugin `xcode-select -print-path`/../PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins
sudo mv HackedBuildSystem.xcspec `xcode-select -print-path`/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications重启Xcode,选择编译器。
- 开始编译(编译项目后,会在编译日志看到YBPlugin插件的相关打印信息,如果插件更新了,最好先Clean一下项目)。
想要实现更复杂的插件功能,就需要利用clang的API针对语法树(AST)进行相应的分析和处理。
关于AST的资料: