本文提供了使用 build.sh 脚本从源代码构建 OceanBase SeekDB 的完整指南,涵盖了构建工作流程、可用的构建类型以及常见的构建场景。
关于使用开发容器(Dev Containers)设置开发环境,请参阅开发环境设置章节。关于安装预构建的软件包,请参阅安装和部署章节。
前置条件
在从源代码构建之前,必须初始化项目依赖项。构建系统需要:
- CMake:位于
deps/3rd/usr/local/oceanbase/devtools/bin/cmake(在初始化期间安装)。
- 第三方依赖项:位于
deps/3rd/usr/local/oceanbase/deps/devel(在初始化期间安装)。
- 系统要求:Linux 系统,带有 GCC/Clang 编译器,以及至少 6GB 以上的空闲磁盘空间。
初始化步骤会使用 deps/init/dep_create.sh 脚本下载并配置所有必需的依赖项。
基本构建工作流程
从源代码构建 SeekDB 的标准工作流程包括三个主要阶段:初始化(Initialization)、配置(Configuration)和编译(Compilation)。
构建流程图

构建脚本执行流程

构建类型
build.sh 脚本支持多种构建类型,每种类型都使用不同的 CMake 选项进行配置。构建类型作为脚本的第一个参数指定。
构建类型参考
| 构建类型 |
CMake 构建类型 |
关键选项 |
用例 |
debug (默认) |
Debug |
-DOB_USE_LLD=$LLD_OPTION |
用于调试的开发构建 |
debug_no_unity |
Debug |
-DOB_USE_LLD=$LLD_OPTION -DOB_ENABLE_UNITY=OFF |
不使用统一构建的调试版本 |
release |
RelWithDebInfo |
-DOB_USE_LLD=$LLD_OPTION |
经过优化、包含调试信息的版本 |
release_no_unity |
RelWithDebInfo |
-DOB_USE_LLD=$LLD_OPTION -DOB_ENABLE_UNITY=OFF |
不使用统一构建的发行版 |
release_asan |
RelWithDebInfo |
-DOB_USE_ASAN=$ASAN_OPTION -DOB_ENABLE_MCMODEL=OFF |
包含地址清理器(ASan)的发行版 |
release_coverage |
RelWithDebInfo |
-DWITH_COVERAGE=ON |
包含覆盖率插桩的发行版 |
errsim |
RelWithDebInfo |
-DOB_ERRSIM=ON |
错误注入模拟模式 |
rpm |
RelWithDebInfo |
-DCMAKE_BUILD_RPM=ON -DOB_BUILD_PACKAGE=ON + LTO/PGO |
RPM 软件包构建 |
deb |
RelWithDebInfo |
-DCMAKE_BUILD_DEB=ON -DOB_BUILD_PACKAGE=ON + LTO/PGO |
DEB 软件包构建 |
package |
RelWithDebInfo |
-DOB_BUILD_PACKAGE=ON + 自动检测打包 |
自动检测 RPM 或 DEB 软件包 |
perf |
RelWithDebInfo |
-DENABLE_AUTO_FDO=ON -DENABLE_THIN_LTO=ON -DENABLE_BOLT_AUTO=ON |
性能优化构建 |
coverage |
Debug |
-DWITH_COVERAGE=ON |
包含覆盖率插桩的调试版本 |
sanity |
RelWithDebInfo |
-DENABLE_SANITY=ON -DOB_ENABLE_MCMODEL=ON |
启用完整性检查 |
ccls |
Debug |
-DOB_BUILD_CCLS=ON |
为 ccls 生成 compile_commands.json |
clangd |
Debug |
-DOB_ENABLE_UNITY=OFF |
为 clangd 生成 compile_commands.json |
软件包构建配置
rpm、deb 和 package 构建类型应用了高级优化标志:
-DOB_BUILD_PACKAGE=ON
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DOB_USE_LLD=$LLD_OPTION
-DENABLE_FATAL_ERROR_HANG=OFF
-DENABLE_AUTO_FDO=ON # 自动反馈导向优化
-DENABLE_THIN_LTO=ON # 精简链接时优化
-DENABLE_HOTFUNC=ON # 热点函数优化
-DENABLE_BOLT=$ENABLE_BOLT_OPTION # 二进制优化和布局工具
-DOB_STATIC_LINK_LGPL_DEPS=$STATIC_LINK_LGPL_DEPS_OPTION
构建选项和参数
命令语法
./build.sh [BuildType] [--init] [--make [MakeOptions]]
./build.sh [BuildType] [--init] [--ob-make [MakeOptions]]
选项标志
| 选项 |
描述 |
调用的函数 |
--init |
在构建前初始化依赖项 |
do_init() → dep_create.sh |
--make [options] |
配置后运行 make,并带上指定的选项 |
try_make() → make |
--ob-make [options] |
配置后运行 ob-make 包装器 |
try_make() → ob-make |
默认行为:如果未提供 --make 或 --ob-make 标志,构建将在 CMake 配置后停止,允许手动编译。
构建参数
额外的 CMake 参数可以直接传递给构建命令。某些特殊参数会影响构建配置:
-DBUILD_CDC_ONLY=ON - 禁用 BOLT 优化(ENABLE_BOLT_OPTION=OFF)
- 任何其他 CMake 的
-D 选项都会直接传递给 CMake 命令
自动特性检测
构建脚本会根据系统自动检测和调整某些特性。例如,在内核版本 6 的系统上,LLD 链接器会被自动禁用。
构建目录结构
每种构建类型都会创建一个独立的构建目录(如 build_debug/、build_release/),以允许多种构建配置并存。

