编译clang代码和实现自定义clang插件

729 阅读3分钟

一、目标

  1. 编译clang代码和打包自定义clang插件
  2. 使用定义clang插件

二、编译环境:

  1. mac os bif sur : 11.15.2
  2. xcode : 13.0

三、下载llvm

git clone mirrors.tuna.tsinghua.edu.cn/git/llvm-pr…

四、处理llvm

  1. clang 拷贝到 llvm/tools 目录下
  2. compiler-rt, libcxx, licbcxxabi 拷贝到 llvm/projects 目录下
  3. 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 /**源文件*/
)

Xnip2022-10-30_18-52-36.jpg

第四步:

重新编译llvm 在llvm-build目录下执行

cmake -G Xcode ../llvm

第五步:

xcode配置 第一步新建scheme: clang 第二步新建scheme: clangTooling 注意1:第一次打开 LLVM xcode工程会提示自动还是手动创建scheme,选择手动创建scheme 注意2:新建时要在target选择 clang和clangTooling 名字用默认的就可以

第六步:

找到自定义插件的源文件,编写测试代码 目录: Xnip2022-10-30_18-55-12.jpg

第七步:

测试插件

//命令格式
自己编译的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
  1. 新建一个Demo工程:在ViewController设置如下有问题的代码:
@interface ViewController ()

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *array;

@end
  1. 执行如下执行测试:
/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

会出现如下提示: image.jpeg

第八步:

集成插件到xcode

  1. 打开刚刚建立的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

如图: Xnip2022-10-30_18-58-06.jpg

  1. 在Build Settings 中新增两项用户自定义的设置 CC:对应的是自己编译的 clang 二进制文件的绝对路径 CXX:对应的是自己编译的 clang++ 二进制文件的绝对路径 Xnip2022-10-30_18-59-03.jpg

  2. 在Build Settings 栏目中搜索 index,将 Enable Index-While-Building Functionality 设置为 NO。 aaaa.jpg

  3. 编译测试插件 直接在Xcode中 Command + B 编译 ,然后即可看到clang插件完美运行,给出警告⚠️。 bbb.jpg

七、后语

这里只是简单的对编译clang、llvm和自定义clang插件做了入门介绍,期间也遇到很多问题,这里不赘述,需要的朋友可以评论区说出您的问题,我看到会第一时间回复大家!