前言
了解此流程需要用到 llvm源码,并且需要对xcode进行hock。
- 关于llvm源码下载、编译,请看这篇文章
- xcode hack文件下载: 链接:pan.baidu.com/s/1ffyeGXML… 密码:4lr6
开始吧
首先找到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 目录内结构如下:
打开 LLVM.xcodeproj 文件
这时xcode会提示
选择Automatically Create Schemes
scheme 选择我们自己的插件
找到 Loadable modules 目录里面就有我们的TYPlugin.cpp文件,可以开始编写插件代码了,路径如下图所示
插件具体实现的功能就需要我们自己用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.xcspec
中 ExecPath="自己编译的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,清除上一次的缓存。