iOS之LLVM 五

345 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Clang插件

编写一个Clang插件,实现效果:定义NSStringNSArrayNSDictionary类型的属性,未使用copy修饰,对该属性提示警告。

下载LLVM

由于国内的网络限制,需要借助镜像下载LLVM的源码:mirror.tuna.tsinghua.edu.cn/help/llvm/

下载LLVM项目

git	clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm.git

LLVMtools目录下,下载Clang

cd	llvm/tools
git	clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang.git

LLVMprojects目录下,下载compiler-rtlibcxxlibcxxabi

cd	../projects
git	clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/compiler-rt.g
it
git	clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxx.git
git	clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxxabi.git

Clangtools下,安装extra工具

cd	../tools/clang/tools
git	clone	https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang-tools-e
xtra.git
安装cmake

使用brew命令,查看是否安装cmake,如果已安装,跳过此步骤

brew list

通过brew安装cmake

brew install cmake

编译LLVM

通过Xcode编译LLVM

cmake编译成Xcode项目

mkdir build_xcode
cd build_xcode
cmake -G Xcode ../llvm

使用Xcode编译Clang

选择手动管理Schemes

image-10.png 点击左下⻆加号,在Target中添加clangclangTooling

image-11.png 通过Run Without Building运⾏,代码没有改变的时候,不需要重新编译,直接运⾏现有可执⾏⽂件即可

image-12.png

通过ninja编译LLVM

安装ninja

brew install ninja

LLVM源码根目录下,新建一个build_ninja目录,最终会在build_ninja目录下生成build.ninja

LLVM源码根目录下,新建一个llvm_release目录,最终编译文件会在llvm_release文件夹路径下

cd llvm_build
cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=安装路径
  • 本机为/Users/xxx/xxx/LLVM/llvm_release,注意DCMAKE_INSTALL_PREFIX后面不能有空格 依次执行编译、安装指令
ninja
ninja	install
创建插件

/llvm/tools/clang/tools目录下,新建插件HKPlugin

image-13.png 修改/llvm/tools/clang/tools目录下的CMakeLists.txt文件

image-14.png 新增add_clang_subdirectory(HKPlugin)

image-15.pngHKPlugin目录下,新建HKPlugi.cppCMakeLists.txt文件

image-16.png 打开CMakeLists.txt文件,写入以下内容:

add_llvm_library(	HKPlugin	MODULE	BUILDTREE_ONLY
		HKPlugin.cpp
)

利用cmake重新生成Xcode项目,在build_xcode目录中执行cmake命令

cmake -G Xcode ../llvm

最后,可以在LLVMXcode项目中,在Loadable modules目录下找到自定义Plugin目录

image-17.png

  • 打开HKPlugi.cpp文件,可以在里面编写插件代码。

到此Clang插件的创建就完成了,后面我们来进行Clang插件代码的编写。