使用源码编译

前言

我们已经针对多种不同的环境做过编译测试,包括 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 内核: 2.6.32 或更高版本,通过命令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 服务文档

由于 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 可以加快编译过程,主要用于开发过程。如果系统中安装了 ccacheNebula Graph 默认会自动启用该选项。

但是,如果你想禁用 ccache,将该选项设置成 OFF 可能 是不够的。因为,在某些系统中,ccache 会_代理_ 当前编译器。此时,需要通过设置环境变量 export CCACHE_DISABLE=true,或者在 ~/.ccache/ccache.conf 文件中添加 disable=true。后续 Nebula Graph 将隐藏这些细节。

另外,关于 ccache 的更多细节,请参考官方文档

NEBULA_USE_LINKER

该选项允许我们使用不同的链接器。目前可用的选项是:bfdgoldlld。其中,bfdgold 隶属于 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 的优先级如下:

  1. CMake 变量 NEBULA_THIRDPARTY_ROOT
  2. build 路径下的 third-party/install
  3. NEBULA_THIRDPARTY_ROOT 环境变量
  4. /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 命令将其禁用。

无网络编译

如果在编译源码时无法连接网络,则必须手动下载以上工具和依赖,包括 Nebula Graph 仓库中的 GCC 编译器,第三方库和 CMake。然后,将所有内容复制到你的机器上。以下是快速指南。详细信息请参考上述步骤。

首先,需要有一台可以连接外网的主机,并下载以下文件:

# 下载 GCC
# RedHat 或 CentOS 用户
$ wget https://oss-cdn.nebula-graph.com.cn/toolset/vesoft-gcc-7.5.0-CentOS-x86_64-glibc-2.12.sh
# Debian 或 Ubuntu 用户
$ wget https://oss-cdn.nebula-graph.com.cn/toolset/vesoft-gcc-7.5.0-Debian-x86_64-glibc-2.13.sh

# 下载 CMake
$ wget https://cmake.org/files/v3.15/cmake-3.15.5-Linux-x86_64.sh

# 下载第三方库
$ wget https://oss-cdn.nebula-graph.com.cn/third-party/vesoft-third-party-x86_64-libc-2.12-gcc-7.5.0-abi-11.sh

然后,将这些软件包复制到编译的机器并运行。

# 安装 GCC
# RedHat 或 CentOS 用户
$ sudo bash vesoft-gcc-7.5.0-CentOS-x86_64-glibc-2.12.sh
# Debian 或 Ubuntu 用户
$ sudo bash vesoft-gcc-7.5.0-Debian-x86_64-glibc-2.13.sh

# 启用 GCC 安装
$ source /opt/vesoft/toolset/gcc/7.5.0/enable

# 安装 CMake
$ sudo bash cmake-3.15.5-Linux-x86_64.sh --skip-license --prefix=/opt/vesoft/toolset/cmake

# 将安装好的cmake的bin目录加到PATH里面

$ export PATH=/opt/vesoft/toolset/cmake:$PATH

# 安装第三方库
$ sudo bash vesoft-third-party-x86_64-libc-2.12-gcc-7.5.0-abi-11.sh

现在您就可以下载并编译 Nebula Graph 项目了。

卸载

卸载前,请先停止服务。在 make 目录下使用 make uninstall 命令即可卸载 Nebula Graph。请注意卸载之后配置文件不会删除。

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)尚未修复。