基於LLVM開發屬於本身Xcode的Clang插件


開發的插件效果以下

error.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傳送門html

    簡單上圖看一眼兩者之間的關係
    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

    git

    編譯工具

  • 這裏推薦使用ninja和cmake(先安裝brew,https://brew.sh/
    $ brew install cmake
    $ brew install ninja
  • ninja若是安裝失敗,能夠直接從github獲取release版放入【/usr/local/bin】目錄中
    ninja的GitHub傳送門github

編譯方式

一、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)swift

  • 依次執行編譯、安裝指令
    $ ninjaxcode

    編譯完畢後, 【llvm_build】目錄大概 21.05 G(僅供參考)

    $ ninja install架構

    安裝完畢後,安裝目錄大概 11.92 G(僅供參考)
  • 最終生成build.ninja以及llvm_release文件夾位置以下圖
    build.ninja.jpg
    llvm目錄.pngide

二、Xcode編譯
  • 做爲iOS開發者,使用Xcode則是更加駕輕就熟,可是Xcode編譯的速度較慢,親測在一個小時以上
  • 在llvm同級目錄下新建一個【llvm_xcode】目錄,而後開始編譯
    $ cd llvm_xcode
    $ cmake -G Xcode ../llvm
  • 完成後咱們將看到熟悉的打開方式xcode編譯.png
  • 打開project後咱們選擇Auto的方式來建立schemeAutoScheme.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
  • 編譯後若是代碼存在語法問題,便能看到本文開頭的錯誤提示
    編譯error.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

相關文章
相關標籤/搜索