- LLVM项目是模块化、可重用的编译器以及工具链技术的集合
- 美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM,之前曾经获得此奖项的软件和技术包括:Java、Apache、 Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等。
- LLVM的创始人 Chris Lattner,也是swift之父(也就是下面的这位) LLVM官网链接
-
Clang是LLVM项目的一个子项目
-
基于LLVM架构的C/C++/Objective-C编译器前端 Clang传送门
- 新建文件夹llvm,下载LLVM(预计大小 648.2 M)
$ git clone https://git.llvm.org/git/llvm.git/
- 下载clang(预计大小 240.6 M)
$ cd llvm/tools
$ git clone https://git.llvm.org/git/clang.git/
- 这里推荐使用ninja和cmake(先安装brew,https://brew.sh/)
`$ brew install cmake`
`$ brew install ninja`
- ninja如果安装失败,可以直接从github获取release版放入【/usr/local/bin】目录中 ninja的GitHub传送门
- 在LLVM源码同级目录下新建一个【llvm_build】目录(最终会在【llvm_build】目录下生成【build.ninja】)
- 同时在LLVM源码同级目录下新建一个【llvm_release】目录(最终编译文件会在llvm_release文件夹路径下)
$ cd llvm_build
$ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=‘安装路径’(本机为/Users/xxx/Desktop/LLVM/llvm_release)
- 依次执行编译、安装指令
$ ninja
$ ninja install
- 作为iOS开发者,使用Xcode则是更加得心应手,但是Xcode编译的速度较慢,亲测在一个小时以上
- 在llvm同级目录下新建一个【llvm_xcode】目录,然后开始编译
$ cd llvm_xcode
$ cmake -G Xcode ../llvm
# 编写插件
- 在【clang/tools】源码目录下新建一个插件目录,假设叫做【JJPlugin】(如下图"JJPlugin目录"红色箭头所示)
- 在【clang/tools/CMakeLists.txt】(如下图"JJPlugin目录"绿色箭头所示) 最后添加内容:
add_clang_subdirectory(JJPlugin)
,小括号里是插件目录名 - 在【JJPlugin】目录下新建一个【CMakeLists.txt】 (如下图黄色箭头所示),文件内容是:
add_llvm_loadable_module(JJPlugin JJPlugin.cpp)
- 在【JJPlugin】目录下]新建一个【JJPlugin.cpp】
$ touch JJPlugin.cpp
(如下图黄色箭头所示)
- 目录文件创建完成后,需要利用cmake重新生成一下Xcode项目
$ cmake -G Xcode ../llvm
- 这里提供了类名中下划线的检测以及类首字母小写的警告 github链接
- 在Xcode项目中指定加载插件动态库:BuildSettings > OTHER_CFLAGS
-Xclang -load -Xclang 动态库路径 -Xclang -add-plugin -Xclang 插件名称
- 首先我们要对Xcode进行Hack,才能修改默认的编译器
- 找到自己编译好的clang的路径,也就是在我们前面定义的release的bin目录下。
- 下载XcodeHacking.zip,解压,右键【HackedClang.xcplugin】点击"显示包内容"打开修改【HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec】的内容
- 把这个路径修改为上面自己编译好的clang的路径
- 然后在XcodeHacking目录下进行命令行,将XcodeHacking的内容剪切到Xcode内部
sudo mv HackedClang.xcplugin \`xcode-select -print-
path`/../PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins
sudo mv HackedBuildSystem.xcspec \`xcode-select -print- path`/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications`
Clang 的开源给了我们更多的操作空间,我们可以利用clang的API针对语法树(AST)进行相应的分析和处理,进一步完善我们的需求,也能更好地提升我们代码的规范和质量。 附上关于语法树AST的资料: https://clang.llvm.org/doxygen/namespaceclang.html https://clang.llvm.org/doxygen/classclang_1_1Decl.html https://clang.llvm.org/doxygen/classclang_1_1Stmt.html