一、目标
- 编译clang代码和打包自定义clang插件
- 使用定义clang插件
二、编译环境:
- mac os bif sur : 11.15.2
- xcode : 13.0
三、下载llvm
git clone mirrors.tuna.tsinghua.edu.cn/git/llvm-pr…
四、处理llvm
- 把 clang 拷贝到 llvm/tools 目录下
- 把 compiler-rt, libcxx, licbcxxabi 拷贝到 llvm/projects 目录下
- 把 clang-tools-extra 拷贝到 llvm/tools/clang/tools 目录下
五、编译llvm、clang步骤:
方式1: xcode 编译 ,但是很慢,做好心里准备我的i5编译大概10分钟😂
第一步:新建llvm_build目录
第二步:在llvm_build执行如下指令生成xcode的llvm工程
cmake -G Xcode ../llvm
第三步:打开xcode配置 注意:第一次打开 LLVM xcode工程会提示自动还是手动创建scheme,选择手动创建scheme
第一步新建scheme: clang
第一步新建scheme: clangTooling
注意:新建时要在target列表选择 clang和clangTooling 名字用默认的就可以
第四步:依次编译 clang、clangTooling
六、自定义clang插件:
第一步:
在 llvm/tools/clang/tools 目录下新建自定义插件文件夹 myplugin (这个是你自己建的,名字随便即可)。
第二步:
修改 llvm/tools/clang/tools 目录下的文件CMakeLists.txt,在文件最底部新增一行
add_clang_subdirectory(myPlugin)
第三步:
在插件目录创建文件在 JPPlugin 目录下新建一个名为 JPPlugin.cpp 的文件和 CMakeLists.txt 文件,并在 CMakeLists.txt 中写上如下代码
add_llvm_library( MyPlugins/**生成target的名字*/ MODULE BUILDTREE_ONLY
myPlugin.cpp /**源文件*/
)
第四步:
重新编译llvm 在llvm-build目录下执行
cmake -G Xcode ../llvm
第五步:
xcode配置 第一步新建scheme: clang 第二步新建scheme: clangTooling 注意1:第一次打开 LLVM xcode工程会提示自动还是手动创建scheme,选择手动创建scheme 注意2:新建时要在target选择 clang和clangTooling 名字用默认的就可以
第六步:
找到自定义插件的源文件,编写测试代码 目录:
第七步:
测试插件
//命令格式
自己编译的clang文件路径 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.1.sdk/ -Xclang -load -Xclang 插件(.dyld)路径 -Xclang -add-plugin -Xclang 插件名 -c 源码路径
//例子
/Users/XXX/Desktop/build_xcode/Debug/bin/clang -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.1.sdk/ -Xclang -load -Xclang /Users/XXXX/Desktop/build_xcode/Debug/lib/CJLPlugin.dylib -Xclang -add-plugin -Xclang CJLPlugin -c /Users/XXXX/Desktop/XXX/XXXX/测试demo/testClang/testClang/ViewController.m
- 新建一个Demo工程:在ViewController设置如下有问题的代码:
@interface ViewController ()
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *array;
@end
- 执行如下执行测试:
/Users/gegaozhao/Desktop/company/compileTest/llvm/llvm-project/llvm_build/Debug/bin/clang -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk -Xclang -load -Xclang /Users/gegaozhao/Desktop/company/compileTest/llvm/llvm-project/llvm_build/Debug/lib/MyPlugins.dylib -Xclang -add-plugin -Xclang myPlugin -c /Users/gegaozhao/Desktop/company/compileTest/demo/Test/Test/ViewController.m
会出现如下提示:
第八步:
集成插件到xcode
- 打开刚刚建立的Demo工程,在Build Settings -> Other C Flags 中添加上如下的内容👇:
-Xclang -load -Xclang 你编译的JPPlugin.dylib地址 -Xclang -add-plugin -Xclang JPPlugin
我的是:
-Xclang -load -Xclang /Users/用户名/Desktop/xxx/llvm/llvm-project/llvm_build/Debug/lib/MyPlugins.dylib -Xclang -add-plugin -Xclang myPlugin
如图:
-
在Build Settings 中新增两项用户自定义的设置 CC:对应的是自己编译的 clang 二进制文件的绝对路径 CXX:对应的是自己编译的 clang++ 二进制文件的绝对路径
-
在Build Settings 栏目中搜索 index,将 Enable Index-While-Building Functionality 设置为 NO。
-
编译测试插件 直接在Xcode中 Command + B 编译 ,然后即可看到clang插件完美运行,给出警告⚠️。
七、后语
这里只是简单的对编译clang、llvm和自定义clang插件做了入门介绍,期间也遇到很多问题,这里不赘述,需要的朋友可以评论区说出您的问题,我看到会第一时间回复大家!