RSS

改进 gRPC 的 CMake 构建系统

在过去几个月里,Kitware Inc. 一直与 gRPC 团队合作改进 gRPC 的 CMake 支持。这项工作的目标是利用 CMake 最新的功能和技术来现代化 gRPC 的 CMake 构建。这改进了选择使用 gRPC 的 CMake 作为构建系统的 gRPC 开发者的用户体验。在此期间,对 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 插件。您可以在 cmake-gui (或 ccmake) 中查看和编辑这些选项,以便在配置 gRPC 构建时进行调整。
  • 在构建和安装 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 可以针对发行版提供的 c-ares 版本进行构建,如果该版本是用 Autotools 构建的。
  • 如果构建 gRPC 时未启用测试,则会依赖的测试框架将自动禁用,以避免不必要的编译。
  • 并行构建的一些问题已得到解决。

此外,还有一个额外的变化,虽然技术上不属于这项工作的一部分,但也有助于简化 CMake 构建:

  • 为了构建 boringssl 依赖项,现在使用了更加轻量级的 cmake 构建,这消除了某些奇怪的构建时依赖(例如 golang)。