怎么用源码编译apk-TiDB 源码编译 TiFlash 文章

前言

自今年 3 月 1 日 TiFlash 开源以来,已经过去了近一年半的时间。 在此期间,TiFlash从v6.0.0-DMR升级到了v7.3.0-DMR,并增加了一些新功能,例如支持MPP以实现窗口函数框架。 增加了对多个算子和函数下推的支持、对AWSS3计算和存储分离的支持等。我们先回顾一下TiFlash资源的亮点。 【爆料】TiFlash终于开源了! ,以及 TiFlash 时间线。

前两篇文章《TiDB 源码编译 - PD/TiDBDashboard》和《TiDB 源码编译 - TiUP》分别讨论了如何编译 TiUP、PD 和 TiDBDashboard。 本文将介绍如何编译TiFlash,但本文使用的技术栈与前两篇文章有所不同。 建议精通Linux知识并有一定编译经验的男士继续浏览下面。

环境依赖性

如果你想成为 TiFlashCommitter,首先你必须能够编译 TiFlash 源代码并能够在本地调试。 我们先看看在本地环境下编译源码需要哪些依赖。

0️⃣编译环境

撰写本文时使用的环境是CentOS7.9.2009,8c16g。 这个硬件配置勉强够用。 期间遇到了资源过载导致卡顿的情况。 如果可能的话,建议使用更好的配置。 操作系统方面,CentOS7.9.2009的EOL时间为2024年6月30日,其上游RHEL7.9的生命周期支持已延长至2028年6月30日。 因此,CentOS7.9.2009仍然是当今以及未来几年的主流企业级操作系统。

1️⃣基本工具包

安装源码编译的基本工具包。 其中devtoolset-10用于临时调用gcc10编译LLVM/Clang,ninja-build用于构建源代码项目。

yum install devtoolset-10 ninja-build

查看忍者版本:

$ ninja --version 1.10.2

2️⃣安装rust环境

curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal --default-toolchain nightly; source $HOME/.cargo/env

安装成功。

nightly-x86_64-unknown-linux-gnu installed - rustc 1.73.0-nightly (28eb857b9 2023-08-12) Rust is installed now. Great! $ rustc --version rustc 1.73.0-nightly (28eb857b9 2023-08-12)

3️⃣安装OpenSSL

TiFlash中,OpenSSL版本采用1.1.1系列,大版本尚未升级到OpenSSL3.x。

该软件包与安全性密切相关,因此小版本会不断升级。 目前,TiDB 全栈应该升级到 1.1.1t 版本。

安装步骤如下:

wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1t.tar.gz tar zxf OpenSSL_1_1_1t.tar.gz cd openssl-OpenSSL_1_1_1t ./config --prefix=/opt/openssl --openssldir=/opt/openssl -fPIC no-shared no-afalgeng -static make sudo make install_sw install_ssldirs

安装完成后查看版本信息。

$ ./openssl version OpenSSL 1.1.1t 7 Feb 2023

4️⃣安装CMake3/ccmake

CentOS7下默认安装CMake2。 TiFlash编译需要CMake3.21.0+版本。 以下步骤是编译安装CMake3.22.1。

wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz tar zxf cmake-3.22.1.tar.gz cd cmake-3.22.1 ./configure gmake sudo make install

安装完成:

$ which cmake /usr/local/bin/cmake $ cmake --version cmake version 3.22.1 CMake suite maintained and supported by Kitware (kitware.com/cmake). $ ccmake --version ccmake version 3.22.1 CMake suite maintained and supported by Kitware (kitware.com/cmake).

5️⃣安装LLVM/Clang

CentOS7下,gcc 4.8版本太旧,需要暂时切换到gcc10。

$ scl enable devtoolset-10 bash $ gcc --version gcc (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11) Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

下载LLVM源代码,编译并安装。

git clone https://github.com/llvm/llvm-project --depth=1 -b llvmorg-13.0.0 cd llvm-project mkdir build cmake -DCMAKE_BUILD_TYPE=Release -GNinja -S llvm -B build -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DLLVM_TARGETS_TO_BUILD=Native ninja sudo ninja install

编译日志输出:

[shawnyan@centos7 build]$ ninja [185/3417] Building CXX object utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o In file included from /home/shawnyan/llvm-project/llvm/utils/TableGen/CodeGenRegisters.h:25, from /home/shawnyan/llvm-project/llvm/utils/TableGen/CodeGenRegisters.cpp:14: /home/shawnyan/llvm-project/llvm/include/llvm/ADT/SparseBitVector.h: In member function 'unsigned int llvm::CodeGenRegister::getWeight(const llvm::CodeGenRegBank&) const': /home/shawnyan/llvm-project/llvm/include/llvm/ADT/SparseBitVector.h:129:15: warning: array subscript 2 is above array bounds of 'const BitWord [2]' {aka 'const long unsigned int [2]'} [-Warray-bounds] 129 | if (Bits[i] != 0) | ~~~~^ ... -- Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available. -- Configuring done -- Generating done CMake Warning: Manually-specified variables were not used by the project: COMPILER_RT_BUILD_BUILTINS LLVM_BUILD_TOOLS LLVM_CONFIG_PATH LLVM_ENABLE_PROJECTS_USED -- Build files have been written to: /home/shawnyan/llvm-project/build/runtimes/runtimes-bins [3414/3417] Performing build step for 'runtimes' [516/516] Linking CXX static library /home/shawnyan/llvm-project/build/lib/x86_64-unknown-linux-gnu/libc++abi.a [3415/3417] No install step for 'runtimes' [3417/3417] Completed 'runtimes'

在此期间,我遇到了以下错误信息。 不知道官方的编译环境是否也存在类似的情况。 我找到了解决方法并减少了参数 -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON 来解决问题。

CMake Error at runtimes/runtimes-bins/libcxx/src/cmake_install.cmake:88 (file): file RPATH_CHANGE could not write new RPATH: to the file: /usr/local/lib/x86_64-unknown-linux-gnu/libc++.so Call Stack (most recent call first): runtimes/runtimes-bins/libcxx/cmake_install.cmake:56 (include) runtimes/runtimes-bins/cmake_install.cmake:47 (include)

需要注意的是怎么用源码编译apk,在新版本的 TiFlash 中,已经使用 LLVM/Clang 代替 gcc 作为默认编译器,以提高编译效率,并且 README 中与 gcc 相关的内容也被删除。

至此,所有依赖环境规划完成。 我们开始正餐,编译TiFlash项目。

目标仓库

TiFlash的主要编程语言是C++。 花了好几天的时间才完成环境的编译。 不像golang环境那么简洁清新。 而且,在传统思维中,C/Cpp才是系统工程的正统编程语言。 学习成本更高,花费更多。 一点时间也很正常。

TiFlash的目标仓库只有pingcap/tiflash一个,但是引入了几个模块。 所有源代码加起来超过3G。 我第一次clone源码的时候怎么用源码编译apk,直接填了根目录,所以下载源码的时候,只需要下载一层即可。 深度(--深度=1)就足够了,不需要下载所有源代码库中所有版本的代码。 似乎有一个陪同他登顶的人曾经说过:“TiFlashdocker编译可以下载到宇宙的尽头”。

克隆代码

克隆TiFlash源码,下载并更新TiFlash所依赖的子模块。

git clone https://github.com/shawn0915/tiflash.git --depth=1 cd tiflash/ # 更新子模块 git submodule update --init --recursive --depth=1

今年有一个帖子提到了TiFlash源码仓库的问题。 Tiflash在编译时依赖于第三方软件。 当时TiFlash所依赖的一组子模块都同步到了Gitee上。 这次写文的时候同步的时候,发现TiFlash速度慢了一点。 三方依赖。

怎么用源码编译apk-TiDB 源码编译 TiFlash 文章

例如,引入magic_enum来优化枚举类型通配符字符串。

再比如,为了支持国密SM4算法,引入了GmSSL。

另一个例子是推出一系列AWS SDK仓库来支持TiFlash在AWS上的无数可能性。

编译代码

