PAYATHON 2026

如何关闭 FetchContent 引入的 LevelDB 测试和基准目标?

数据阿明

结论

如果这些输出来自 LevelDB 的测试和基准目标,可以在调用 FetchContent_MakeAvailable(leveldb) 前,将 LevelDB 的 LEVELDB_BUILD_TESTS 和 LEVELDB_BUILD_BENCHMARKS 选项设为 OFF。原问题中的 gtest、gmock 和 benchmark 目标与测试或基准构建有关。关闭对应选项后,它们通常不会作为 LevelDB 的构建目标加入。

include(FetchContent)

set(LEVELDB_BUILD_TESTS OFF CACHE BOOL "Build LevelDB tests" FORCE)
set(LEVELDB_BUILD_BENCHMARKS OFF CACHE BOOL "Build LevelDB benchmarks" FORCE)

FetchContent_Declare(
  leveldb
  GIT_REPOSITORY https://github.com/google/leveldb
  GIT_TAG ${LEVELDB_VERSION}
  GIT_SHALLOW TRUE)

FetchContent_MakeAvailable(leveldb)

为什么要在引入依赖前设置选项

FetchContent_MakeAvailable(leveldb) 会获取 LevelDB,并将其加入当前 CMake 配置。配置子项目时,CMake 会读取这些构建选项。如果在调用 FetchContent_MakeAvailable 后才设置,LevelDB 的目标可能已经创建,因此应提前设置。

CACHE BOOL 会将选项写入 CMake 缓存,FORCE 会把已有缓存值也改为 OFF。如果要保留用户通过 CMake 参数传入的值,可以去掉 FORCE:

set(LEVELDB_BUILD_TESTS OFF CACHE BOOL "Build LevelDB tests")
set(LEVELDB_BUILD_BENCHMARKS OFF CACHE BOOL "Build LevelDB benchmarks")

也可以在配置项目时通过命令行设置:

cmake -S . -B build \
  -DLEVELDB_BUILD_TESTS=OFF \
  -DLEVELDB_BUILD_BENCHMARKS=OFF

如果只想减少构建日志

关闭测试和基准选项后,构建时就会跳过这些不需要的目标。如果仍看到 leveldb 等项目需要的目标,它们仍是目标程序的构建依赖,不能通过关闭测试选项移除。若只是想隐藏构建进度信息,可以使用相应构建工具的静默选项;具体参数取决于 CMake 使用的生成器和底层构建工具。

备注:内容仅供参考。