Build LLVM+Clang from source code with mingw

這邊不筆記一下不行,人老了沒辦法記這麼詳細了,發揮打遊戲查攻略的精神搜尋資料和嘗試錯誤!! 這也太難,光是編譯就可以讓一堆人打退堂鼓了...

我就是想在 win7 + mingw 環境下用 clang ! 官網都不提供只好自己來編譯了。

Reference

Requirement: 確定都有寫進 system path

  • mingw32 或 mingw32-w64
  • cmake
  • python 2 或 python 3 都可以
  • 我的 OS: windows 7 64-bit,有人則是在 linux 系統中編譯 cross-platform target 比較好設定,網路上的步驟也幾乎都是 linux 系統指令

Downloads: 一堆 source code 還要放在特定的結構目錄下才能正常編譯

  • LLVM source code: 重新命名資料夾 llvm
  • Clang source code: 重新命名資料夾為 clang,放在 llvm/tools/
  • clang-tools-extra source code: (optional) 重新命名資料夾為 extra,放在 llvm/tools/clang/tools/, 這樣才有些其他 clang tool. eg. AST matcher
  • compiler-rt source code: (optional) 重新命名資料夾為 compiler-rt,放在資料夾 llvm/projects/
  • 其他 source code 幾乎都是放在 llvm/projects/ 目錄下

Steps

  1. 執行 cmake-gui,設定好 source & build path
  2. 執行 configure,選 mingw build
  3. 找到 CMAKE_BUILD_TYPE,輸入值 Release 或 MinSizeRel,才可以編譯比較小的 LLVM,否則 lib大小很驚人
  4. 執行 generate,確定沒有錯誤訊息
  5. cmd 進入 build 目錄下,執行 mingw32-make 編譯
  6. 同目錄執行 mingw32-make install 完成 install目錄 (官方文件提示要先 mingw32-make check-all,但 win7 環境下都失敗不管它了)
  7. lib 目錄下要 include 的東西太多可以 archive 起來,之後要引入 linker 比較方便,這裡範例使用 thin archive,只打包檔名,並非真的打包所有 *.a。在 llvm/lib/ 目錄下輸入
  8. 以後要 link clang 只要 link libclang.a 即可。若使用官網提供 VC++ 編譯好的 binary,則是可以在 link time 時將 libclang.lib 當成 object file 來 link 。

這樣編譯好的 clang.exe 基本上還是使用 mingw 的 standard library,需要 mingw 的 runtime 才能執行,使用 clang.exe  前確保 mingw 有設定進 system path

編譯好的懶人包

Clang AST dump

設計一個 main.cpp ,嘗試用 clang 把 AST 印出來,兩種指令都可以,如果有引入其他 lib 可能會 dump 出一堆東西(如 #include<time.h>),畢竟 clang 預設指令不含 preprocessor,不會去認這是不是 standard library

Auto generate config header using Clang AST

clangheader

Clang 真是好玩的東西,可以自己寫 compiler 拉~~~哈哈哈哈