常见构建场景
场景 1: 首次构建(调试模式)
# 初始化依赖并构建调试版本
./build.sh debug --init --make -j24
此命令会:
- 调用
do_init() 运行 deps/init/dep_create.sh
- 创建
build_debug/ 目录
- 使用
-DCMAKE_BUILD_TYPE=Debug -DOB_USE_LLD=ON 运行 CMake
- 使用
make -j24 进行编译
场景 2: 发行版构建,但不编译
# 为发行版配置,但暂不编译
./build.sh release --init
此命令会:
- 如果需要,初始化依赖项
- 在
build_release/ 中配置构建
- 在 CMake 配置后停止,用户可后续手动运行
make
场景 3: 构建 RPM 软件包
# 构建生产环境 RPM 包
./build.sh rpm --make
此命令会:
- 创建
build_rpm/ 目录
- 使用软件包优化的标志(LTO、PGO、BOLT)进行配置
- 设置
-DCMAKE_BUILD_RPM=ON -DOB_BUILD_PACKAGE=ON
- 编译软件包
场景 4: 使用 AddressSanitizer 进行开发
# 构建带内存错误检测的版本
./build.sh release_asan --make
此命令会:
- 创建
build_release_asan/ 目录
- 启用 ASan:
-DOB_USE_ASAN=ON
- 禁用 mcmodel:
-DOB_ENABLE_MCMODEL=OFF
- 编译插桩后的二进制文件
场景 5: IDE 集成(LSP 设置)
# 为 clangd 生成 compile_commands.json
./build.sh clangd --init
# 或为 ccls 生成
./build.sh ccls --init
这些命令会:
- 配置构建(针对 clangd 会禁用 Unity Builds)
- 在构建目录中生成
compile_commands.json
- 从仓库根目录创建指向该文件的符号链接
构建产物和目标
主要构建目标
构建系统根据 CMake 配置生成几个关键的构建产物。

条件构建选项
| 以下 CMake 选项控制构建哪些组件: |
CMake 选项 |
默认值(软件包) |
默认值(开发) |
控制范围 |
OB_BUILD_PACKAGE |
ON |
OFF |
软件包构建模式 |
OB_INCLUDE_TOOLS |
ON |
ON |
包含 tools 目录 |
OB_BUILD_TOOLS |
ON (如果是软件包) |
OFF |
构建工具二进制文件 |
OB_INCLUDE_UNITTEST |
OFF (如果是软件包) |
ON |
包含 unittest 目录 |
OB_BUILD_UNITTEST |
OFF |
OFF |
构建单元测试 |
OB_INCLUDE_TEST |
OFF (如果是软件包) |
ON |
包含 test 目录 |
OB_BUILD_TEST |
OFF |
OFF |
构建测试目标 |
OB_BUILD_LIBOB_SQL_PROXY_PARSER |
ON (如果是软件包) |
OFF |
构建 SQL 代理解析器 |
OB_BUILD_LIBOBTABLE |
ON (如果是软件包) |
OFF |
构建 obtable 库 |
OB_BUILD_OBADMIN |
ON (如果是软件包) |
OFF |
构建 ob_admin 工具 |
CMake 配置标志
编译特性标志
build.sh 脚本和 CMakeLists.txt 支持许多修改编译行为的特性标志。

标志传播
在 build.sh 中设置的构建标志会传递给 CMake,然后 CMake 将其作为预处理器定义进行传播:
build.sh 设置 CMake 变量(例如,-DOB_USE_ASAN=ON)
CMakeLists.txt 将它们转换为编译器标志
- 代码可以根据这些定义进行条件编译(例如,
#ifdef OB_USE_ASAN)
清理构建产物
要移除所有构建目录并重新开始:
./build.sh clean
此命令会移除所有 build_* 目录(除了为 IDE 集成保留的 build_ccls)。
故障排除
依赖项未初始化
错误信息:
[build.sh][NOTICE] Your workspace has not initialized dependencies, please append '--init' args to initialize dependencies
解决方案:使用 --init 标志运行构建命令。
CMake 生成失败
错误信息:
[build.sh][ERROR] Failed to generate Makefile
可能原因:无效的 CMake 参数、缺少依赖项或构建目录损坏。
解决方案:清理并重建:
./build.sh clean
./build.sh [build-type] --init --make
LLD 禁用警告
警告信息:
[build.sh][NOTICE] lld is disabled in kernel release 6
解释:由于兼容性问题,LLD 链接器会在内核发行版 6 系统上自动禁用。这是预期行为。
构建目录冲突
如果遇到现有构建目录的问题,可以:
- 移除特定的构建目录:
rm -rf build_<type>
- 使用
./build.sh clean 移除所有构建目录
- 使用
--init 重新开始