'2018/08/02'에 해당되는 글 1건

  1. 2018.08.02 [Onion Omega2+] GRPC C++ 라이브러리 빌드하기
반응형

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 에 있는 헤더 파일을 이용하면 된다.


반응형
Posted by alias
,