得益于TiFlash在开发Siege Lion方面取得的优异成绩,TiFlash项目本身的编译命令简单明了,只需要两步。 TiFlash最终编译耗时半小时,期间编译日志略。 需要指出的是,编译 TiFlash 的过程中会获取/更新其他源代码库,所以你可以使用梯子,也可以直接申请海外云端的服务器来进行编译工作。

cmake .. -GNinja -DCMAKE_BUILD_TYPE=RELEASE ninja tiflash -j 6

编译成功,重要结果文件如下。

root@centos7:/data/tiflash/build$ ll -h /usr/local/lib/x86_64-unknown-linux-gnu/ total 3.9M -rw-r--r-- 1 root root 1.9M Aug 15 10:47 libc++.a -rw-r--r-- 1 root root 28 Aug 15 10:47 libc++.so lrwxrwxrwx 1 root root 13 Aug 14 14:06 libc++.so.1 -> libc++.so.1.0 -rwxr-xr-x 1 root root 1016K Aug 15 10:47 libc++.so.1.0 -rw-r--r-- 1 root root 668K Aug 15 10:47 libc++abi.a lrwxrwxrwx 1 root root 14 Aug 15 10:03 libc++abi.so -> libc++abi.so.1 lrwxrwxrwx 1 root root 16 Aug 15 10:03 libc++abi.so.1 -> libc++abi.so.1.0 -rwxr-xr-x 1 root root 358K Aug 15 10:47 libc++abi.so.1.0 -rw-r--r-- 1 root root 13K Aug 15 10:47 libc++experimental.a root@centos7:/data/tiflash/build$ ll -h ./contrib/GmSSL/lib/libgmssl* lrwxrwxrwx 1 root root 13 Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so -> libgmssl.so.3 lrwxrwxrwx 1 root root 15 Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so.3 -> libgmssl.so.3.0 -rwxr-xr-x 1 root root 822K Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so.3.0 root@centos7:/data/tiflash/build$ ll -h ./contrib/tiflash-proxy-cmake/release/lib*.so -rwxr-xr-x 2 root root 87M Aug 15 13:34 ./contrib/tiflash-proxy-cmake/release/libraftstore_proxy.so -rwxr-xr-x 1 root root 87M Aug 15 13:34 ./contrib/tiflash-proxy-cmake/release/libtiflash_proxy.so root@centos7:/data/tiflash/build$ ll -h ./dbms/src/Server/tiflash -rwxr-xr-x 1 root root 212M Aug 15 13:35 ./dbms/src/Server/tiflash

老规则是尽量自定义版本号。 编译完成后,查看tiflash可执行二进制补码文件的版本信息。

遗留问题1.CMake版本选择

README/CMakeLists.txt提示cmake的最低版本是3.21,但是bake_llvm_base_amd64/aarch64.sh文件使用的版本是3.22.1。 是否要考虑升级CMake版本?

cmake_minimum_required (VERSION 3.21) # CMake source $SCRIPTPATH/install_cmake.sh install_cmake "3.22.1" "x86_64"

2、编译脚本冗余

release-centos7-llvm/env 路径中的文件有点旧,似乎是死代码。 我想知道他们是否还有必要保留。

另外,如post tiflash源码cmake依赖中所述,可能会找不到cmake命令,需要修正。 不过,如果删除env文件夹,这个问题就会得到解决。

3.子模块代码仓库链接

有一个微妙的点。 在该文件中,aws-sdk-cpp 使用个人代码存储库 ()。 应该是大开发商的个人账户吗? 既不是公司仓库,也不是AWS原厂仓库()。 不知道是不是骗局。

4.误用“”(已修复)

文件第 30 行前面多了一个反斜杠,因此引发 PR:Removeexcessbackslashes#7940。

更新。PR 已合并。

总结

这篇文章有点“头重脚轻”,因为TiFlash的编译环境准备起来非常困难。 需要一个多星期的时间,并且需要非常高的机器性能和网络连接。 实在不建议轻易尝试。

幸运的是,TiFlash 已经开源,并在源代码项目文件中提供了近乎完整的编译步骤。 听说这也是TiFlash产研专家使用的脚本。 谢谢♪(・ω・)ノ。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 怎么用源码编译apk-TiDB 源码编译 TiFlash 文章 https://www.wkzy.net/game/199714.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务