RSS

gRPC 的 CMake 构建系统改进

在过去几个月中,Kitware Inc. 一直与 gRPC 团队合作,致力于改进 gRPC 的 CMake 支持。此次努力的目标是使用 CMake 所能提供的最新功能和技术对 gRPC 的 CMake 构建进行现代化改造。这改善了那些选择使用 gRPC 的 CMake 作为构建系统的开发者的使用体验。在项目执行期间,我们对 CMake 构建进行了整体评估,并探索并解决了 GitHub 上与 CMake 相关的问题。我们做出了一系列改进,将为开发者和最终用户在通过 CMake 构建 gRPC 时提供更好的体验。

其中一个令人兴奋的变化是,现在可以无缝地将 gRPC 添加到任何 CMake 项目中,并使用一个简单的 CMake 文件构建其所有依赖库。在我们的最近更改之前,这是一个多步骤的过程。用户必须分别构建并安装 gRPC 的每个依赖项,然后再构建并安装 gRPC,最后才能构建自己的项目。现在,这一切都可以在一步内完成。以下 CMake 代码克隆并构建了 gRPC 的最新稳定版本,具体文档请参考此处

cmake_minimum_required(VERSION 3.15)
project(my_exe)

include(FetchContent)

FetchContent_Declare(
  gRPC
  GIT_REPOSITORY https://github.com/grpc/grpc
  GIT_TAG        v1.28.0
  )
set(FETCHCONTENT_QUIET OFF)
FetchContent_MakeAvailable(gRPC)

add_executable(my_exe my_exe.cc)
target_link_libraries(my_exe grpc++)

在配置阶段,CMake 使用 git 通过指定的标签克隆 gRPC 仓库。然后,gRPC 将通过 add_subdirectory 添加到当前 CMake 项目中,并作为项目的一部分进行构建。

具体有哪些变化?

我们解决了 GitHub 上许多与 CMake 相关的问题,包括错误修复、文档更新和新功能。所有修复和功能均从 gRPC 1.28.0 版本开始提供。

  • 我们改进了关于从源码构建 gRPC 以及将 gRPC 作为依赖项添加到您的 CMake 项目中 的文档,为开发者提供了多种从 CMake 使用 gRPC 的选择,从简单的链接到预构建的 gRPC,到下载并构建作为项目一部分的 gRPC。
  • CMake 构建现在会在安装目录中生成 pkgconfig (*.pc) 文件,就像 Makefile 构建一样。这允许 pkgconfig 正确地查找并报告以 CMake 构建的 gRPC 版本。
  • 如果您使用的是 CMake v3.13 或更高版本,现在可以一步完成 gRPC 及其依赖项的构建与安装,而无需分别构建和安装每个组件。
  • CMake 构建现在提供了启用或禁用构建每个 protoc 插件的配置选项。例如,运行带有 -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF 的 CMake 将禁用 Python 插件的构建。在配置 gRPC 构建时,您可以在 cmake-gui(或 ccmake)中查看和编辑这些选项。
  • 当将 gRPC 构建为共享库时,CMake 现在会设置 .so 版本,以便正确地对库进行版本管理(例如,libgrpc.so.9.0.0, libgrpc++.so.1.27.0-dev 等)。
  • 我们添加了示例,展示了如何使用 CMake FetchContent 模块构建 gRPC,以及如何为 Raspberry Pi 交叉编译 gRPC
  • CMake 现在可以找到 libc-ares,即使 c-ares 是使用 Autotools 而不是 CMake 构建的。这允许 gRPC 在使用由分发版本提供的(且通过 Autotools 构建的)c-ares 时进行构建。
  • 如果构建 gRPC 时未启用测试,则会自动禁用相关的测试框架,以避免不必要的编译。
  • 并行构建中的一些问题也得到了解决。

作为额外收获,还有一个并不严格属于此次改进计划的改动,但也促成了更简单、更轻松的 CMake 构建: