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 插件的构建。你可以在配置 gRPC 构建时在 cmake-gui(或 ccmake)中查看和编辑这些选项。
  • 当构建和安装 gRPC 作为共享库时,CMake 现在设置 .so 版本,以便正确地对库进行版本控制。(例如,libgrpc.so.9.0.0,libgrpc++.so.1.27.0-dev 等)。
  • 我们添加了示例,演示了如何使用 CMake FetchContent 模块构建 gRPC,以及如何为 Raspberry Pi 交叉编译 gRPC
  • 即使 c-ares 是使用 Autotools 而不是 CMake 构建的,CMake 现在也可以找到 libc-ares。这允许 gRPC 基于使用 Autotools 构建的发行版提供的 c-ares 版本进行构建。
  • 如果构建 gRPC 时禁用测试,为了避免不必要的编译,依赖的测试框架将自动被禁用。
  • 已解决一些并行构建的问题。

作为额外的好处,还有一个不属于本次工作的一部分的改动,但它也有助于简化和方便 cmake 构建。

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