2011. 5. 30.

Qt Cross-compiling with Scratchbox2

Embedded 환경 구축을 위한 Cross-compiling은 누가 뭐래도 지루하고 따분한 일에는 틀림 없다.

특히 Qt와 같이 다양한 기능을 제공하는 Platform Cross-compile에는 더 많은 정성과 신경이 쓰인다.
게다가 Hardware 가속기능이나 멀티미디어 라이브러리를(DirectFB, D-Bus, GStreamer, OpenGL ES)
지원하기 위해서는 Optimization도 많고, Testing까지 생각한다면 Cross-compiling Tool의 사용은
선택이 아니라 필수의 항목일 수 있다.
( 하드웨어 가속기나 멀티미디어 항목은 귀찮치만 신경을 쓰면 쓸수록 Application의 성능과 연관성도 높다)

따라서 Scratchbox2를 반복적으로 쓰면서 나름 편리하다고 느껴진 방법을 정리해 보았다.

1) Scratchbox2를 Host 에 설치한다.

2) 제공된 Board SDK 를 이용하여 root image를 만든다.

3) Target rootfs 루트폴더로 이동한다.
Scratchbox2 의 sb2-init 은 반드시 targetfs 의 root에서 실행 시켜줄 것을 권장한다.
예) cd ~/Tegra2Arm/vibrante-devlite-p1138/targetfs

4) scratchbox 2 env 를 만들어 준다.
예 ) sb2-init Tegra2Qt ~/toolchains/tegra2-x.x.x/bin/arm-none-linux-gnueabi-gcc
sb2-init -c qemu-arm Tegra2QPA ~/toolchains/tegra2-x.x.x/bin/arm-none-linux-gnueabi-gcc
sb2-init [option].... [Target Name] [Compiler:specs] [secondary_compiler]

5) Scratchbox2 가상환경으로 들어 간다.
예) sb2 -t Tegra2QPA
sb2 -t [Target Name]

6) Qt Configuration

- makespec set to use host-g++ and friends (builds tools for host)
- xmakespec set to linux-g++
예) configure -platform linux-tegra2-g++ -arch arm -xplatform linux-g++ -no-neon -graphicssystem raster -opengl es2 -confirm-license -force-pkg-config
여기서 가장 중요한 요소는 -force-pkg-config 인데, opengl es2나 dbus driver들이 제대로 맞물릴 수 있도록
해당 Target pkgconfig 위치가 $PKG_CONFIG_PATH를 정확히 지정 할 수 있도록 한다.


# # qmake configuration for linux-g++ #

MAKEFILE_GENERATOR = UNIX

TEMPLATE = app

CONFIG += qt warn_on release incremental link_prl

QT += core gui

QMAKE_INCREMENTAL_STYLE = sublib

include(../../common/g++.conf)

include(../../common/linux.conf)

# modifications to g++.conf

QMAKE_CC = sb2 gcc

QMAKE_CXX = sb2 g++

QMAKE_LINK = sb2 g++

QMAKE_LINK_SHLIB = sb2 g++

# modifications to linux.conf

QMAKE_AR = sb2 ar cqs

QMAKE_OBJCOPY = sb2 objcopy

QMAKE_STRIP = sb2 strip

load(qt_config)



- force-pkg-config (we are still cross compiling and hence have to explicitly enable pkg-config use )
export PKG_CONFIG_PATH=$TARGET_DIR/usr/lib:$TARGET_DIR/usr/local/lib



댓글 없음:

댓글 쓰기