Onion Omega2+ 보드는 13$ 의 저렴한 개발보드이다. 사양은 다음과 같고 OpenWRT 기반의 리눅스가 올라가 있다. (사양 출처: https://onion.io/store/omega2p/ )
Technical Details
- 580MHz MIPS CPU
- 128MB Memory
- 32MB Storage
- USB2.0 support
- 2.4GHz b/g/n WiFi
- 3.3V Operating Voltage
- 18 GPIOs
- Support for UART, I2C, SPI
- MicroSD slot
CPU 성능등으로 어떤 라이브러리를 빌드할때, 보드 자체에서 빌드는 거의 불가능하고 Cross-Compile 환경이 구성 되어 있어야 한다. 이번 포스팅에서는 Onion Omega2+ 의 라이브러리 빌드를 위한 Cross-Compile 환경 구축에 대해서 설명한다. (참고 사이트: https://docs.onion.io/omega2-docs/cross-compiling.html )
1. Host 환경 설정
Host 는 ubuntu 18.04 desktop 이고 다음과 같이 필요한 라이브러리들을 설치한다.
$ sudo apt-get install -y git wget subversion build-essential libncurses5-dev zlib1g-dev gawk flex quilt git-core unzip libssl-dev python-dev python-pip libxml-parser-perl
2. LEDE Build system 다운로드
Onion Omega2를 위해 커스터마이징 된 Build System을 다운로드 한다.
$ git clone https://github.com/OnionIoT/source.git
3. Build 환경 설정
source 폴더로 진입해서 make menuconfig 로 빌드 환경을 설정한다.
- Target System은 MediaTek Ralink MIPS를 선택
- Subtarget은 MT7688 based boards 선택
- Target Profile 을 선택하고 Multiple devices 선택
- Target Device에서 대상 디바이스 선택(onion omega2+)
- Save 하고 종료
console에서 $make 로 빌드한다. 빌드하다가 다음과 같이 오류가 발생할 수 있는데,
./../misc/create_inode.c:395:18: error: conflicting types for 'copy_file_range' static errcode_t copy_file_range(ext2_filsys fs, int fd, ext2_file_t e2_file, ^~~~~~~~~~~~~~~ In file included from ./../misc/create_inode.c:19:0: /usr/include/unistd.h:1110:9: note: previous declaration of 'copy_file_range' was here ssize_t copy_file_range (int __infd, __off64_t *__pinoff,
|
다음의 소스에서 /usr/include/unistd.h 를 include하는 부분을 주석처리한다.
source/build_dir/host/e2fsprogs-1.43.3/misc/create_inode.c
빌드하게 되면 다음의 폴더에 툴체인이 존재한다.
source/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16
이 폴더의 bin 에 compile tool이, include에 C standard library, lib에 C standard library shared object가 존재한다.
4. Cross-Compile 환경 구성
Cross Compile 환경은 다음과 같이 구성한다.
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 |