1.背景
公司使用StarRocks作为实时数据库,由于云上环境有部分是ARM,而官方暂未提供ARM版的安装包或者docker环境镜像,只好自己手动编译。根据StarRocks官网的release,在2.0版本支持ARM环境,于是开始挠头编译 (ノへ ̄、)
2.主要参考
因为缺少相关资料,去Apache Doris官网找了ARM平台的编译流程作为主要参考,这里emmmm,不多说
|ω・`)
Apache Doris ARM编译
3.环境
3.1.内核版本3.2.StarRocks版本
commit 6ff9eab75bea921809868b1cae8bcb2d2f638bfc
4.编译
4.1.编译工具安装
4.1.1.安装gcc-10.1.0
下载gcc-10.1.0
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz
解压后,下载依赖:
http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2
解压这四个依赖,然后移动到 gcc-10.1.0 源码目录下,并重命名为 gmp、isl、mpc、mpfr。
下载并安装 automake-1.15(因为gcc10编译过程中会查找automake 1.15 版本)
https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
tar xzf automake-1.15.tar.gz
./configure --prefix=/home/starrocks/tools/installed
make && make install
export PATH=/home/doris/tools/installed/bin:$PATH
编译GCC10:
cd gcc-10.1.0
./configure --prefix=/home/starrocks/tools/installed
make -j && make install
4.1.2.安装其他编译组件
- jdk-8u291-linux-aarch64.tar.gz
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
- cmake-3.19.8-Linux-aarch64.tar.gz
https://cmake.org/download/
- apache-maven-3.8.1-bin.tar.gz
https://maven.apache.org/download.cgi
- nodejs 16.3.0
https://nodejs.org/dist/v16.3.0/node-v16.3.0-linux-arm64.tar.xz
注:以上几个组件不需要编译,解压后就可以使用,不过记得配置环境变量!
- libtool-2.4.6.tar.gz
https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz
cd libtool-2.4.6/
./configure --prefix=/home/starrocks/tools/installed
make -j && make install
- binutils-2.36.tar.xz(获取bdf.h)
https://ftp.gnu.org/gnu/binutils/binutils-2.36.tar.bz2
./configure --prefix=/home/starrocks/tools/installed
make -j && make install
注:这里只安装binuntils的话在后面编译be时候有可能出现如下报错:
so,这里需要再安装binutils-devel,按照rpm包即可
- binutils-devel-2.27-44.base.el7.aarch64.rpm
http://mirror.centos.org/altarch/7/os/aarch64/Packages/binutils-devel-2.27-44.base.el7.aarch64.rpm
rpm -ivh binutils-devel-2.27-44.base.el7.aarch64.rpm
- libiberty(编译BE用)
这个库的源码就在 gcc-10.1.0 的源码包下
cd gcc-10.1.0/libiberty/
./configure --prefix=/home/starrocks/tools/installed
make
编译后会产生 libiberty.a,后续移动到StarRocks解压目录的thirdparty的 lib64 目录(没有新建一下)中即可。
4.2.编译StarRocks的第三库
解压源码目录到/home/starrocks/starrocks-src/下
cd /home/starrocks/starrocks-src/thirdparty
- 有网络情况下运行脚本,下载第三库
./download-thirdparty.sh
若没有联网,也可以运行脚本(稍微修改不下载只打印),将需要下载的第三方库地址列出来手动下载,新建thirdparty/src目录放入其中即可。
- 在starrocks源码目录下新增 custom_env.sh 并添加如下内容
export DORIS_THIRDPARTY=/home/starrocks/starrocks-src/thirdparty
export JAVA_HOME=/home/starrocks/tools/jdk1.8.0_291/
export DORIS_GCC_HOME=/home/starrocks/tools/installed/
export PATCH_COMPILER_RT=true
-
修改 build-thirdparty.sh 中的部分内容
在 build_curl 中增加 configure 参数:–without-libpsl。如果不添加,则在最终编译Doris BE的链接阶段,可能报错:undefined reference to ‘psl_is_cookie_domain_acceptable’ -
执行 build-thirdparty.sh。
重点来了,这里最大可能的报错!!!
libcrypto.a(sha1-armv8.0):relocation R_AARCH64_ADR_PREL_PG_HI21 against symbolz_errmsg’ which may bind externally can not be used when making a shared object; recompile with -fPIC
其实这里的报错已经很明显了,但是一开始不太懂,卡在这里很久。openssl的shaxxx-armv8.0这个源码文件有些小问题,需要修改一下。
解决方式:切换到openssl-1.0.2k的源码目录下,修改报错对应的文件:
参考链接:
https://github.com/openssl/openssl/compare/OpenSSL_1_1_1-stable…Romain-Geissler-1A:OpenSSL_1_1_1-stable
这个链接是openssl-1.1.1的解决方式,对于openssl-1.0.2k只需要修改报错的对应文件即可,主要是以下两个文件:
2.1.crypto/sha/asm/sha1-armv8.pl
2.2.crypto/sha/asm/sha512-armv8.pl
.extern OPENSSL_armcap_P .hidden OPENSSL_armcap_P 这两项两个文件里是没有的,也需要添加上!!!然后把要删除的删除即可!修改完源码后报错,重新运行 build-thirdparty.sh
-
编译到某个阶段报错怎么办
不必从头开始编译,将此项报错的编译之前所有注释掉。解决调试这一项报错的第三方库即可。不用耗时编译其它编译OK的第三方库。
4.3.编译StarRocks源码
第三方库全部可以编译通过后,开始编译源码
在StarRocks源码目录执行 sh build.sh 即可!
编译前将build.sh这里的USE_AVX2=ON改为OFF。
编译完成会输出到源码目录的output目录下,打包就可以放到对应ARM环境机器就可以安装了!!!
5.总结
说到底还是自己太菜,编译出问题就要解决好久 ╮(╯_╰)╭
不过废了几天时间总算编译完了,由于官方没有给出ARM环境的编译流程,就把自己的一顿下饭操作整理一下发出来,希望对有需要的人有那么一点帮助!
完结!
<( ̄▽ ̄)/
6.补充
启动be可能报错:libjvm.so: cannot open shared object file: No such file or directory
解决办法:
1.在系统中查找这个文件:
sudo find / -name libjvm.so
找到jdk安装包下面的对应文件目录
2.将.so文件路径的目录添加到/etc/ld.so.conf
vim /etc/ld.so.conf
在文件末尾新添加一行:上面查到的对应文件所在目录,例如:
/usr/local/java/jdk1.8.0_101/jre/lib/amd64/server
3.使得修改生效
sudo /sbin/ldconfig