目錄
- 安裝/升級(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),則可以直接下載:
- http://llvm.org/releases/3.9.1/llvm-3.9.1.src.tar.xz LLVM
- http://llvm.org/releases/3.9.1/cfe-3.9.1.src.tar.xz Clang
- http://llvm.org/releases/3.9.1/compiler-rt-3.9.1.src.tar.xz Compiler RT
假設(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 --version
和llc --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文件的位置。