LLVM 3.9/4.0 安裝筆記 (Debian / Ubuntu)

目錄

  • 安裝/升級(jí)cmake
  • 安裝Ninja
  • 安裝libffi和Python2.7.13
  • 安裝Clang和LLVM (源碼編譯)
  • 安裝plugin

安裝/升級(jí)cmake

根據(jù)LLVM官網(wǎng),編譯LLVM和Clang需要CMake 3.4.3以上 (2017年2月):

LLVM requires CMake 3.4.3 to build. It is generally recommended to use a recent CMake, especially if you’re generating Ninja build files. This is because the CMake project is constantly improving the quality of the generators, and the Ninja generator gets a lot of attention.

這段話告訴我們兩件事情:一是用新版的cmake是一個(gè)比較穩(wěn)妥的選擇,二是用于編譯LLVM的cmake的generator的選擇上,可能Ninja是一個(gè)比較好的選擇。

在Ubuntu 14.04.5上如果用apt-get來(lái)安裝cmake的話,會(huì)得到一個(gè)版本為2.8的cmake,這不是我們想要的版本,所以這里使用源碼安裝。

cmake的版本可以使用cmake --version來(lái)檢查。如果要卸載apt-get安裝的cmake,我們可以sudo apt-get remove cmake

cmake.org/download/提供了源碼文件,也提供了一個(gè)安裝腳本(cmake-3.7.2-Linux-x86_64.sh)。這里我直接使用這個(gè)腳本了。運(yùn)行前,還是需要改一下權(quán)限 chmod +x /path/to/cmake-3.7.2-Linux-x86_64.sh。然后運(yùn)行即可。進(jìn)入了more以后直接按q可以結(jié)束閱讀用戶協(xié)議。

