Clang插件开发流程

2,472 阅读3分钟

前言

了解此流程需要用到 llvm源码,并且需要对xcode进行hock。

开始吧

首先找到llvm源码中clang的tools目录

cd llvm/tools/clang/tools/

创建用于存放我们插件代码的文件夹

mkdir ty-plugin

然后打开 tools 目录下的 CMakeLists.txt 文件

在最后添加 add_clang_subdirectory(ty-plugin) ,在clang添加子目录来加载我们的插件

然后进入到我们自己的插件文件夹内创建我们自己的插件代码文件(插件需要使用 C++ 语言编写)

cd  ty-plugin/
touch TYPlugin.cpp

然后将在此目录下创建一个 CMakeLists.txt 文件,并在文件内添加如下代码

add_llvm_loadable_module(TYPlugin 
TYPlugin.cpp
)

然后回到 llvm源码 的根目录

cd ../../../../

创建llvm_xcode文件夹,用于生成xcode模板

mkdir llvm_xcode
cd llvm_xcode/

执行生成xcode模板命令

cmake -G Xcode ../llvm

这里可能会报错,信息如下

CMake Error at tools/clang/tools/ty-plugin/CMakeLists.txt:1 (add_llvm_loadable_module):
  Unknown CMake command "add_llvm_loadable_module".


-- Configuring incomplete, errors occurred!

原因是 CMake 已经弃用add_llvm_loadable_module了, 因为它的功能跟add_llvm_library类似, 所以使用add_llvm_library()替换掉add_llvm_loadable_module

解释如下:

This function is very similar to add_llvm_library(),  so this patch merges it into add_llvm_library() and replaces all calls to add_llvm_loadable_module(lib ...) with add_llvm_library(lib MODULE ...)

关于修改文档在点击这里查看

ty-plugin 文件夹内的 CMakeLists.txt 文件内容改为

add_llvm_library(TYPlugin MODULE
TYPlugin.cpp
)

保存后,再次执行生成 xcode 模板命令

cmake -G Xcode ../llvm

成功后 llvm_xcode 目录内结构如下:

image_1e78i1qjh1jse13u7qks17klhe71g.png-40.4kB

打开 LLVM.xcodeproj 文件

这时xcode会提示

image_1e760tptc2vj16rnmjbhlu1e7h9.png-24.5kB

选择Automatically Create Schemes

scheme 选择我们自己的插件

image_1e76192th16r21o8l1phi6em1na813.png-8.6kB

找到 Loadable modules 目录里面就有我们的TYPlugin.cpp文件,可以开始编写插件代码了,路径如下图所示

image_1e7614n3k15lu2l81bd81lsb5fem.png-259.6kB

插件具体实现的功能就需要我们自己用C++代码来实现了,比如根据语法树检测我们编写的类名首字母是否为大写等需求,具体实现之后我会另外写文章讲述。

当编写好插件后,编译代码,会生成 TYPlugin.dyld 动态库文件 文件路径: llvm_xcode/Debug/lib/TYPlugin.dyld

打开我们自己平时的 xcode 项目, 通过 TARGET -> Build Setting -> 搜索 -> other_c 找到 Other C Flags, 双击添加: -Xclang -load -Xclang 动态库绝对路径 -Xclang -add-plugin -Xclang 插件名称

然后通过 TARGET -> Build Setting -> 搜索 -> compiler 找到 Compiler for C/C++/Objective-C , 将编译器换成我们自己使用 ninja编译出来的 clang !!注意!!: Xcode 默认是无法更改编译器的,需要对xcode进行hock

hock xcode

xcode hack 需要用到的文件 链接:pan.baidu.com/s/1ffyeGXML… 密码:4lr6

修改文件 HackedClang.xcplugin/Contents/Resources/HackedClang.xcspecExecPath="自己编译的clang的绝对路径"

然后在 XcodeHacking目录下进行命令行,将 XcodeHacking的内容剪切到 xcode 内部,命令如下:

sudo mv HackedClang.xcplugin `xcode-select-printpath`/../PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins

sudo mv HackedBuildSystem.xcspec `xcode-select-printpath`/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications

完成后 Compiler for C/C++/Objective-C 处就可以选择我们自己编译的clang了 选择我们自己的编译的clang后编译项目,我们自己写的插件就会生效了。

注意: 如果我们修改 TYPlugin.cpp 的内容,要对项目进行 clean,清除上一次的缓存。