環(huán)境準(zhǔn)備
需要一臺(tái)arm的機(jī)器甘畅,暫時(shí)采用root方式安裝城榛。
PS:如果其他用戶需要替換bazel依賴包,這里涉及到bazel依賴包軟連接問題歉提。
程序包清單如下(相關(guān)清單可以在百度網(wǎng)盤笛坦,下載鏈接: https://pan.baidu.com/s/1gt3Z6KlxnWoczp_YaRipoA 提取碼: zexq ):
bazel-dist-0.26.1.tar.gz
cmake-3.19.4.tar.gz
gcc-8.2.0.tar.xz
gmp-6.1.0.tar.xz
mpc-1.0.3.tar.gz
mpfr-3.1.4.tar.xz
isl-0.18.tar.xz
re2c-2.0.3.tar.gz
ninja-1.7.2.tar.gz
# bazel的依賴包,基于envoy1.11版本苔巨,其他版本需要自行下載版扩,部分下載包需要翻墻才能夠訪問
external.tar.gz
新建2個(gè)目錄
mkdir -p /root/tools/ # 放入相關(guān)程序包
mkdir -p /root/source/ # 放入envoy源碼,將istio-proxy目錄拷入該目錄
PS:如果代碼或者用戶需要替換的話要修改/tmp/build/目錄里面的md5值侄泽,這個(gè)后面會(huì)提到
bazel 0.26.1版本安裝
源碼安裝礁芦,程序包bazel-dist-0.26.1.tar.gz
cd /root/tools
mkdir bazel-0.26.1
cd bazel-0.26.1
# 將bazel-dist-0.26.1.tar.gz拷入當(dāng)前目錄,然后解壓
tar -zxvf bazel-dist-0.26.1.tar.gz
# 執(zhí)行bazel編譯安裝悼尾,這里需要配置jdk的JAVA_HOME,否則報(bào)錯(cuò)
env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" ./compile.sh
# 安裝成功后將軟連接配置到/usr/bin下
ln -s /root/tools/bazel-0.26.1/output/bazel /usr/bin/bazel
cmake 3.19.4版本安裝
源碼安裝cmake-3.19.4.tar.gz
cd /root/tools
# 將cmake-3.19.4.tar.gz拷入當(dāng)前目錄柿扣,然后解壓
tar -zxvf cmake-3.19.4.tar.gz
cd cmake-3.19.4
# 編譯安裝
./bootstrap
make && make install
## 查看安裝是否成功
cmake --version
gcc 8.2.0安裝
需要的程序包列表:
gcc-8.2.0.tar.xz
gmp-6.1.0.tar.xz
mpc-1.0.3.tar.gz
mpfr-3.1.4.tar.xz
isl-0.18.tar.xz
將以上程序包拷入/root/tools目錄下
cd /root/tools
# 安裝gmp
cd /root/tools/gmp-6.1.0
./configure --prefix=/usr/local/gmp-6.1.0
make && make install
# 安裝mpfr
cd /root/tools/mpfr-3.1.4
./configure --prefix=/usr/local/mpfr-3.1.4 --with-gmp=/usr/local/gmp-6.1.0
make && make install
# 安裝mpc
cd /root/tools/mpc-1.0.3
./configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-6.1.0 --with-mpfr=/usr/local/mpfr-3.1.4
make && make install
# 安裝isl-0.18網(wǎng)上查到的大部分都是--with-gmp但是這個(gè)有問題會(huì)報(bào)錯(cuò)gmp.h頭文件找不到,要改成--with-gmp-prefix
cd /root/tools/isl-0.18
./configure --prefix=/usr/local/isl-0.18 --with-gmp-prefix=/usr/local/gmp-6.1.0
make && make install
vim /etc/ld.so.conf
在include ld.so.conf.d/*.conf 這行下面加入如下配置
/lib
/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/usr/local/gmp-6.1.0/lib
/usr/local/mpc-1.0.3/lib
/usr/local/mpfr-3.1.4/lib
退出
# 刷新緩存
ldconfig -v
# 安裝gcc-8.2.0
cd /usr/local/src/gcc-8.2.0
mkdir build && cd build
../configure --prefix=/usr/local/gcc-8.2.0 --with-gmp=/usr/local/gmp-6.1.0 --with-mpfr=/usr/local/mpfr-3.1.4 --with-mpc=/usr/local/mpc-1.0.3 --enable-checking=release --enable-languages=c,c++ --disable-multilib
# -j 后面的數(shù)字代表cpu的核數(shù)闺魏,4c的話就寫4未状,這樣編譯能快一點(diǎn),一般gcc編譯安裝都要1析桥,2個(gè)小時(shí)
make -j 4 && make install
# 修改環(huán)境變量
vim /etc/profile
# 結(jié)尾加入一行
export PATH=/usr/local/gcc-8.2.0/bin:$PATH
退出
重新打開窗口或者source /etc/profile
gcc -v
顯示gcc 8.2.0說明安裝成功
ninja 1.7.2安裝
程序包:re2c-2.0.3.tar.gz司草、ninja-1.7.2.tar.gz
cd /root/tools
# 將re2c-2.0.3.tar.gz艰垂、ninja-1.7.2.tar.gz拷入當(dāng)前目錄
# 安裝re2c
tar -zxvf re2c-2.0.3.tar.gz
cd /root/tools/re2c-1.0.3/
# 查看當(dāng)前是否有configure,如果沒有執(zhí)行下面的命令埋虹,有可以直接執(zhí)行./configure
autoreconf -i -W all(沒有configure可以先執(zhí)行Autotools)
./configure
make
make install
# 安裝ninja
tar -zxvf ninja-1.7.2.tar.gz
cd /root/tools/ninja
./configure.py --bootstrap
cp ninja /usr/bin/
git2.3安裝
# 需要git2.3以上版本才行猜憎,安裝步驟暫時(shí)略
bazel外網(wǎng)依賴
依賴包:external.tar.gz
88a6967590074595e7f600e3c5004e55這個(gè)是當(dāng)前envoy編譯目錄寫入文件的md5值(如果修改envoy的目錄這個(gè)md5值需要同步修改)解壓到envoy編譯的路徑下/tmp/build/88a6967590074595e7f600e3c5004e55
mkdir -p /tmp/build/88a6967590074595e7f600e3c5004e55
# 解壓bazel依賴包
cd /tmp/build/88a6967590074595e7f600e3c5004e55
tar -zxvf external.tar.gz
# 由于外網(wǎng)編譯后有一個(gè)bazel_tools的軟連接是連接到/tmp/build/install/10aa93b955a2fdcc3953bf717e363ff5這塊,所以需要把之前的/tmp/build/4787974792375e1391d63983118e5df0目錄下的文件都拷貝一份
mkdir -p /tmp/build/install/10aa93b955a2fdcc3953bf717e363ff5
# 把/tmp/build/4787974792375e1391d63983118e5df0目錄下的文件拷到/tmp/build/install/10aa93b955a2fdcc3953bf717e363ff5下
cp /tmp/build/4787974792375e1391d63983118e5df0/* /tmp/build/install/10aa93b955a2fdcc3953bf717e363ff5/
編譯envoy
mkdir -p /root/source
# 將istio-proxy代碼拷入
cd /root/resource/istio-proxy
# git 初始化
git init .
git add .
git config --global user.email "xxx@abcde.com"
git config --global user.name "XX XX"
git commit -m "init commit"
#修改external_envoy目錄下面編譯文件.bazelrc文件搔课,增加四行
build:release -c opt
build:release --strip=always
build:release --copt -DENVOY_IGNORE_GLIBCXX_USE_CXX11_ABI_ERROR=1
build:release --define tcmalloc=disabled
#修改external_envoy/bazel下面編譯BULID文件envoy_build_system.bzl
cd istio-proxy/external_envoy/bazel
調(diào)整def _envoy_copts編譯選項(xiàng)中的-Werror修改為-Wno-error
#修改istio-proxy目錄下的Makefile拉宗,修改BAZEL_BUILD_ARGS編譯選項(xiàng)
cd istio-proxy
調(diào)整BAZEL_BUILD_ARGS編譯選項(xiàng)的值為下所示:
BAZEL_BUILD_ARGS ?= --config=release -c opt --fetch=false --features=pure
調(diào)整編譯使用的編譯器為最新安裝的版本的gcc和g++
CC := /usr/local/gcc-8.2.0/bin/gcc
CXX := /usr/local/gcc-8.2.0/bin/g++
# 編譯
make build_envoy
編譯時(shí)間比較長(zhǎng),觀察編譯結(jié)果
FAQ
1. 當(dāng)出現(xiàn)依賴bazel_tools和envoy包找不到或者不存在時(shí)辣辫,報(bào)錯(cuò)誤如下圖所示時(shí):
- 出現(xiàn)原因:
沒有在tmp/bulid的external目錄下面旦事,創(chuàng)建對(duì)應(yīng)的bazel_tools和envoy的軟連接
- 解決辦法:
創(chuàng)建對(duì)應(yīng)的軟連接:
cd /tmp/build/88a6967590074595e7f600e3c5004e55/external
ln -s /tmp/build/install/3bf05f491d03a17ecdb487f537d4c587/_embedded_binaries/embedded_tools bazel_tools
ln -s /root/source/istio-proxy/external_envoy envoy
1620461518500.png
2. 當(dāng)出現(xiàn)基礎(chǔ)庫文件未定義時(shí),報(bào)錯(cuò)信息如圖所示:
- 出現(xiàn)原因:
gcc安裝不正確急灭,或者與編譯bazel的gcc版本上存在差異姐浮,版本過低或過高
- 解決辦法:
獲取正確的gcc版本,重新安裝葬馋。并將usr/lib/libstdc++.so動(dòng)態(tài)庫文件卖鲤,用新版本的替代。
1620461571879.png