QT 기반의 윈도우 매니저인 QTOPIA(큐토피아)를 StrongArm 에 포팅하는 방법을 다룬다. 큐토피아는 리눅스기반의 PDA인 자우르스에 탑재되어 현재 상용화 되고 있다. 리눅스 기반의 PDA 가 거의 없는 것은 여러가지 이유가 있겠지만, Win CE 보다 UI 인터페이스가 떨어지는 이유도 한 몫한다. 어찌보면, 이것은 데스크탑에서의 Window 와 Linux 의 상황과도 비슷하다고 할 수 있겠다. 하지만, 큐토피아를 보면 '이것이 과연 리눅스인가?' 할 정도로 화려한 UI 인터페이스를 자랑한다. 앞으로는 QTOPAI 대신에 큐토피아로 부르겠다.
QTOPIA?
X 윈도우 프로그래밍이라고 한다면, 크게 QT 와 GTK 를 꼽을 수 있다. 현재 일반 데탑 리눅스환경에서 가장 많이 쓰이고 있는 윈도우 매니저인 KDE(QT 기반) 와 GNOME(GTK 기반)도 알고보면, 두개의 언어로 만들어졌다.
큐토피아는 앞에서도 말했듯이 QT 기반이다. 기존의 QT 기반의 프로그램을 크로스컴파일을 하면, 그대로 타겟보드에서 구동이 가능하다. 큐토피아 사이트 http://www.trolltech.com 에 가보면 알겠지만, 큐토피아는 공짜가 아니다. 물론 소스를 제공하긴 하지만, 어떠한 제품으로 탑재되어 양산될 경우에는 로열티를 지불해야 한다. 개인적인 연구목적의 한도내에서라면, 상관없이 사용이 가능하다. ^^;
QT는 다음과 같은 패키지로 구성되어 있다.
- qt-embedded : qt-embedded 라이브러리
- qt-x11 : x-windows 관련한 라이브러리 및 실행파일
- qtopia : qt 기반의 윈도우 매니저
큐토피아에 대해서 알고 싶다면, 관련 사이트를 참고하기 바란다. 이제 본격적으로 포팅해보자!!
준비운동하기
일단 나의 포팅 환경을 설명하겠다. 노트북에서 VMware을 이용 와우리눅스 7.3 을 사용했다.
CPU | Pentium M 1.2G |
RAM | 776MB |
OS | Wow Linux 7.3 |
다음 필요한 소스 파일들이다. 될 수 있으면, 아래의 버전을 지켜주기 바란다. 혹시 버전별로 궁합(?)이 안맞을 수 있기 때문이다.
이름 | 주소 |
qt-embedded-2.3.7.tar.gz | http://sunsite.rediris.es/mirror/Qt/source/qt-embedded-2.3.7.tar.gz |
qt-x11-2.3.2.tar.gz | http://sunsite.rediris.es/mirror/Qt/source/qt-x11-2.3.2.tar.gz |
qtopia-free-1.7.0.tar.gz | ftp://ftp.trolltech.com/qtopia/source/qtopia-free-1.7.0.tar.gz |
tmake-1.11.tar.gz | http://ftp.gentoo.or.kr/distfiles/tmake-1.11.tar.gz |
e2fsprogs-1.32.tar.gz | http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.32.tar.gz |
jpegsrc.v6b.tar.gz | http://www.xfig.org/jpeg/jpegsrc.v6b.tar.gz |
여기서 중요한 것은 크로스 컴파일러이다. 나의 경우 요피에서 기본으로 제공되었던 툴체인을 가지고 포팅을 시도했었다. 하지만, 번번히 큐토피아를 컴파일하는 과정에서 원인모를 에러에 부딪혔다. 그래서 결국 찾아낸 것이 바로 한백전자 라는 회사에서 제공한 툴체인이었다. 결국 이것으로 무사히 컴파일에 성공할 수 있었다. 지금까지도 어떤 이유인지는 모르겠지만, 아마도 각가의 툴체인을 만들 때의 환경이나, 소스 프로그램 버전간의 차이, 그리고 컴파일시 세팅의 문제 같다. 아래의 주소에서 다운로드 받는다.
위에서 받은 모든 파일들은 편의상 모두 한 디렉토리에 모아두도록 한다.
/home/fat81
툴체인 설치
일단 위에서 받은 파일의 압축을 풀고, /usr 디렉토리에 복사하는 것으로 설치가 완료된다.
#tar xzvf EMPOSII-CD-20040320.tgz #cd 1.2/Tools/toolchain #tar xzvf cross-tools.tgz #cp -arf cross-tools /usr/
파일생성 (uic, moc)
기본적인 툴체인 설치가 되었으면, 이제 큐토피아를 컴파일하기 위한 준비작업에 들어가도록 한다.
바로 uic 와 mon 이라는 파일이 큐토피아 컴파일시에 필요하기 때문에 만들어주어야 한다.
이제부터 이후의 모든 작업은 /embedded 디렉토리 아래에서 진행될 것이다. 때문에 압축을 푼 소스파일은 모두 embedded 디렉토리 아래로 옮겨 놓는다.
#cd /embedded #cd qt-2.3.2 #export QTDIR=$PWD #export PATH=$QTDIR/bin:$PATH #export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH #./configure #make #make -C tools/qvfb #cd bin #ls
무사히 컴파일이 완료되었다면, uic 와 moc 가 생성되었을 것이다.
qt-embeddded 컴파일
큐토피아를 컴파일하기 위해서 필요한 라이브러리를 생성하기 위해 qt-embedded 를 컴파일한다.
일단 qtopia-free-1.7.0.tar.gz ,qt-embedded-2.3.7.tar.gz 와 tmake-1.11.tar.gz 의 압축을 풀어서 embedded 디렉토리에 옮긴다.
#cd /embedded/qt-2.3.7 #export QTDIR=/embedded/qt-2.3.7 #export QPEDIR=/embedded/qtopia-free-1.7.0 #export LD_LIBRARY_PATH=/embedded/qt-2.3.7/lib:$LD_LIBRARY_PATH #export TMAKEDIR=/embedded/tmake-1.11 #export TMAKEPATH=/embedded/tmake-1.11/lib/qws/linux-arm-g++ #export PATH=$TMAKEDIR/bin:/usr/cross-tools/bin:$PATH
위와 같이 환경변수 세팅을 해주고 난 후에, 컴파일에 앞서 컴파일 옵션을 정의하기 위해 qconfig-qpe.h 라는 파일을 복사한다.
#cp /embeddded/qtopia-free-1.7.0/src/qt/qconfig-qpe.h /embedded/qt-2.3.7/src/tools/
이제 본격적인 컴파일을 시작해보자!!
#cd /embedded/qt-2.3.7 #./configure -xplatform linux-arm-g++ -qconfig qpe // yes, 16, no 입력 #make sub-src #cd lib #ll drwxr-xr-x 2 518 519 8192 7월 17 2003 fonts/ lrwxrwxrwx 1 root root 15 1월 31 00:30 libqte.so -> libqte.so.2.3.7* lrwxrwxrwx 1 root root 15 1월 31 00:30 libqte.so.2 -> libqte.so.2.3.7* lrwxrwxrwx 1 root root 15 1월 31 00:30 libqte.so.2.3 -> libqte.so.2.3.7* -rwxr-xr-x 1 root root 4091403 1월 31 00:30 libqte.so.2.3.7*
에러없이 컴파일이 되었다면, 이와 같은 라이브러리가 생성되었을 것이다. file 명령어로 확인해보면, arm 용으로 만들어졌다는 것을 알게될 것이다.
라이브러리 생성 (libuuid.a, libjpeg.la)
앞에서 설치한 한백전자의 툴체인에서는 libuuid.a 와 libjpeg.la 라이브러리가 포함되어 있지 않다. 그렇기때문에 바로 큐토피아를 컴파일할 시에 에러가 난다. 결국 위의 필요한 라이브러리를 직접 만들어 주어야 한다.
우선 libuuid.a 부터 만들어보자!!
#cd /embedded/e2fsprogs-1.32 #./configure #cd util #make subst #./subst -f subst.conf ../lib/ext2fs/ext2_types.h.in ../lib/ext2fs/ext2_types.h #cd ../lib/uuid #mv Makefile Makefile.bak #vi Makefile
여기서 Makefile 을 아래 처럼 새로 만들어주어야 한다.
TOOLCHAIN=/usr/cross-tools/bin CC =${TOOLCHAIN}/arm-linux-gcc CFLAGS =-I.. AR =${TOOLCHAIN}/arm-linux-ar rc RANLIB =${TOOLCHAIN}/arm-linux-ranlib OBJS = clear.o compare.o copy.o gen_uuid.o isnull.o pack.o parse.o unpack.o unparse.o uuid_time.o TARGET =libuuid.a ${TARGET}: ${OBJS} ${AR} $@ ${OBJS} ${RANLIB} $@
Makefile 을 만들시 반드시 띄어쓰기를 주의하기 바란다. 만들었으면, make 명령어로 컴파일하자! 제대로 컴파일 되었다면, libuuid.a 파일이 생성되었는지 확인한다. 생성된 라이브러리를 툴체인에 등록(?) 한다.
#cp libuuid.a /usr/cross-tools/arm-linux/lib/ #mkdir /usr/cross-tools/arm-linux/include/uuid #cp uuid.h /usr/cross-tools/arm-linux/include/uuid/
이제는 libjpeg.la 를 만들어보자!!
#cd /embedded/jpeg-6b #./configure --enable-shared #vi Makefile
Makefile 이 생성되었을 것이다. 이것을 아래와 같이 수정해주어야 한다.
# Where to install the programs and man pages. prefix = /usr/cross-tools exec_prefix = ${prefix} bindir = $(exec_prefix)/arm-linux/bin libdir = $(exec_prefix)/arm-linux/lib includedir = $(prefix)/arm-linux/include binprefix = manprefix = manext = 1 mandir = $(prefix)/man/man$(manext) # The name of your C compiler: CC= arm-linux-gcc
수정한 후에 make 로 컴파일한다. 에러없이 컴파일되었다면, 아래와 같이 라이브러리가 생성되었을 것이다.
#ls libjpeg.la #cd .libs #ll lrwxrwxrwx 1 root root 13 1월 31 01:02 libjpeg.la -> ../libjpeg.la lrwxrwxrwx 1 root root 17 1월 31 01:02 libjpeg.so -> libjpeg.so.62.0.0* lrwxrwxrwx 1 root root 17 1월 31 01:02 libjpeg.so.62 -> libjpeg.so.62.0.0* -rwxr-xr-x 1 root root 145007 1월 31 01:02 libjpeg.so.62.0.0*
이것들 역시 툴체인에 등록시키기 위해서 복사한다.
#cp libjpeg.la /usr/cross-tools/arm-linux/lib/ #cd .libs #cp libjpeg.so libjpeg.so.62 libjpeg.so.62.0.0 /usr/cross-tools/arm-linux/lib/
qtopia 컴파일
이제 큐토피아를 컴파일하기 위한 모든 준비가 끝났다. 이제 직접 컴파일 해보자!
#cd /embedded/qtopia-free-1.7.0/src #./configure -xplatform linux-arm-g++ #make
분명히 아래와 같은 에러가 날 것이다.
make[1]: 들어감 `/embedded/qtopia-free-1.7.0/src/libraries/qtopia' 디렉토리 /embedded/qt-2.3.7/bin/uic passwordbase_p.ui -o ./passwordbase_p.h make[1]: /embedded/qt-2.3.7/bin/uic: 명령을 찾지 못했음 make[1]: *** [passwordbase_p.h] 오류 127 make[1]: 나감 `/embedded/qtopia-free-1.7.0/src/libraries/qtopia' 디렉토리 make: *** [libraries/qtopia] 오류 2
이때는 당황하지 말고, 앞서 qt-x11 컴파일할 때 만든 uic 를 복사해주면 된다.
#cd /embedded/qt-2.3.2/bin #cp uic /embedded/qt-2.3.7/bin
다시 돌아와서, 컴파일해보자!! 에러없이 컴파일되었다면, lib 와 bin 디렉토리에 각각 파일이 생성되었을 것이다.