本系列文章的運(yùn)行環(huán)境基于CentOS 6.3 x86_64葫督,gcc 5.2.0,cmake version 3.15.0匣椰, glibc 2.23.2裆熙,后文不再贅述。
LLVM&clang簡介
LLVM是一組編譯工具鏈集合禽笑,值得注意的是入录,LLVM并不是誰的縮寫,其中的VM與virtual machine也沒有關(guān)系佳镜。如官網(wǎng)所述僚稿,LLVM就是這個(gè)項(xiàng)目的名稱,沒有其他含義蟀伸。
clang(讀音/klaNG/蚀同,音同可浪)是LLVM的一個(gè)子項(xiàng)目(sub-project)。 它是一個(gè)C系語言的編譯前端望蜡,同時(shí)clang還提供了以下三種面向開發(fā)者的擴(kuò)展方式:
- C Library libclang 唤崭,libclang是一套穩(wěn)定的(stable)但對AST控制不夠全面的C Libray
- C++ Library libtooling,libtooling是一套對AST控制全面但卻不夠穩(wěn)定的C++ Library脖律,不穩(wěn)定指的是無前后兼容保證谢肾,接口經(jīng)常變化(包括函數(shù)名稱、函數(shù)參數(shù)列表)
- plugin小泉, C++接口芦疏,主要針對單次編譯的單個(gè)文件冕杠,比如可用于實(shí)現(xiàn)一個(gè)自定義風(fēng)格的代碼檢查工具
不同的業(yè)務(wù)目標(biāo),可以在以上三種做出選擇酸茴,本系列最終目的是完成中大型項(xiàng)目的代碼索引分预,所以選擇基于libtooling進(jìn)行開發(fā)。
安裝
源碼下載
由于libtooling的不穩(wěn)定因素薪捍,我們決定采用最新的LLVM8.0-release版本笼痹。
分別下載LLVM源碼、clang源碼酪穿、clang-tools-extra源碼并解壓凳干。由于LLVM各個(gè)工程共享了很多CMake配置,因此需要調(diào)整他們的位置被济,
假設(shè)LLVM救赐、clang、clang-tools-extra源碼解壓后被放置在 LLVM_SRC_ROOT, CLANG_SRC_ROOT,CLANG_TOOLS_EXTRA_ROOT只磷,那么需要進(jìn)行如下的目錄調(diào)整
#set these 3 env
export LLVM_SRC_ROOT=/path/to/your/llvm
export CLANG_SRC_ROOT=/path/to/your/cfe #clang-src
export CLANG_TOOLS_EXTRA_ROOT=/path/to/your/clang-tools-extra
#will use 3 env defined above
mv ${CLANG_SRC_ROOT} ${LLVM_SRC_ROOT}/tools/clang
mv ${CLANG_TOOLS_EXTRA_ROOT} ${LLVM_SRC_ROOT}/tools/clang/tools/extra
使用ln -s TARGET LINK
的方式建立兩個(gè)軟鏈也可達(dá)到類似的收益经磅。
除了上面的方式,官方提供了cmake 宏 LLVM_ENABLE_PROJECTS钮追,可以不將clang等源碼目錄移動到llvm下:
- 將clang解壓至
${LLVM_SRC_ROOT}/..
预厌,即llvm-src的平級目錄, 命名為clang- 將extra-tool也解壓到llvm平級目錄,命名為clang-tools-extra
- 在${LLVM_SRC_ROOT}/build下元媚,
cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" ..
, 這時(shí)配乓, LLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD 會被設(shè)置成ON,繼續(xù)編譯:make clang && make clangd
惠毁。
編譯安裝
先決條件
最新的LLVM需要CMake. Version 3.4.3,下文假設(shè)合適版本的cmake已經(jīng)正確安裝崎页,此外編譯LLVM鞠绰,最好磁盤剩余80G以上空間。
編譯前空間:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 5.0G 14G 28% /
tmpfs 7.8G 11M 7.8G 1% /dev/shm
/dev/vdb 233G 8.6G 212G 4% /home
編譯后剩余空間:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 5.0G 14G 28% /
tmpfs 7.8G 11M 7.8G 1% /dev/shm
/dev/vdb 233G 82G 139G 38% /home
粗略的空間估算, 由于進(jìn)行的是LLVM全系列編譯飒焦,硬盤消耗約80G, 如沒有如此多的空間蜈膨,可根據(jù)需要只編譯某一部分,比如 在cmake build時(shí)牺荠,僅執(zhí)行make clang
翁巍。
假設(shè)CMake和CXX(比如g++)是工作的,直接按照官方文檔編譯即可, 編譯比較耗時(shí)休雌,為了加速灶壶,可以設(shè)置-j并發(fā)參數(shù),參考如下build命令的注釋內(nèi)容,即使加速杈曲,也需要小時(shí)級別耗時(shí)(視機(jī)器配置和負(fù)荷有所不同)驰凛。
cd ${LLVM_SRC_ROOT}
mkdir -p build
cd build
cmake ${LLVM_SRC_ROOT}
CPU_NUM=`getconf _NPROCESSORS_ONLN`
cmake --build . # to speed up , -j <num> is recommended, say : cmake --build . -j ${CPU_NUM} || cmake --build .
#if compile successfully, install
cmake -DCMAKE_INSTALL_PREFIX=/path/where/llvm/installed -P cmake_install.cmake
如以上均正確返回胸懈,再double check一下,環(huán)境變量等是否正確
$ clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/M23/local/llvm/bin
檢查一下LLVM的某項(xiàng)配置:
$ llvm-config --cxxflags
-I/home/M23/local/llvm/include -std=c++11 -fno-exceptions -fno-rtti -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
在上面的步驟中恰响,我們還下載了clang-tools-extra趣钱, 如果需要編譯clangd等extra-tool, 則需要在cmake調(diào)用中增加 -DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD=ON
, 然后 make clangd即可胚宦。
至此首有,我們成功安裝了clang開發(fā)所需的基礎(chǔ)環(huán)境。