GRPC(https://grpc.io/)는 http2 기반의 RPC 프로토콜이다. Onion Omega2+ 에서 GRPC를 이용하는 것은 구글, KT의 AI Makers Kit(https://gigagenie.ai/product/aimakerskit) 등에서 GRPC기반의 음성인식 라이브러리를 제공하기 떄문이다.
Onion Omega2+ 에서 GRPC C++ 라이브러리를 컴파일 하기 위해서는 다음이 필요하다.
1. Onion Omega2+ Build Toolchain : http://alnova2.tistory.com/1216 에서 이미 설명 하였다.
2. Protobuf Compile : GRPC의 데이터 처리를 위해 필요하다
(https://developers.google.com/protocol-buffers/)
3. Open SSL : SSL 기반 GRPC 호출을 위한 라이브러리이다. (https://www.openssl.org/)
4. alsa 라이브러리: Linux에서 오디오 장치를 제어하기 위한 라이브러리이다.
(https://www.alsa-project.org/)
1. 환경 설정 파일 생성
Cross-Compile을 위하여 다음과 같은 환경 설정 파일을 생성한다. 예를 들어 ~/onionenv.env 에 저장하는 것으로 이후 설명한다.
export STAGING_DIR=[툴체인빌드디렉토리]/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16 export PATH=$PATH:$STAGING_DIR/bin export CROSS=mipsel-openwrt-linux export TARGETMACH=mipsel-openwrt-linux export CC=${CROSS}-gcc export LD=${CROSS}-ld export AS=${CROSS}-as export AR=${CROSS}-ar export CXX=${CROSS}-g++ export RANLIB=${CROSS}-ranlib |
2. Alsa Library 빌드
다음처럼 Alsa Library를 빌드한다.
$wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.0.tar.bz2 $bunzip2 alsa-lib-1.1.0.tar.bz2 $tar xvf alsa-lib-1.1.0.tar $cd alsa-lib-1.1.0 $source ~/onionenv.env $./configure --host=mipsel-openwrt-linux CC=mipsel-openwrt-linux-gcc --prefix=[라이브러리Install폴더] --disable-python $make -j4 $make install |
make install 하게 되면 [라이브러리Install폴더] 에 bin, include,lib,shared 등의 폴더가 생성되고 라이브러리가 설치된다.
3. Open SSL 빌드
다음처럼 Open SSL Library를 빌드한다.
$git clone https://github.com/openssl/openssl.git -b OpenSSL_1_0_2-stable $cd openssl $source ~/onionenv.env $./Configure linux-mips32 -DOPENSSL_NO_HEARTBEATS --prefix=[설치디렉토리] --openssldir=[설치드렉토리]/openssl -no-async shared $make depend $make $make install |
make install 하게 되면 [설치디렉토리] 폴더에 bin, include, lib, openssl 등의 폴더가 생성되고 라이브러리가 설치된다.
4. Protobuf 빌드
다음처럼 Protobuf를 빌드한다.
$wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-cpp-3.5.1.tar.gz $tar xzvf protobuf-cpp-3.5.1.tar.gz $cd protobuf-3.5.1/ $./configure $make -j4 $sudo make install $source ~/onionenv.env $./configure --host=mipsel-openwrt-linux CC=mipsel-openwrt-linux-gcc CXX=mipsel-openwrt-linux-g++ --prefix=[설치디렉토리] CXXFLAGS="-D__MIPSEL__ -march=mips32" --with-protoc=/usr/local/bin/protoc --disable-shared $make clean $make $make install |
protobuf는 Host Tool 설치가 필요하다. 위 과정에서 빨간색 부분은 Host의 gcc/g++/ld 로 빌드해야 한다. ($source ~/onionenv.env 가 안된 상태에서 빌드하고 install 해야 함)
make install 하게 되면 [설치디렉토리] 폴더에 bin, include, lib 가 생성되고 라이브러리가 설치된다.
5.GRPC 빌드
다음처럼 GRPC 를 빌드한다. 다음은 Host 의 gcc/g++/ld 로 빌드해야 하는 과정이다.
$git clone -b v1.11.0 https://github.com/grpc/grpc $cd grpc $git submodule update --init $make $sudo make install $make plugins $sudo make install |
여기까지 하고 Makefile 에서 -Werror 부분을 제거해야 한다. Cross-Compile 시에 Warning 이 발생하는데, Warning으로 멈추지 않게 하기 위함이다. (vi Makefile 에서 -Werror 부분을 찾아서 제거)
$export GRPC_CROSS_COMPILE=true $export GRPC_CROSS_AROPTS="cr --target=elf32-little" $source ~/onionenv.env $make clean $make HAS_PKG_CONFIG=false \ CC=mipsel-openwrt-linux-gcc \ CXX=mipsel-openwrt-linux-g++ \ RANLIB=mipsel-openwrt-linux-musl-ranlib \ LD=mipsel-openwrt-linux-ld \ LDXX=mipsel-openwrt-linux-g++ \ AR=mipsel-openwrt-linux-ar \ CFLAGS="-std=c99 -I[OpenSSL폴더]/include -I[Protobuf폴더]/include" \ CXXFLAGS="-std=c++11 -I[OpenSSL폴더]/include -I[Protobuf폴더]/include -D__MIPSEL__ -march=mips32" \ INSTALL_PREFIX=[GRPC설치폴더] \ PROTOBUF_CONFIG_OPTS="--host=mipsel-openwrt-linux --with-protoc=/usr/local/bin/protoc" static |
[OpenSSL폴더]는 앞의 3 과정에서 라이브러리를 설치한 폴더 경로를, [Protobuf폴더]는 앞의 4과정에서 라이브러리를 설치판 폴더 경로를 넣어 주면 된다.
make 중에 오류가 발생하는데, 이 경우 [GRPC설치폴더] 를 생성하고 [GRPC설치폴더]/bin 을 생성한 다음에 다음과 같이 grpc plugin tools들을 복사해 준다.
sudo cp /usr/local/bin/grpc_* [GRPC설치폴더]/bin
make install 은 하지 않아도 된다. 아니 오류가 난다. 컴파일 된 라이브러리는 libs/opt 밑에 있으며 include 에 있는 헤더 파일을 이용하면 된다.