RSS

gRPC 的 CMake 构建系统改进

在过去的几个月里,Kitware 公司一直与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可以在c-ares使用Autotools构建时,针对发行版提供的c-ares版本进行构建。
  • 如果构建gRPC时未启用测试,则相关的测试框架将自动禁用,以避免不必要的编译。
  • 已经解决了一些并行构建的问题。

另外,还有一个额外的更改,虽然技术上不属于此次工作的一部分,但也有助于实现更简单、更轻松的CMake构建:

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