本系列文章的運(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下:
- 將clang解壓至
${LLVM_SRC_ROOT}/..
,即llvm-src的平級(jí)目錄, 命名為clang- 將extra-tool也解壓到llvm平級(jí)目錄,命名為clang-tools-extra
- 在${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)境。