使用源码编译

前言

我们已经针对多种不同的环境做过编译测试,包括 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 用户可以运行以下命令安装:

  1. $ yum update
  2. $ yum install -y make \
  3. m4 \
  4. git \
  5. wget \
  6. unzip \
  7. xz \
  8. readline-devel \
  9. ncurses-devel \
  10. zlib-devel \
  11. gcc \
  12. gcc-c++ \
  13. cmake \
  14. gettext \
  15. curl \
  16. redhat-lsb-core
  17. # CentOS 8+,RedHat 8+ 以及 Fedora 用户,需要额外安装 libstdc++-static 和 libasan
  18. $ yum install -y libstdc++-static libasan

Debian 及 Ubuntu 用户,执行以下命令安装:

  1. $ apt-get update
  2. $ apt-get install -y make \
  3. m4 \
  4. git \
  5. wget \
  6. unzip \
  7. xz-utils \
  8. curl \
  9. lsb-core \
  10. build-essential \
  11. libreadline-dev \
  12. ncurses-dev \
  13. cmake \
  14. gettext

ArchLinux、Gentoo 或者 LFS 用户请自行安装。

在开始编译之前,请确保编译器和 CMake 版本满足要求:

  1. $ g++ --version
  2. $ cmake --version

否则,请分别参考 安装 GCC安装 CMake 进行操作。

克隆源码

  1. $ git clone https://github.com/vesoft-inc/nebula.git

如果不关心代码仓库的历史提交信息,您可进行_浅克隆_(Shallow clone)以加快下载速度:

  1. $ git clone --depth=1 https://github.com/vesoft-inc/nebula.git

执行编译

  1. $ cd nebula
  2. $ mkdir build
  3. $ cd build
  4. $ cmake -DENABLE_TESTING=OFF -DCMAKE_BUILD_TYPE=Release ..
  5. # 假设 cores 为核数,mem_gb 为内存大小(单位为 GB),N 取值建议为 cores 和 mem_gb/2 中的较小值
  6. # Build type 建议选择 release 以加快编译速度
  7. $ make -jN
  8. # 默认安装目录为 /usr/local/nebula
  9. $ sudo make install
  10. # 如需启动服务,请复制 etc/ 目录下的配置文件
  11. # 用于生产环境
  12. $ cd /usr/local/nebula
  13. $ sudo cp etc/nebula-storaged.conf.production etc/nebula-storaged.conf
  14. $ sudo cp etc/nebula-metad.conf.production etc/nebula-metad.conf
  15. $ sudo cp etc/nebula-graphd.conf.production etc/nebula-graphd.conf
  16. # 用于试用
  17. $ cd /usr/local/nebula
  18. $ sudo cp etc/nebula-storaged.conf.default etc/nebula-storaged.conf
  19. $ sudo cp etc/nebula-metad.conf.default etc/nebula-metad.conf
  20. $ sudo cp etc/nebula-graphd.conf.default etc/nebula-graphd.conf

详情参考启动和停止 Nebula Graph 服务文档

由于 Nebula Graph 使用了大量的 C++ 模板,尤其是 Folly、fbthrift 和 boost,因此编译会非常耗时。比如,如果使用 Intel E5-2697 v3 处理器,在 16 个任务并发运行的情况下,需要花费大约 4 分钟完成编译,总的 CPU 时间大约 35 分钟。

源码打包(可选)

  • 如需将 Nebula Graph 打包至一个包,请使用以下命令:
  1. cd nebula/package
  2. ./package.sh -v <version>
  • 如需将 Nebula Graph 打包至多个包,请使用以下命令:
  1. cd nebula/package
  2. ./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 会自动选择合适的编译器。但是,如果目标编译器不在默认的标准路径下,或者你想使用其他种类或路径下的编译器,请使用如下方式指定:

  1. $ cmake -DCMAKE_C_COMPILER=/path/to/gcc/bin/gcc -DCMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ ..
  2. $ 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

该选项允许我们使用不同的链接器。目前可用的选项是:bfdgoldlld。其中,bfdgold 隶属于 GNU binutils,lld 则需要安装 LLVM/Clang。此外,如果需要,还可以使用该参数指定链接器的绝对路径。

NEBULA_THIRDPARTY_ROOT

该选项用于显式指定 third party 所在路径。

手动安装 Third Party

在 configure/cmake 阶段,Nebula Graph 默认将预先编译好的 third party 下载到当前 build 目录。但是如果你想将其安装到其他路径(比如,安装到某个公共目录),你可以:

  1. # 安装 third party 至 /opt 需要 root 权限,可使用 --prefix 改变安装路径
  2. $ ../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 目录下,运行:

  1. $ ../third-party/install-cmake.sh cmake-install
  2. CMake has been installed to prefix=cmake-install
  3. Run 'source cmake-install/bin/enable-cmake.sh' to make it ready to use.
  4. Run 'source cmake-install/bin/disable-cmake.sh' to disable it.
  5. $ source cmake-install/bin/enable-cmake.sh
  6. $ cmake --version
  7. cmake version 3.15.5

此时可用的 CMake 已安装完成。你可以在任何时候使用 source cmake-install/bin/disable-cmake.sh 命令将其禁用。

安装可用的 GCC

对于没有可用 GCC 安装的用户, 我们提供了 GCC 和可自动下载安装的脚本。在 build 目录下,运行:

  1. # 将 GCC 安装至 /opt 需要 root 权限,支持更改安装路径
  2. $ ../third-party/install-gcc.sh --prefix=/opt
  3. GCC-7.5.0 has been installed to /opt/vesoft/toolset/gcc/7.5.0
  4. Performing usability tests
  5. Performing regular C++14 tests...OK
  6. Performing LeakSanitizer tests...OK
  7. Run 'source /opt/vesoft/toolset/gcc/7.5.0/enable' to start using.
  8. Run 'source /opt/vesoft/toolset/gcc/7.5.0/disable' to stop using.
  9. # 注意路径和指定版本可能与你的环境不同
  10. $ source /opt/vesoft/toolset/gcc/7.5.0/enable
  11. # 此处仅设置了 PATH,以免污染库路径
  12. # 如果需要可运行 'export LD_LIBRARY_PATH=/opt/vesoft/toolset/gcc/7.5.0/lib64:$LD_LIBRARY_PATH'
  13. $ g++ --version
  14. g++ (Nebula Graph Build) 7.5.0
  15. Copyright (C) 2017 Free Software Foundation, Inc.

此时可用的 GCC 编译器已安装完成。你可以在任何时候使用 source /opt/vesoft/toolset/gcc/7.5.0/disable 命令将其禁用。

无网络编译

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

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

  1. # 下载 GCC
  2. # RedHat 或 CentOS 用户
  3. $ wget https://oss-cdn.nebula-graph.com.cn/toolset/vesoft-gcc-7.5.0-CentOS-x86_64-glibc-2.12.sh
  4. # Debian 或 Ubuntu 用户
  5. $ wget https://oss-cdn.nebula-graph.com.cn/toolset/vesoft-gcc-7.5.0-Debian-x86_64-glibc-2.13.sh
  6. # 下载 CMake
  7. $ wget https://cmake.org/files/v3.15/cmake-3.15.5-Linux-x86_64.sh
  8. # 下载第三方库
  9. $ 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

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

  1. # 安装 GCC
  2. # RedHat 或 CentOS 用户
  3. $ sudo bash vesoft-gcc-7.5.0-CentOS-x86_64-glibc-2.12.sh
  4. # Debian 或 Ubuntu 用户
  5. $ sudo bash vesoft-gcc-7.5.0-Debian-x86_64-glibc-2.13.sh
  6. # 启用 GCC 安装
  7. $ source /opt/vesoft/toolset/gcc/7.5.0/enable
  8. # 安装 CMake
  9. $ sudo bash cmake-3.15.5-Linux-x86_64.sh --skip-license --prefix=/opt/vesoft/toolset/cmake
  10. # 将安装好的cmake的bin目录加到PATH里面
  11. $ export PATH=/opt/vesoft/toolset/cmake:$PATH
  12. # 安装第三方库
  13. $ 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 时,会发生该错误:

  1. [ 5%] Building CXX object src/common/fs/CMakeFiles/fs_obj.dir/FileUtils.cpp.o
  2. In file included from src/common/fs/FileUtils.cpp:8:
  3. In file included from src/common/fs/FileUtils.h:12:
  4. src/common/base/StatusOr.h:57:19: error: invalid argument type 'auto' to unary expression
  5. static_assert(!is_status_v<T>, "`T' must not be of type `Status'");
  6. ^~~~~~~~~~~~~~~
  7. src/common/fs/FileUtils.cpp:90:34: note: in instantiation of template class 'nebula::StatusOr<std::__cxx11::basic_string<char> >' requested here
  8. StatusOr<std::string> FileUtils::readLink(const char *path) {
  9. ...

这是 Clang 9.0 引入的一个已知的 Bug,Clang 10.0(2020-05-25)尚未修复。