找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1153

积分

0

好友

162

主题
发表于 5 天前 | 查看: 11| 回复: 0

本文提供了使用 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

软件包构建配置

rpmdebpackage 构建类型应用了高级优化标志:

-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

此命令会:

  1. 调用 do_init() 运行 deps/init/dep_create.sh
  2. 创建 build_debug/ 目录
  3. 使用 -DCMAKE_BUILD_TYPE=Debug -DOB_USE_LLD=ON 运行 CMake
  4. 使用 make -j24 进行编译

场景 2: 发行版构建,但不编译

# 为发行版配置,但暂不编译
./build.sh release --init

此命令会:

  1. 如果需要,初始化依赖项
  2. build_release/ 中配置构建
  3. 在 CMake 配置后停止,用户可后续手动运行 make

场景 3: 构建 RPM 软件包

# 构建生产环境 RPM 包
./build.sh rpm --make

此命令会:

  1. 创建 build_rpm/ 目录
  2. 使用软件包优化的标志(LTO、PGO、BOLT)进行配置
  3. 设置 -DCMAKE_BUILD_RPM=ON -DOB_BUILD_PACKAGE=ON
  4. 编译软件包

场景 4: 使用 AddressSanitizer 进行开发

# 构建带内存错误检测的版本
./build.sh release_asan --make

此命令会:

  1. 创建 build_release_asan/ 目录
  2. 启用 ASan:-DOB_USE_ASAN=ON
  3. 禁用 mcmodel:-DOB_ENABLE_MCMODEL=OFF
  4. 编译插桩后的二进制文件

场景 5: IDE 集成(LSP 设置)

# 为 clangd 生成 compile_commands.json
./build.sh clangd --init
# 或为 ccls 生成
./build.sh ccls --init

这些命令会:

  1. 配置构建(针对 clangd 会禁用 Unity Builds)
  2. 在构建目录中生成 compile_commands.json
  3. 从仓库根目录创建指向该文件的符号链接

构建产物和目标

主要构建目标

构建系统根据 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 将其作为预处理器定义进行传播:

  1. build.sh 设置 CMake 变量(例如,-DOB_USE_ASAN=ON
  2. CMakeLists.txt 将它们转换为编译器标志
  3. 代码可以根据这些定义进行条件编译(例如,#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 系统上自动禁用。这是预期行为。

构建目录冲突

如果遇到现有构建目录的问题,可以:

  1. 移除特定的构建目录:rm -rf build_<type>
  2. 使用 ./build.sh clean 移除所有构建目录
  3. 使用 --init 重新开始



上一篇:大模型推理术语全解析:从性能指标到核心框架参数优化指南
下一篇:Go1.26错误处理新特性:使用errors.AsType实现类型安全与性能优化
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 20:52 , Processed in 0.109412 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表