前言
应同事请求协助帮忙编译 ClickHouse,虽然个人对 ClickHouse 及 C++ 语言不熟悉,但编译其实万变不离其宗,把控好网络、组件版本、环境变量,再严格遵循官网编译步骤,其实可以解决绝大部分的软件编译问题。
PS:Docker 可以很好的解决编译环境的问题,这或许也是近年来越来越多项目提供 docker 编译方式的原因吧。
1. 版本
1.1 ClickHouse
拉取 ClickHouse 镜像,这里使用码云上的镜像进行加速:git clone https://gitee.com/mirrors/clickhouse.git
,并切换为 20.6.6.7 分支。
1.2 安装 ninja
这里安装 ninja 1.9,参考ninja 官网:http://blog.fpliu.com/it/software/ninja 。 ClickHouse 20.6.6.7 要求至少 1.8,这里直接按照 ninja 官网首页来:
curl -LO https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip
unzip ninja-linux.zip -d ~/bin
export PATH=$PATH:~/bin
# 此处建立软连接,否则编译时会提示找不到 ninja
ln -s ~/bin/ninja /usr/bin/ninja-build
1.3 安装 gcc
根据官网教程,ck 20.6.6.7 版本应使用 gcc-9,这里使用 devtoolset 来进行 gcc 版本的切换。
如果 gcc 版本不为 9,且安装了其他版本的 devtoolset,记得先卸载掉 devtoolset。
安装 devtoolset-9,并切换为 gcc-9,参照 https://www.cnblogs.com/52fhy/p/12547521.html :
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
1.4 安装 cmake
cmake 版本至少 3 以上:
$ cmake --version
cmake version 3.14.5
2. 编译
2.1 x86 平台
重点:在前面规整了各编译组件的版本后,本质上还出现编译错误的原因都是 ClickHouse 的依赖包下载不全或者下载错误,这里通过修改 ClickHouse 依赖的子模块为码云 gitee 仓库解决。
- 码云为编译 ClickHouse 所建的镜像仓库(优先使用):https://gitee.com/organizations/ClickHouse-Build/projects
- 码云为绝大部分 github 项目建立的镜像仓库:https://gitee.com/organizations/mirrors/projects
- 码云为 apache 项目建立的镜像仓库:https://gitee.com/organizations/mirrors_apache/projects
上述几个仓库,都是码云官方拉取了 github 上的仓库,为国内提供加速的。
知道这上面三个仓库后,我们需要做的就是将 ClickHouse 依赖的子项目配置及其子项目依赖的子项目(部分子项目也有自身依赖的子项目)替换为码云上的仓库:sed -i -r "s/github.com\/.+\//gitee.com\/ClickHouse-Build\//g" .gitmodules
。
NOTE:上述命令只是举个例子,实际上需要根据具体场景,将各个 git 项目下的 github 路径替换为 gitee 路径。之所以列出三个镜像仓库,是因为部分子项目在 ClickHouse-Build 中也没有,此时需要到剩余两个仓库中寻找并手动替换。当然更好的方法是能够搭建一个 vpn,这样就无需自己手动替换了。
NOTE:子项目的含义请自行了解 git 的 submodule 概念。
替换完成后,在 ClickHouse 顶级目录执行 git submodule sync --recursive
同步修改的子项目配置,之后再执行 git submodule update --init --recursive
拉取子项目,根据报错提示,逐个修改子模块的仓库路径。
需要注意的是,有部分子项目的项目命名在 gitee 跟 github 上有一点区别,这里逐个列出:
# vim $ClickHouse_HOME/.gitmodules
[submodule "contrib/aws"]
path = contrib/aws
url = https://github.com/ClickHouse-Extras/aws-sdk-cpp.git
# 替换为
[submodule "contrib/aws"]
path = contrib/aws
url = https://gitee.com/ClickHouse-Build/aws.git
最后在 ClickHouse 顶级目录执行下列命令进行编译:
# 参考:https://clickhouse.tech/docs/v20.3/en/development/build/
$ export CC=gcc-9
$ export CXX=g++-9
$ cd ClickHouse
$ mkdir build
$ cd build
# 执行 cmake 的时候,一定要仔细观察输出信息,详见下述文字详细说明
$ cmake ..
$ ninja clickhouse
$ cd ..
执行 cmake 的时候,一定要仔细观察输出信息,若出现下述信息:
......
-- The following OPTIONAL packages have not been found:
* Arrow
* Parquet
......
那么需要仔细检查 $ClickHouse_HOME/contrib
下对应的模块是否存在,以及 .gitmodules 对应模块的配置是否正确,否则会导致编译失败。
如果发现模块拉取失败,则可以删除 $ClickHouse_HOME/contrib/模块
的文件夹,然后重新执行 git submodule sync --recursive
以及 git submodule update --init --recursive
重新拉取模块。
最后会生成 $ClickHouse_HOME/build/programs/clickhouse
可执行文件,用于启动 client、server 等。
2.2 鲲鹏服务器 + ARM 平台
对于 鲲鹏服务器 + ARM 平台,通过华为的技术人员得知,在编译时需要执行一些额外步骤:
- 修改contrib/CMakeLists.txt,WITH 1修改为WITH 0:
sed -i 's!WITH_ACLE 1!WITH_ACLE 0!g' contrib/CMakeLists.txt
- 关闭 WERROE:
sed -i 's!WERROR "Enable -Werror compiler option" ON!WERROR "Enable -Werror compiler option" OFF!g' CMakeLists.txt
- 对于 GCC 9.1 以上,可以添加 ARM 独有优化,
vim cmake/cpu_features.cmake
添加如下内容:if (ARCH_AARCH64) set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=armv8.2-a+fp+simd+crc+lse -mtune=tsv110 -fPIC ") endif()
- 执行 cmake 时需要关闭 unwind(ARM 不支持,且仅在异常测试的时候使用):
cmake3 .. -DENABLE_TCMALLOC=OFF -DUSE_UNWIND=OFF -DENABLE_JEMALLOC=OFF -DCMAKE_INSTALL_PREFIX