基于LLVM开发属于自己Xcode的Clang插件


开发的插件效果如下

效果图.png

简介


本开发是基于LLVM,那么我们先来简单了解一下LLVM:

  • LLVM项目是模块化、可重用的编译器以及工具链技术的集合
  • 美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM,之前曾经获得此奖项的软件和技术包括:Java、Apache、 Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等。
  • LLVM的创始人 Chris Lattner,也是swift之父(也就是下面的这位)
    LLVM官网链接

Chris Lattner.jpg


而什么是Clang呢?

  • Clang是LLVM项目的一个子项目

  • 基于LLVM架构的C/C++/Objective-C编译器前端
    Clang传送门

    简单上图看一眼二者之间的关系

    Clang与LLVM.png


实战分析


基本文件

  • 新建文件夹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/
  • 注意 :
    clang的下载目录应在llvm/tools下(如图)
    clang下载目录.png


编译工具

  • 这里推荐使用ninja和cmake(先安装brew,https://brew.sh/
    $ brew install cmake
    $ brew install ninja
  • ninja如果安装失败,可以直接从github获取release版放入【/usr/local/bin】目录中
    ninja的GitHub传送门

编译方式

1、ninja编译
  • 在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

    编译完毕后, 【llvm_build】目录大概 21.05 G(仅供参考)

    $ ninja install

    安装完毕后,安装目录大概 11.92 G(仅供参考)
  • 最终生成build.ninja以及llvm_release文件夹位置如下图


    build.ninja.jpg

    llvm目录.png
2、Xcode编译
  • 作为iOS开发者,使用Xcode则是更加得心应手,但是Xcode编译的速度较慢,亲测在一个小时以上
  • 在llvm同级目录下新建一个【llvm_xcode】目录,然后开始编译
    $ cd llvm_xcode
    $ cmake -G Xcode ../llvm
  • 完成后我们将看到熟悉的打开方式
    xcode编译.png
  • 打开project后我们选择Auto的方式来创建scheme
    AutoScheme.png
  • 然后选择ALL_BUILD进行编译,此处应有1+小时的休息时间,然后就可以开始插件的编写
    ALL_BUILD.png


编写插件


1.目录

  • 在【clang/tools】源码目录下新建一个插件目录,假设叫做【JJPlugin】(如下图"JJPlugin目录"红色箭头所示)
  • 在【clang/tools/CMakeLists.txt】(如下图"JJPlugin目录"绿色箭头所示) 最后添加内容: add_clang_subdirectory(JJPlugin),小括号里是插件目录名
    CMakeLists.png
  • 在【JJPlugin】目录下新建一个【CMakeLists.txt】 (如下图黄色箭头所示),文件内容是: add_llvm_loadable_module(JJPlugin JJPlugin.cpp)
    JJPlugin-CMakeList.png
  • 在【JJPlugin】目录下]新建一个【JJPlugin.cpp】$ touch JJPlugin.cpp (如下图黄色箭头所示)
JJPlugin目录.png
  • 目录文件创建完成后,需要利用cmake重新生成一下Xcode项目
    $ cmake -G Xcode ../llvm
  • 插件源代码在【Sources/Loadable modules】目录下可以找到,这样就可以直接在Xcode里编写插件代码


    source file.png

2.代码

  • 这里提供了类名中下划线的检测以及类首字母小写的警告
    github链接
    code.png

3.编译

  • 选择我们的插件进行编译


    编译插件.png
  • 然后就能看到我们编译的lib


    show in finder.png

    lib路径.png

4.加载

  • 在Xcode项目中指定加载插件动态库:BuildSettings > OTHER_CFLAGS
    -Xclang -load -Xclang 动态库路径 -Xclang -add-plugin -Xclang 插件名称
    加载插件.png

5.Hack Xcode

  • 首先我们要对Xcode进行Hack,才能修改默认的编译器
  • 找到自己编译好的clang的路径,也就是在我们前面定义的release的bin目录下。
    clang路径.png
  • 下载XcodeHacking.zip,解压,右键【HackedClang.xcplugin】点击"显示包内容"打开修改【HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec】的内容
    HackedClang.xcspec.png
  • 把这个路径修改为上面自己编译好的clang的路径


    ExecPath.png
  • 然后在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

6.使用

  • 重启Xcode,修改Xcode的编译器,转而使用我们自己的编译器


    clang LLVM.png
  • 编译后如果代码存在语法问题,便能看到本文开头的警告提示


    效果图.png


总结


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容