RSS

gRPCのCMakeビルドシステムへの改善

過去数ヶ月間、Kitware Inc. は gRPC チームと協力して、gRPC の CMake サポートを改善してきました。この取り組みの目標は、gRPC の CMake ビルドを CMake が提供する最新の機能とテクニックで最新化することでした。これにより、gRPC の CMake をビルドシステムとして選択する gRPC 開発者のユーザーエクスペリエンスが向上しました。この取り組みの間、CMake ビルド全体が検討され、GitHub 上の CMake 関連の問題が調査され、解決されました。開発者やエンドユーザーが CMake で gRPC をビルドする際により良い体験を得られるように、多くの改善が行われました。

最もエキサイティングな変更の1つは、簡単な CMake ファイルを使用して、gRPC のすべての依存ライブラリをビルドした状態で、あらゆる CMake プロジェクトに gRPC をシームレスに追加できるようになったことです。最近の変更の前は、これは多段階のプロセスでした。ユーザーは、gRPC の依存関係をそれぞれ個別にビルドしてインストールし、次に gRPC をビルドしてインストールしてから、最後に自身のプロジェクトをビルドする必要がありました。現在では、これはすべて1ステップで完了できます。以下の 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 をビルドする方法 (BUILDING.md) と、CMake プロジェクトに gRPC を依存関係として追加する方法 (README.md#cmake) のドキュメントを改善しました。これにより、開発者は CMake から gRPC を使用する際に、ビルド済みの gRPC にリンクする単純な方法から、プロジェクトの一部として gRPC をダウンロードしてビルドする方法まで、いくつかのオプションが利用できるようになりました。
  • CMake ビルドは、Makefile ビルドと同様に、インストールディレクトリに pkgconfig (*.pc) ファイルを生成するようになりました。これにより、pkgconfig は CMake でビルドされた gRPC のバージョンを正しく見つけ、報告できるようになります。
  • CMake v3.13 以降を使用している場合、各コンポーネントを個別にビルドしてインストールするのではなく、gRPC とその依存関係を1ステップでビルドおよびインストールできるようになりました。
  • CMake ビルドには、すべての protoc プラグインのビルドを有効または無効にするための設定オプションが追加されました。たとえば、CMake を ` -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF ` で実行すると、Python プラグインのビルドが無効になります。これらのオプションは、gRPC のビルドを設定する際に cmake-gui (または ccmake) で表示および編集できます。
  • gRPC を共有ライブラリとしてビルドおよびインストールする場合、CMake は .so バージョンを設定するようになり、ライブラリが正しくバージョン管理されるようになりました (例: libgrpc.so.9.0.0, libgrpc++.so.1.27.0-dev など)。
  • CMake FetchContent モジュールを使用して gRPC をビルドする方法 (run_distrib_test_cmake_fetchcontent.sh) および Raspberry Pi 向けに gRPC をクロスコンパイルする方法 (run_distrib_test_raspberry_pi.sh) を示す例を追加しました。
  • CMake は、c-ares が Autotools ではなく CMake でビルドされていても、libc-ares を見つけられるようになりました。これにより、gRPC は、Autotools でビルドされたディストリビューション提供の c-ares バージョンに対してビルドできるようになります。
  • gRPC がテストを有効にせずにビルドされた場合、依存するテストフレームワークは、不要なコンパイルを避けるために自動的に無効になります。
  • 並列ビルドに関するいくつかの問題が解決されました。

ボーナスとして、この取り組みの技術的な一部ではありませんでしたが、CMake ビルドの簡素化と容易化に貢献する追加の変更が1つあります。

  • boringssl 依存関係をビルドするために、より軽量な CMake ビルドが使用されるようになり、一部の奇妙なビルド時依存関係 (例: `golang`) が排除されました。