基于LLVM&clang的cpp工具開(kāi)發(fā)-1 環(huán)境安裝

本系列文章的運(yùn)行環(huán)境基于CentOS 6.3 x86_64,gcc 5.2.0,cmake version 3.15.0, glibc 2.23.2,后文不再贅述。

LLVM&clang簡(jiǎn)介

LLVM是一組編譯工具鏈集合,值得注意的是,LLVM并不是誰(shuí)的縮寫(xiě),其中的VM與virtual machine也沒(méi)有關(guān)系。如官網(wǎng)所述,LLVM就是這個(gè)項(xiàng)目的名稱,沒(méi)有其他含義。
clang(讀音/klaNG/,音同可浪)是LLVM的一個(gè)子項(xiàng)目(sub-project)。 它是一個(gè)C系語(yǔ)言編譯前端,同時(shí)clang還提供了以下三種面向開(kāi)發(fā)者的擴(kuò)展方式:

  • C Library libclang ,libclang是一套穩(wěn)定的(stable)但對(duì)AST控制不夠全面的C Libray
  • C++ Library libtooling,libtooling是一套對(duì)AST控制全面但卻不夠穩(wěn)定的C++ Library,不穩(wěn)定指的是無(wú)前后兼容保證,接口經(jīng)常變化(包括函數(shù)名稱、函數(shù)參數(shù)列表)
  • plugin, C++接口,主要針對(duì)單次編譯的單個(gè)文件,比如可用于實(shí)現(xiàn)一個(gè)自定義風(fēng)格的代碼檢查工具

不同的業(yè)務(wù)目標(biāo),可以在以上三種做出選擇,本系列最終目的是完成中大型項(xiàng)目的代碼索引,所以選擇基于libtooling進(jìn)行開(kāi)發(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等源碼目錄移動(dòng)到llvm下:

  1. 將clang解壓至 ${LLVM_SRC_ROOT}/..,即llvm-src的平級(jí)目錄, 命名為clang
  2. 將extra-tool也解壓到llvm平級(jí)目錄,命名為clang-tools-extra
  3. 在${LLVM_SRC_ROOT}/build下,cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" .., 這時(shí), LLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD 會(huì)被設(shè)置成ON,繼續(xù)編譯: make clang && make clangd

編譯安裝

先決條件

最新的LLVM需要CMake. Version 3.4.3,下文假設(shè)合適版本的cmake已經(jīng)正確安裝,此外編譯LLVM,最好磁盤(pán)剩余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全系列編譯,硬盤(pán)消耗約80G, 如沒(méi)有如此多的空間,可根據(jù)需要只編譯某一部分,比如 在cmake build時(shí),僅執(zhí)行make clang

假設(shè)CMake和CXX(比如g++)是工作的,直接按照官方文檔編譯即可, 編譯比較耗時(shí),為了加速,可以設(shè)置-j并發(fā)參數(shù),參考如下build命令的注釋內(nèi)容,即使加速,也需要小時(shí)級(jí)別耗時(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開(kāi)發(fā)所需的基礎(chǔ)環(huán)境。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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