Introduction

開発メモ その194 gRPC v1.26.0 C++をビルドしHello World で、 gRPC のビルドについて書いたが、最近、arm64-v8a 向けにビルドすることがあり、少し手順が簡単になっていたので紹介する。

ソースは下記にまとめてあります。

Resolution

1.28.0-pre1 より、依存ライブラリである boringssl が、boringssl-with-bazel に置き換わった。
Unify boringssl submodules and use non-developer boringssl cmake build #21527

これにより、cmake のコマンドがとてもシンプルになった。

Dockerfile

Ubuntu 18.04のdockerイメージをベースにしたビルド用イメージを作成します。

1
2
3
4
5
6
7
8
9
FROM ubuntu:18.04

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
git \
cmake \
golang \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

そしてコンテナのビルドと起動のシェル。

1
2
3
4
#!/bin/bash +x

docker build -t grpc-build-ubuntu-18.04 .
docker run --rm -v ${PWD}:/opt/data -w /opt/data -it grpc-build-ubuntu-18.04 /bin/bash

Build

gRPCのビルドです。
上のコンテナ内で実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash +x

VERSION=v1.46.3

GRPC_SOURCE_DIR=${PWD}/grpc-${VERSION}
CMAKE_DIR=${GRPC_SOURCE_DIR}/cmake
GRPC_BUILD_DIR=${CMAKE_DIR}/build

INSTALL_DIR=${GRPC_SOURCE_DIR}/install
GRPC_DIR=${INSTALL_DIR}/grpc

BUILD_TYPE=Release
BUILD_PARALLEL=16

# clone
mkdir -p ${GRPC_SOURCE_DIR}
pushd ${GRPC_SOURCE_DIR}
git clone -b ${VERSION} https://github.com/grpc/grpc .
git submodule update --init --recursive
popd

# grpc
mkdir -p ${GRPC_BUILD_DIR}
pushd ${GRPC_BUILD_DIR}
cmake -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \
-D CMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
-D gRPC_INSTALL=ON \
-D gRPC_BUILD_TESTS=OFF \
-D gRPC_PROTOBUF_PROVIDER=package \
-D gRPC_ZLIB_PROVIDER=package \
-D gRPC_CARES_PROVIDER=package \
${GRPC_SOURCE_DIR}
make -j${BUILD_PARALLEL}
make install
popd

凄くシンプルになりました。

Hello World

こちらも少しシンプルになりましたが、幾つか手を加えています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash +x

VERSION=v1.46.3

GRPC_SOURCE_DIR=${PWD}/grpc-${VERSION}
CMAKE_DIR=${GRPC_SOURCE_DIR}/cmake
GRPC_BUILD_DIR=${CMAKE_DIR}/build

INSTALL_DIR=${GRPC_SOURCE_DIR}/install/lib/cmake
GRPC_DIR=${GRPC_SOURCE_DIR}/install
PROTOBUF_DIR=${INSTALL_DIR}/protobuf
ABSL_DIR=${INSTALL_DIR}/absl

BUILD_TYPE=Release
BUILD_PARALLEL=16

HELLOWORLD_DIR=${GRPC_SOURCE_DIR}/examples/cpp/helloworld
BUILD_DIR=${HELLOWORLD_DIR}/builds
mkdir -p ${BUILD_DIR}
pushd ${BUILD_DIR}
cmake -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \
-D CMAKE_PREFIX_PATH="${GRPC_SOURCE_DIR};${INSTALL_DIR};${GRPC_DIR};${PROTOBUF_DIR};${ABSL_DIR}" \
${HELLOWORLD_DIR}
cmake --build .

# run server
./greeter_server &
# run client
./greeter_client

popd

gRPC 本体をビルドする際に、 module 指定したものを参照するようにしています。