[gRPC] How to cross compile gRPC, using CMake


1. clone gRPC (v1.55.1)

grpc 1.55.1을 사용하겠습니다.

1
$ git clone --recurse-submodules -b v1.55.1 --depth 1 --shallow-submodules https://github.com/grpc/grpc


2. clone된 protobuf 삭제 및 22.0 버전으로 다시 clone

1번에서 자동으로 clone된 protobuf를 삭제하고, specific version으로 다시 clone해 줄 것 입니다.

1
2
3
$ cd {grpc clone }/grpc/third_party
$ rm -rf protobuf
$ git clone --recurse-submodules -b v22.0 --depth 1 --shallow-submodules https://github.com/protocolbuffers/protobuf.git


3. host 환경에서 gRPC Build 및 설치

gRPC를 cross compile 하기 위해서는 host 환경에서 먼저 build가 필요합니다. 왜냐하면 cross compile 시에 host 환경의 grpc plugin 및 protoc generator 등이 필요하기 때문 입니다.

그리고 gRPC는 한번 설치하고 나면 삭제하는 것이 쉽지 않습니다. CMake의 CMAKE_INSTALL_PREFIX을 사용하여 특정 경로에 설치하도록 하겠습니다.

1) 먼저 Host 환경으로 컴파일한 gRPC를 설치할 경로를 생성 합니다.

1
$ mkdir {grpc clone }/host_installed


2) 그리고 나서 Host 환경으로 컴파일한 gRPC를 설치할 경로를 생성 합니다.

1
2
3
4
5
6
7
8
9
10
11
mkdir -p {grpc clone }/cmake/host_build
$ cd {grpc clone }/cmake/host_build
$ cmake ../.. -DgRPC_INSTALL=ON \
 -DCMAKE_INSTALL_PREFIX={grpc clone }/host_installed \
 -DCMAKE_BUILD_TYPE=Release \
 -DgRPC_ABSL_PROVIDER=module \
 -DgRPC_CARES_PROVIDER=module \
 -DgRPC_PROTOBUF_PROVIDER=module \
 -DgRPC_RE2_PROVIDER=module \
 -DgRPC_SSL_PROVIDER=module \
 -DgRPC_ZLIB_PROVIDER=module
  • gRPC__PROVIDER=pakcage → package에서 찾아서 사용
  • gRPC__PROVIDER=module → 직접 빌드
  • CMAKE_INSTALL_PREFIX=/path → make install 시에 설치할 경로, 지정해주지 않으면 시스템 root에 설치 된다


3) host_build 경로에서 build 수행

1
$ make -j 8


4) host_build 경로에서 install (install 시 host_installed 경로에 설치 된다.)

1
$ make install


4. toolchain 사용하여 cross compile

참고로 제가 사용한 toolchain에는 cares, ssl, zlib이 이미 설치 되어 있어서 package 옵션으로 설정하여 build 하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ mkdir -p {grpc clone }/cmake/sdk_build
$ cd {grpc clone }/cmake/sdk_build
$ cmake ../.. -DgRPC_INSTALL=ON \
 -DCMAKE_INSTALL_PREFIX={install-path}} \
 -DCMAKE_BUILD_TYPE=RelWithDebInfo \
 -DgRPC_BUILD_TESTS=OFF \
 -DgRPC_ABSL_PROVIDER=module \
 -DgRPC_CARES_PROVIDER=package \
 -DgRPC_PROTOBUF_PROVIDER=module \
 -DgRPC_RE2_PROVIDER=module \
 -DgRPC_SSL_PROVIDER=package \
 -DgRPC_ZLIB_PROVIDER=package \
 -DgRPC_BUILD_GRPC_CPP_PLUGIN=ON \
 -D_gRPC_PROTOBUF_PROTOC_EXECUTABLE={grpc clone }/host_installed/bin/protoc \
 -D_gRPC_CPP_PLUGIN={grpc clone }/host_installed/bin/grpc_cpp_plugin \
 -DCMAKE_TOOLCHAIN_FILE={toolchain-path}
$ sudo make install
  • _gRPC_PROTOBUF_PROTOC_EXECUTABLE → 빌드시에 protobuf 정의 파일 generate할 때 사용할 protoc 파일 경로 (host 환경에서 사용해 야하므로 host 환경에 설치된 protoc 경로를 사용해야한다.)
  • _gRPC_CPP_PLUGIN → 빌드시에 grpc 정의 파일 generate할 때 사용할 plugin 파일 경로 (host 환경에서 사용해야하므로 host 환경에 설치된 plugin 경로를 사용해야한다.)

5. build 확인.

{install-path} 경로에 bin / include / lib 폴더가 생성된 것을 확인합니다. static library로 build 됩니다. 필요한 모든 library를 linking 하지 않으면 linking error가 발생합니다.

Updated:

Leave a comment