gRPC C++ の環境を構築する

アプリケーションから gRPC C++ を利用できる環境を作るのは、CMake の add_subdirectory を使えばある程度簡単にできます。

しかし真面目にアプリケーションを作る時は add_subdirectory はオススメできません。理由としては、

  • サーバ用、クライアント用などで CMakeLists.txt を分けると通常はビルドディレクトリが変わるので、gRPC C++ を再度コンパイルしようとして時間が掛かる
  • gRPC C++ の依存関係を含めてビルドすると、ビルド済みであってもチェックだけで数秒掛かってしまい、ちょっとした変更なのに結構時間を使ってしまう
  • gRPC C++ とそれ以外のライブラリで利用方法が違ってしまい、扱いが面倒になる

あたりです。なのでここでは gRPC C++ を別途インストールして、それをアプリケーションから利用する方法について説明します。

Homebrew とか何かのリポジトリとか使ってインストールしてもいいですが、それだとバージョンの指定が出来ないし、プロジェクト毎に違うバージョンを利用したりもできなくて微妙なので自前でローカルにビルドします。

ソースの取得

単に git clone して目的のバージョンに切り替えて git submodule update -i するだけです。
ついでにビルドディレクトリやインストールディレクトリの変数も設定しておきます。

gRPC C++ が依存しているライブラリのインストール

gRPC C++ はいくつかのライブラリに依存しているので、それをインストールしてやる必要があります。

ただ、それらのライブラリも gRPC の中に submodule として入っているので、単純に submodule からビルドしてインストールしてやるだけでいいです。

2020/2/5 追記: gRPC 1.27.0 で、単純に gRPC をインストールすれば BoringSSL, zlib, cares, protobuf がすべてインストールされるようになりました。そのため以下の依存ライブラリのビルドは不要になり、gRPC_*_PROVIDER=package という指定も不要になります。

インストールする依存ライブラリは BoringSSL, zlib, cares, protobuf です。
まずは BoringSSL から。

BoringSSL は CMake でビルドできるので、それを使ってビルドします。
ただしインストールの設定はしてくれていないようなので、自前でコピーして所定の場所にインストールします。

続いて zlib。

こっちは configure だったので、そのまま実行してるだけです。自分は静的ライブラリだけあればいいの--static を指定しています。
zlib のビルドオプションの詳細は ./configure --helpを参照してください。

次に cares。

これも CMake なので普通に叩くだけ。静的ファイルだけでいいのでその辺の設定を入れてます。
詳細は cmake $BUILD_DIR/grpc-source/third_party/cares/cares -LH とか打って確認すると良いです。

最後に protobuf。

これも CMake なので普通に叩くだけ。
ただ、protobuf は zlib に依存しているので、さっきインストールした zlib を探せるように `CMAKE_PREFIX_PATH` を設定しています。
また、テストは不要なのでビルド時間を減らすために除外しています。

これで gRPC C++ の依存ライブラリのインストールが出来ました。
うまくいってれば $INSTALL_DIR の下に boringssl/, zlib/, cares/, protobuf/ ディレクトリがあり、それぞれにライブラリがインストールされているはずです。

gRPC C++ のインストール

依存ライブラリがインストールできたので、次は gRPC C++ のインストールです。

gRPC C++ は CMake でのビルドもできるので、CMake を使っています。

gRPC_*_PROVIDER=package の指定は、依存ライブラリとして外部のライブラリを利用するという指定です。
add_subdirectory する場合には gRPC_*_PROVIDER=module を使って zlib や protobuf などのライブラリも一緒にビルドするという指定もできますが、こうやって gRPC C++ だけインストールする場合には gRPC_*_PROVIDER=module の指定はできません。module を指定した場合はインストールができなくなります。

C# 拡張用のライブラリは不要なので gRPC_BUILD_CSHARP_EXT=OFF しています。

BoringSSL, zlib, cares, protobuf は $INSTALL_DIR にインストールしたので、そのパスが探せるように OPENSSL_ROOT_DIR と CMAKE_PREFIX_PATH を指定しています。

これで gRPC C++ がインストールできました。あとはこれを利用するアプリケーションを書くだけです。

gRPC C++ を利用したアプリケーションの作成

CMakeLists.txt と同じディレクトリに helloworld.proto と helloworld.cpp があるとして、以下のように書きます。

gRPC C++ では proto ファイルから C++ コードを生成する必要があるので、生成方法を add_custom_command で指定しています。
この辺はまあ C++のサンプル を見ながら書くだけです。

C++ ファイルの出力は <ビルドディレクトリ>/proto に行われるようにしてるので、これを include できるように target_include_directories で指定しておきます。
あとは target_link_libraries でアプリケーションに gRPC::grpc++ をリンクすることを伝えます。これだけ指定しておけば、gRPC C++ だけでなく zlib や protobuf といったライブラリも一緒にリンクしてくれるようになります。

このアプリケーションをビルドする場合、以下のように cmake を実行してビルドすることになります。

gRPC C++ をビルドした時と同じで、インストール済みのライブラリを発見してもらうために OPENSSL_ROOT_DIR と CMAKE_PREFIX_PATH の指定が必要です。
ここが必要に応じてシェルスクリプトを作っておくといいでしょう。

これで build/testapp が生成されるはずなので、それが実行できるようになれば環境構築完了です。

合同会社Wandboxの代表社員

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store