基於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傳送門

    簡單上圖看一眼二者之間的關系
    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的方式來創建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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM