開發的插件效果如下
簡介:
本開發是基於LLVM,那么我們先來簡單了解一下LLVM:
- LLVM項目是模塊化、可重用的編譯器以及工具鏈技術的集合
- 美國計算機協會 (ACM) 將其2012 年軟件系統獎項頒給了LLVM,之前曾經獲得此獎項的軟件和技術包括:Java、Apache、 Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等。
- LLVM的創始人 Chris Lattner,也是swift之父(也就是下面的這位)
LLVM官網鏈接
而什么是Clang呢?
-
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/
- 注意 :
clang的下載目錄應在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=‘安裝路徑’(本機為/Users/xxx/Desktop/LLVM/llvm_release)
-
依次執行編譯、安裝指令
$ ninja
編譯完畢后, 【llvm_build】目錄大概 21.05 G(僅供參考)
$ ninja install
安裝完畢后,安裝目錄大概 11.92 G(僅供參考)
-
最終生成build.ninja以及llvm_release文件夾位置如下圖
2、Xcode編譯
- 作為iOS開發者,使用Xcode則是更加得心應手,但是Xcode編譯的速度較慢,親測在一個小時以上
- 在llvm同級目錄下新建一個【llvm_xcode】目錄,然后開始編譯
$ cd llvm_xcode
$ cmake -G Xcode ../llvm
- 完成后我們將看到熟悉的打開方式
- 打開project后我們選擇Auto的方式來創建scheme
- 然后選擇ALL_BUILD進行編譯,此處應有1+小時的休息時間,然后就可以開始插件的編寫
編寫插件
1.目錄
- 在【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
- 插件源代碼在【Sources/Loadable modules】目錄下可以找到,這樣就可以直接在Xcode里編寫插件代碼
2.代碼
- 這里提供了類名中下划線的檢測以及類首字母小寫的警告
github鏈接
3.編譯
- 選擇我們的插件進行編譯
- 然后就能看到我們編譯的lib
4.加載
- 在Xcode項目中指定加載插件動態庫:BuildSettings > OTHER_CFLAGS
-Xclang -load -Xclang 動態庫路徑 -Xclang -add-plugin -Xclang 插件名稱
5.Hack Xcode
- 首先我們要對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
6.使用
- 重啟Xcode,修改Xcode的編譯器,轉而使用我們自己的編譯器
- 編譯后如果代碼存在語法問題,便能看到本文開頭的錯誤提示
##總結
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