開發(fā)的插件效果如下
簡介
本開發(fā)是基于LLVM枕面,那么我們先來簡單了解一下LLVM:
- LLVM項目是模塊化、可重用的編譯器以及工具鏈技術(shù)的集合
- 美國計算機(jī)協(xié)會 (ACM) 將其2012 年軟件系統(tǒng)獎項頒給了LLVM娘侍,之前曾經(jīng)獲得此獎項的軟件和技術(shù)包括:Java大溜、Apache、 Mosaic抖誉、the World Wide Web殊轴、Smalltalk、UNIX袒炉、Eclipse等等旁理。
- LLVM的創(chuàng)始人 Chris Lattner,也是swift之父(也就是下面的這位)
LLVM官網(wǎng)鏈接
而什么是Clang呢我磁?
Clang是LLVM項目的一個子項目
-
基于LLVM架構(gòu)的C/C++/Objective-C編譯器前端
Clang傳送門簡單上圖看一眼二者之間的關(guān)系
實(shí)戰(zhàn)分析
基本文件
- 新建文件夾llvm孽文,下載LLVM(預(yù)計大小 648.2 M)
$ git clone https://git.llvm.org/git/llvm.git/
- 下載clang(預(yù)計大小 240.6 M)
$ cd llvm/tools
$ git clone https://git.llvm.org/git/clang.git/
- 注意 :
clang的下載目錄應(yīng)在llvm/tools下(如圖)
編譯工具
- 這里推薦使用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=‘安裝路徑’(本機(jī)為/Users/xxx/Desktop/LLVM/llvm_release)
-
依次執(zhí)行編譯、安裝指令
$ ninja
編譯完畢后郁副, 【llvm_build】目錄大概 21.05 G(僅供參考)
$ ninja install
安裝完畢后减牺,安裝目錄大概 11.92 G(僅供參考)
-
最終生成build.ninja以及l(fā)lvm_release文件夾位置如下圖
2、Xcode編譯
- 作為iOS開發(fā)者,使用Xcode則是更加得心應(yīng)手拔疚,但是Xcode編譯的速度較慢肥隆,親測在一個小時以上
- 在llvm同級目錄下新建一個【llvm_xcode】目錄,然后開始編譯
$ cd llvm_xcode
$ cmake -G Xcode ../llvm
-
完成后我們將看到熟悉的打開方式
-
打開project后我們選擇Auto的方式來創(chuàng)建scheme
-
然后選擇ALL_BUILD進(jìn)行編譯稚失,此處應(yīng)有1+小時的休息時間栋艳,然后就可以開始插件的編寫
編寫插件
1.目錄
- 在【clang/tools】源碼目錄下新建一個插件目錄,假設(shè)叫做【JJPlugin】(如下圖"JJPlugin目錄"紅色箭頭所示)
- 在【clang/tools/CMakeLists.txt】(如下圖"JJPlugin目錄"綠色箭頭所示) 最后添加內(nèi)容:
add_clang_subdirectory(JJPlugin)
墩虹,小括號里是插件目錄名
- 在【JJPlugin】目錄下新建一個【CMakeLists.txt】 (如下圖黃色箭頭所示)嘱巾,文件內(nèi)容是:
add_llvm_loadable_module(JJPlugin JJPlugin.cpp)
- 在【JJPlugin】目錄下]新建一個【JJPlugin.cpp】
$ touch JJPlugin.cpp
(如下圖黃色箭頭所示)
- 目錄文件創(chuàng)建完成后,需要利用cmake重新生成一下Xcode項目
$ cmake -G Xcode ../llvm
-
插件源代碼在【Sources/Loadable modules】目錄下可以找到诫钓,這樣就可以直接在Xcode里編寫插件代碼
2.代碼
- 這里提供了類名中下劃線的檢測以及類首字母小寫的警告
github鏈接
3.編譯
-
選擇我們的插件進(jìn)行編譯
-
然后就能看到我們編譯的lib
4.加載
- 在Xcode項目中指定加載插件動態(tài)庫:BuildSettings > OTHER_CFLAGS
-Xclang -load -Xclang 動態(tài)庫路徑 -Xclang -add-plugin -Xclang 插件名稱
5.Hack Xcode
- 首先我們要對Xcode進(jìn)行Hack旬昭,才能修改默認(rèn)的編譯器
-
找到自己編譯好的clang的路徑,也就是在我們前面定義的release的bin目錄下菌湃。
- 下載XcodeHacking.zip问拘,解壓,右鍵【HackedClang.xcplugin】點(diǎn)擊"顯示包內(nèi)容"打開修改【HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec】的內(nèi)容
-
把這個路徑修改為上面自己編譯好的clang的路徑
- 然后在XcodeHacking目錄下進(jìn)行命令行惧所,將XcodeHacking的內(nèi)容剪切到Xcode內(nèi)部
$ 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的編譯器,轉(zhuǎn)而使用我們自己的編譯器
-
編譯后如果代碼存在語法問題下愈,便能看到本文開頭的警告提示
總結(jié)
Clang 的開源給了我們更多的操作空間纽绍,我們可以利用clang的API針對語法樹(AST)進(jìn)行相應(yīng)的分析和處理,進(jìn)一步完善我們的需求势似,也能更好地提升我們代碼的規(guī)范和質(zhì)量拌夏。
附上關(guān)于語法樹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