最后一步就是將生成的cmake的binary文件引入系統(tǒng)path里了。比如你的cmake-3.7.2-Linux-x86_64文件夾位于/path/to/cmake-3.7.2-Linux-x86_64,直接做一個(gè)link就可以了:sudo ln -s /path/to/cmake-3.7.2-Linux-x86_64/bin/* /usr/local/bin。 (這里你可能也要檢查一下/usr/localbin在不在系統(tǒng)的$PATH環(huán)境變量里)

安裝Ninja

Ninja是一個(gè)build工具,跟unix的make是統(tǒng)一范疇。參照Ninja的文檔,在Debian/Ubuntu里執(zhí)行

apt-get install ninja-build

就可以了。使用Ninja與否是Optional的,不過(guò)我個(gè)人覺(jué)得在安裝LLVM時(shí),Ninja的確是比Make要快一點(diǎn)的。

安裝libffi和Python2.7.13

libffi和Python2.7.13在安裝LLVM時(shí)也是可選的。libffi是什么呢?參看一下它的介紹:

The libffi library provides a portable, high level programming interface to various calling conventions. This allows a programmer to call any function specified by a call interface description at run time.

安裝了libffi,則可以在使用cmake時(shí)開(kāi)啟DLLVM_ENABLE_FFI選項(xiàng)了,也就是-DLLVM_ENABLE_FFI=ON

ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz下載libffi的源碼,然后執(zhí)行

sed -e '/^includesdir/ s/$(libdir).*$/$(includedir)/' \
    -i include/Makefile.in &&

sed -e '/^includedir/ s/=.*$/=@includedir@/' \
    -e 's/^Cflags: -I${includedir}/Cflags:/' \
    -i libffi.pc.in        &&

./configure --prefix=/usr --disable-static &&
make

最后sudo su以后make install安裝好就可以了。

至于Python2.7.13, 安裝便十分直白,先下載源碼

wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz

然后解壓,編譯和安裝即可

tar xzf Python-2.7.13.tgz
cd Python-2.7.13
sudo ./configure
sudo make install

安裝Clang和LLVM (源碼編譯)

LLVM和Clang等的源碼可以從releases.llvm.org獲得。如果要獲得最新的代碼,則需要使用svn來(lái)下載。

如果使用svn,則參照LLVM官網(wǎng)操作即可,假設(shè)你打算安裝LLVM在/path/to/llvm-src

LLVM:

cd /path/to/llvm-src
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

Clang:

cd /path/to/llvm-src
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

LLD linker [可選]:

cd /path/to/llvm-src
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/lld/trunk lld

Compiler-RT (required to build the sanitizers) [可選]:

cd /path/to/llvm-src
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

如果我們下載源碼(例如最新版已經(jīng)是4.0.0,而我們?nèi)韵氚惭b3.9.1),則可以直接下載:

假設(shè)llvm解壓出的文件夾叫做llvm-3.9.1.src,則:

cd /path/to/llvm-3.9.1.src    

tar -xf ../cfe-3.9.1.src.tar.xz -C tools &&
tar -xf ../compiler-rt-3.9.1.src.tar.xz -C projects &&

mv tools/cfe-3.9.1.src tools/clang &&
mv projects/compiler-rt-3.9.1.src projects/compiler-rt

LLVM3.7.0以后就不再允許源碼內(nèi)編譯了(build inside source-tree),所以我們需要在llvm-3.9.1.src外面另外建一個(gè)文件夾,比如叫做llvm-build

mkdir llvm-build
cd llvm-build

接下來(lái)則要使用cmake來(lái)進(jìn)行編譯,如果安裝了Ninja,llvm源碼文件夾是llvm-3.9.1.src。一個(gè)實(shí)例是:

cmake -G Ninja  \
  -DCMAKE_INSTALL_PREFIX=/usr  \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_FFI=ON \
  -DLLVM_BUILD_LLVM_DYLIB=ON \
  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
  -DLLVM_TARGETS_TO_BUILD="host" 
  -Wno-dev
  ../llvm-3.9.1.src

這里要注意一下一些主要的參數(shù),-G是選擇generator,如果安裝了Ninja則會(huì)生成Ninja的build文件。-DCMAKE_INSTALL_PREFIX是表明了最后要安裝到了目錄,-DCMAKE_BUILD_TYPE則是表明build類型,如果選擇Debug則會(huì)安裝很多不需要的文件,-DLLVM_ENABLE_FFI則是開(kāi)啟FFI,-DLLVM_TARGETS_TO_BUILD是指明build的target,如果只選host,則只build針對(duì)當(dāng)前平臺(tái)的內(nèi)容,免去了不少多余文件。最后一行的../llvm-3.9.1.src則是告訴cmake源碼文件的位置。

在這之后,直接進(jìn)行ninja的操作即可。Ninja的使用方式類似于make,比如開(kāi)4核使用ninja -j4,清除build的文件則ninja clean

如果不使用Ninja,還是使用make來(lái)build,則cmake選擇cmake -G "Unix Makefiles"即可。

在虛擬機(jī)中編譯LLVM 3.9.1,需要開(kāi)足夠的內(nèi)存(比如我個(gè)人建議6個(gè)G)和足夠的硬盤(用動(dòng)態(tài)分配吧)。如果用了ninja -j2以上,有可能會(huì)在編譯一些文件時(shí)崩掉,這時(shí)候只是使用ninja即可。(make也是一樣)

最后運(yùn)行ninja install或者make install即完成安裝。之后可以用clang --versionllc --version檢查安裝成功的版本。llc是LLVM static compiler,當(dāng)然我們也可以通過(guò)其它的LLVM組件來(lái)檢查,比如用dissembler: llvm-dis --version

安裝plugin

這里我以LLVM Gold Plugin為例。因?yàn)槲疫@次安裝LLVM的最終目的,是需要運(yùn)行和編輯這個(gè)instrumentation工具Contech,它是需要Gold Plugin的。

它的安裝本身,只需要執(zhí)行以下操作即可:

git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils
mkdir build # 源碼樹(shù)外build
cd build
../binutils/configure --enable-gold --enable-plugins --disable-werror
make all-gold

接下來(lái)build LLVM,我使用的cmake指令:

CC=gcc CXX=g++                              \
cmake -G Ninja \
      -DCMAKE_INSTALL_PREFIX=/usr           \
      -DLLVM_ENABLE_FFI=ON                  \
      -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_CXX1Y=ON          \
      -DLLVM_BUILD_LLVM_DYLIB=ON            \
      -DLLVM_TARGETS_TO_BUILD="host" \
      -DLLVM_BINUTILS_INCDIR=/path/to/gold/binutils/include \
      -Wno-dev --enable-optimized --enable-targets=host-only \
      ../llvm-3.9.1.src

這里要注意的是-DLLVM_BINUTILS_INCDIR=/path/to/gold/binutils/include,這里是指明了binutils (gold plugin)提供的include文件的位置。

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

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