使用源码编译
前言
我们已经针对多种不同的环境做过编译测试,包括 CentOS 6/7/8、Ubuntu 16.04/18.04/19.04、Fedora 28/29/30、GCC 7/8/9 以及较新版本的 LLVM/Clang。然而,由于编译环境及依赖的复杂性,很难保证覆盖到所有场景。如果在编译过程遇到任何问题,欢迎通过 Issue 或者 Pull Request 联系我们。
系统要求
以下为编译Nebula Graph机器所需配置要求,运行环境所需配置要求见这里。
- 处理器: x86_64
- 内存: 至少 4GB
- 存储空间: 至少 10GB
- Linux 内核: 3.9 或更高版本,通过命令
uname -r
查看 - glibc: 2.12 或更高版本,通过命令
ldd --version
查看 - GCC: 7.1.0 或更高版本,通过命令
g++ --version
查看 - CMake: 3.5.0 或更高版本,通过命令
cmake --version
查看 - 能够访问互联网
注意: Nebula Graph 目前仅支持 x86_64 架构。
快速编译步骤
安装系统依赖
请注意,安装系统依赖需要 root 权限。
CentOS,RedHat 和 Fedora 用户可以运行以下命令安装:
$ yum update
$ yum install -y make \
m4 \
git \
wget \
unzip \
xz \
readline-devel \
ncurses-devel \
zlib-devel \
gcc \
gcc-c++ \
cmake \
gettext \
curl \
redhat-lsb-core
# CentOS 8+,RedHat 8+ 以及 Fedora 用户,需要额外安装 libstdc++-static 和 libasan
$ yum install -y libstdc++-static libasan
Debian 及 Ubuntu 用户,执行以下命令安装:
$ apt-get update
$ apt-get install -y make \
m4 \
git \
wget \
unzip \
xz-utils \
curl \
lsb-core \
build-essential \
libreadline-dev \
ncurses-dev \
cmake \
gettext
ArchLinux、Gentoo 或者 LFS 用户请自行安装。
在开始编译之前,请确保编译器和 CMake 版本满足要求:
$ g++ --version
$ cmake --version
否则,请分别参考 安装 GCC 或 安装 CMake 进行操作。
克隆源码
$ git clone https://github.com/vesoft-inc/nebula.git
如果不关心代码仓库的历史提交信息,您可进行_浅克隆_(Shallow clone)以加快下载速度:
$ git clone --depth=1 https://github.com/vesoft-inc/nebula.git
执行编译
$ cd nebula
$ mkdir build
$ cd build
$ cmake -DENABLE_TESTING=OFF -DCMAKE_BUILD_TYPE=Release ..
# 假设 cores 为核数,mem_gb 为内存大小(单位为 GB),N 取值建议为 cores 和 mem_gb/2 中的较小值
# Build type 建议选择 release 以加快编译速度
$ make -jN
# 默认安装目录为 /usr/local/nebula
$ sudo make install
# 如需启动服务,请复制 etc/ 目录下的配置文件
# 用于生产环境
$ cd /usr/local/nebula
$ cp etc/nebula-storaged.conf.production etc/nebula-storaged.conf
$ cp etc/nebula-metad.conf.production etc/nebula-metad.conf
$ cp etc/nebula-metad.conf.production etc/nebula-metad.conf
# 用于试用
$ cd /usr/local/nebula
$ sudo cp etc/nebula-storaged.conf.default etc/nebula-storaged.conf
$ sudo cp etc/nebula-metad.conf.default etc/nebula-metad.conf
$ sudo cp etc/nebula-metad.conf.default etc/nebula-metad.conf
由于 Nebula Graph 使用了大量的 C++ 模板,尤其是 Folly,fbthrift 和 boost,因此编译会非常耗时。比如,如果使用 Intel E5-2697 v3 处理器,在 16 个任务并发运行的情况下,需要花费大约 4 分钟完成编译,总的 CPU 时间大约 35 分钟。
源码打包(可选)
- 如需将 Nebula Graph 打包至一个包,请使用以下命令:
cd nebula/package
./package.sh -v <version>
- 如需将 Nebula Graph 打包至多个包,请使用以下命令:
cd nebula/package
./package.sh -v <version> -n OFF
编译选项
除默认选项外,Nebula Graph 的编译系统还提供诸多选项来调整编译行为。
CMake 参数
可通过 cmake -DArgument=Value ..
调整 CMake 参数。
ENABLE_WERROR
默认情况下,Nebula Graph 使用 -Werror
选项将编译过程中的告警当成错误。如果在编译过程中遇到了类似情况,可以通过将 ENABLE_WERROR
设置为 OFF
来暂时忽略此类错误。
ENABLE_TESTING
该选项允许用户开启或关闭单元测试的编译,默认开启。如果您只需要编译 Nebula Graph 服务模块,可以将该选项设置为 OFF
。
ENABLE_ASAN
该选项允许用户开启或关闭 AddressSanitizer(内存相关错误检测器),默认关闭。
CMAKE_BUILD_TYPE
Nebula Graph 支持以下几种编译类型:
Debug
,启用调试信息,不启用优化选项,为默认编译类型Release
,启用优化选项,不启用调试信息RelWithDebInfo
,启用优化选项,且启用调试信息MinSizeRel
,启用利于减小代码体积的优化选项,不启用调试信息
CMAKE_INSTALL_PREFIX
该选项用于指定执行 make install
命令时,Nebula Graph 的服务模块、配置文件以及工具集的安装路径,默认为 /usr/local/nebula
。
CMAKE_CXX_COMPILER
通常情况下,CMake 会自动选择合适的编译器。但是,如果目标编译器不在默认的标准路径下,或者你想使用其他种类或路径下的编译器,请使用如下方式指定:
$ cmake -DCMAKE_C_COMPILER=/path/to/gcc/bin/gcc -DCMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ ..
$ cmake -DCMAKE_C_COMPILER=/path/to/clang/bin/clang -DCMAKE_CXX_COMPILER=/path/to/clang/bin/clang++ ..
ENABLE_CCACHE
ccache
可以加快编译过程,主要用于开发过程。如果系统中安装了 ccache
,Nebula Graph 默认会自动启用该选项。
但是,如果你想禁用 ccache
,将该选项设置成 OFF
可能 是不够的。因为,在某些系统中,ccache
会_代理_ 当前编译器。此时,需要通过设置环境变量 export CCACHE_DISABLE=true
,或者在 ~/.ccache/ccache.conf
文件中添加 disable=true
。后续 Nebula Graph 将隐藏这些细节。
另外,关于 ccache
的更多细节,请参考官方文档。
NEBULA_USE_LINKER
该选项允许我们使用不同的链接器。目前可用的选项是:bfd
,gold
,lld
。其中,bfd
和 gold
隶属于 GNU binutils,lld
则需要安装 LLVM/Clang。此外,如果需要,还可以使用该参数指定链接器的绝对路径。
NEBULA_THIRDPARTY_ROOT
该选项用于显式指定 third party 所在路径。
手动安装 Third Party
在 configure/cmake 阶段,Nebula Graph 默认将预先编译好的 third party 下载到当前 build 目录。但是如果你想将其安装到其他路径(比如,安装到某个公共目录),你可以:
# 安装 third party 至 /opt 需要 root 权限,可使用 --prefix 改变安装路径
$ ../third-party/install-third-party.sh --prefix=/opt/vesoft/third-party
如果不指定 --prefix
,third party 的默认安装路径为 /opt/vesoft/third-party
,且可为 Nebula Graph 的编译系统自动找到。否则,需使用上文所述的 NEBULA_THIRDPARTY_ROOT
CMake 参数指定路径,或为该路径设置环境变量并导出。 Nebula Graph 查找并选择 third party 的优先级如下:
- CMake 变量
NEBULA_THIRDPARTY_ROOT
- build 路径下的
third-party/install
NEBULA_THIRDPARTY_ROOT
环境变量/opt/vesoft/third-party
安装可用的 CMake
对于没有可用 CMake 安装的用户, 我们提供了可自动下载安装的脚本。在 build 目录下,运行:
$ ../third-party/install-cmake.sh cmake-install
CMake has been installed to prefix=cmake-install
Run 'source cmake-install/bin/enable-cmake.sh' to make it ready to use.
Run 'source cmake-install/bin/disable-cmake.sh' to disable it.
$ source cmake-install/bin/enable-cmake.sh
$ cmake --version
cmake version 3.15.5
此时可用的 CMake 已安装完成。你可以在任何时候使用 source cmake-install/bin/disable-cmake.sh
命令将其禁用。
安装可用的 GCC
对于没有可用 GCC 安装的用户, 我们提供了 GCC 和可自动下载安装的脚本。在 build 目录下,运行:
# 将 GCC 安装至 /opt 需要 root 权限,支持更改安装路径
$ ../third-party/install-gcc.sh --prefix=/opt
GCC-7.5.0 has been installed to /opt/vesoft/toolset/gcc/7.5.0
Performing usability tests
Performing regular C++14 tests...OK
Performing LeakSanitizer tests...OK
Run 'source /opt/vesoft/toolset/gcc/7.5.0/enable' to start using.
Run 'source /opt/vesoft/toolset/gcc/7.5.0/disable' to stop using.
# 注意路径和指定版本可能与你的环境不同
$ source /opt/vesoft/toolset/gcc/7.5.0/enable
# 此处仅设置了 PATH,以免污染库路径
# 如果需要可运行 'export LD_LIBRARY_PATH=/opt/vesoft/toolset/gcc/7.5.0/lib64:$LD_LIBRARY_PATH'
$ g++ --version
g++ (Nebula Graph Build) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
此时可用的 GCC 编译器已安装完成。你可以在任何时候使用 source /opt/vesoft/toolset/gcc/7.5.0/disable
命令将其禁用。
FAQ
error: invalid argument type ‘auto’ to unary expression
当使用 Clang 9.0 编译 Nebula Graph 时,会发生该错误:
[ 5%] Building CXX object src/common/fs/CMakeFiles/fs_obj.dir/FileUtils.cpp.o
In file included from src/common/fs/FileUtils.cpp:8:
In file included from src/common/fs/FileUtils.h:12:
src/common/base/StatusOr.h:57:19: error: invalid argument type 'auto' to unary expression
static_assert(!is_status_v<T>, "`T' must not be of type `Status'");
^~~~~~~~~~~~~~~
src/common/fs/FileUtils.cpp:90:34: note: in instantiation of template class 'nebula::StatusOr<std::__cxx11::basic_string<char> >' requested here
StatusOr<std::string> FileUtils::readLink(const char *path) {
...
这是 Clang 9.0 引入的一个已知的 Bug,Clang 10.0(2020-05-25)尚未修复。