基于LLVM開發(fā)屬于自己Xcode的Clang插件


開發(fā)的插件效果如下

效果圖.png

簡介


本開發(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)鏈接

Chris Lattner.jpg


而什么是Clang呢我磁?

  • Clang是LLVM項目的一個子項目

  • 基于LLVM架構(gòu)的C/C++/Objective-C編譯器前端
    Clang傳送門

    簡單上圖看一眼二者之間的關(guān)系

    Clang與LLVM.png


實(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下(如圖)
    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=‘安裝路徑’(本機(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文件夾位置如下圖


    build.ninja.jpg

    llvm目錄.png
2、Xcode編譯
  • 作為iOS開發(fā)者,使用Xcode則是更加得心應(yīng)手拔疚,但是Xcode編譯的速度較慢肥隆,親測在一個小時以上
  • 在llvm同級目錄下新建一個【llvm_xcode】目錄,然后開始編譯
    $ cd llvm_xcode
    $ cmake -G Xcode ../llvm
  • 完成后我們將看到熟悉的打開方式
    xcode編譯.png
  • 打開project后我們選擇Auto的方式來創(chuàng)建scheme
    AutoScheme.png
  • 然后選擇ALL_BUILD進(jìn)行編譯稚失,此處應(yīng)有1+小時的休息時間栋艳,然后就可以開始插件的編寫
    ALL_BUILD.png


編寫插件


1.目錄

  • 在【clang/tools】源碼目錄下新建一個插件目錄,假設(shè)叫做【JJPlugin】(如下圖"JJPlugin目錄"紅色箭頭所示)
  • 在【clang/tools/CMakeLists.txt】(如下圖"JJPlugin目錄"綠色箭頭所示) 最后添加內(nèi)容: add_clang_subdirectory(JJPlugin)墩虹,小括號里是插件目錄名
    CMakeLists.png
  • 在【JJPlugin】目錄下新建一個【CMakeLists.txt】 (如下圖黃色箭頭所示)嘱巾,文件內(nèi)容是: add_llvm_loadable_module(JJPlugin JJPlugin.cpp)
    JJPlugin-CMakeList.png
  • 在【JJPlugin】目錄下]新建一個【JJPlugin.cpp】$ touch JJPlugin.cpp (如下圖黃色箭頭所示)
JJPlugin目錄.png
  • 目錄文件創(chuàng)建完成后,需要利用cmake重新生成一下Xcode項目
    $ cmake -G Xcode ../llvm
  • 插件源代碼在【Sources/Loadable modules】目錄下可以找到诫钓,這樣就可以直接在Xcode里編寫插件代碼


    source file.png

2.代碼

  • 這里提供了類名中下劃線的檢測以及類首字母小寫的警告
    github鏈接
    code.png

3.編譯

  • 選擇我們的插件進(jìn)行編譯


    編譯插件.png
  • 然后就能看到我們編譯的lib


    show in finder.png

    lib路徑.png

4.加載

  • 在Xcode項目中指定加載插件動態(tài)庫:BuildSettings > OTHER_CFLAGS
    -Xclang -load -Xclang 動態(tài)庫路徑 -Xclang -add-plugin -Xclang 插件名稱
    加載插件.png

5.Hack Xcode

  • 首先我們要對Xcode進(jìn)行Hack旬昭,才能修改默認(rèn)的編譯器
  • 找到自己編譯好的clang的路徑,也就是在我們前面定義的release的bin目錄下菌湃。
    clang路徑.png
  • 下載XcodeHacking.zip问拘,解壓,右鍵【HackedClang.xcplugin】點(diǎn)擊"顯示包內(nèi)容"打開修改【HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec】的內(nèi)容
    HackedClang.xcspec.png
  • 把這個路徑修改為上面自己編譯好的clang的路徑


    ExecPath.png
  • 然后在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)而使用我們自己的編譯器


    clang LLVM.png
  • 編譯后如果代碼存在語法問題下愈,便能看到本文開頭的警告提示


    效果圖.png


總結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市履因,隨后出現(xiàn)的幾起案子障簿,更是在濱河造成了極大的恐慌,老刑警劉巖栅迄,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站故,死亡現(xiàn)場離奇詭異,居然都是意外死亡毅舆,警方通過查閱死者的電腦和手機(jī)西篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憋活,“玉大人污淋,你說我怎么就攤上這事∮嘁矗” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盐欺。 經(jīng)常有香客問我赁豆,道長,這世上最難降的妖魔是什么冗美? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任魔种,我火速辦了婚禮,結(jié)果婚禮上粉洼,老公的妹妹穿的比我還像新娘节预。我一直安慰自己,他們只是感情好属韧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布安拟。 她就那樣靜靜地躺著,像睡著了一般宵喂。 火紅的嫁衣襯著肌膚如雪糠赦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天锅棕,我揣著相機(jī)與錄音拙泽,去河邊找鬼。 笑死裸燎,一個胖子當(dāng)著我的面吹牛顾瞻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播德绿,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼荷荤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脆炎?” 一聲冷哼從身側(cè)響起梅猿,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秒裕,沒想到半個月后袱蚓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡几蜻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年喇潘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梭稚。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡颖低,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弧烤,到底是詐尸還是另有隱情忱屑,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站莺戒,受9級特大地震影響伴嗡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从铲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一瘪校、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧名段,春花似錦阱扬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至自娩,卻和暖如春用踩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忙迁。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工脐彩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姊扔。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓惠奸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恰梢。 傳聞我的和親對象是個殘疾皇子佛南,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容