2011년 9월 18일 일요일

임베디드리눅스 빌드방법- openssl, libxml2 등..

2011/06/01 13:10 linux/embedded

시스템 개요

Host

CPU : x86

O/S : Fedora 7

Target

CPU : A&W6410(S3C6410)

O/S : Linux 2.6.21.5

Kernel Image, Filesystem Image : http://juncon.tistory.com/39

사용된 패키지/라이브러리

DirectFB-1.2.8

DirectFB-example-1.2.0

Gtk+-2.12.11

glib-2.16.5

atk-1.23.5

libjpeg-6b

libpng 1.2.31

freetype-2.3.7

expat-2.0.1

fontconfig-2.6.0

tiff-3.8.2

pkg-config 0.20

pixman-0.10.0

cairo-1.6.4

pango-1.20.5

libxml2-2.6.30

curl-7.18.2

icu4c-3.8.1

sqlite-3.6.2

openssl-0.9.8h

libgpg-error-1.6

libgcrypt-1.4.2

libxslt-1.1.24

tiff-3.8.2

WebKit-r36309

빌드를 위한 시스템 구축

Host

빌드는 Fedora 7, Fedora 10 전체설치 버전에서 테스트 하였다. 다른 시스템에서도 빌드가 가능하지만, Fedora 7을 권장한다. (Redhat 9부터 Fedora 4~Fedora 10까지 해보았지만 Fedora 7이 가장 안정적으로 크로스컴파일이 되었다.)

gpref 설치

빌드시에 gperf패키지가 필요하다. 간단히 yum을 이용하여 설치한다.

# yum –y install gperf

관련 파일 준비

빌드를 위하여 툴체인, WebKit소스, 패치등을 다운받는다. (파일이 필요하신 분은 댓글 남겨주세요~)

1. WebKit_toolchains_20090506_anw6410.tar.gz à 툴체인

2. WebKit-r36309_20090506_anw6410.tar.gz à WebKit 소스

3. cairo-1.6.4-patch.tar.gz à cairo-1.6.4 Patch

경로 설정

본 문서에서는 아래의 경로에서 작업한다.

기본 디렉토리 : /home/juncon/webkit

WebKit 소스 : /home/juncon/webkit/WebKit-r36309

라이브러리 : /home/juncon/webkit/libs

툴체인 : /opt/crosstool

빌드 prefix : /usr/local/webkit

소스 준비

# cd ~juncon

# mkdir webkit

# tar zxvf WebKit-r36309_20090506_anw6410.tar.gz –C /home/juncon/webkit

# tar zxvf WebKit_toolchains_20090506_anw6410.tar.gz –C /opt

라이브러리 빌드

라이브러리 빌드는 /home/juncon/webkit/libs에서 작업한다.

# mkdir /home/juncon/webkit/libs

# cd /home/juncon/webkit/libs

pkg-config 0.20.0 (for x86)

# wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.20.tar.gz

# tar zxvf pkg-config-0.20.tar.gz

# cd pkg-config-0.20

# ./configure --prefix=/usr/local/webkit

# make

# make install

# cd ..

환경변수 설정

이제 툴체인과 pkg-config를 사용하기 위하여 환경변수를 설정한다.

# export PATH=/usr/local/webkit/bin: /opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/bin:$PATH

# export PKG_CONFIG_PATH=/usr/local/webkit/lib/pkgconfig

which 명령어를 이용하여 PATH가 정상적으로 잡혔는지 확인한다.

# which pkg-config

/usr/local/webkit/bin/pkg-config

# which arm-linux-gcc

/opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/bin/arm-linux-gcc

zlib 1.2.3

# wget http://www.zlib.net/zlib-1.2.3.tar.gz

# tar zxvf zlib-1.2.3.tar.gz

# cd zlib-1.2.3

# CC=arm-linux-gcc RANLIB=arm-linux-ranlib AR=arm-linux-ar ./configure --prefix=/usr/local/webkit --shared

# make

# make install

# cp -au /usr/local/webkit/* /opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/armv6-vfp-linux-gnueabi/

# cd ..

Libpng 1.2.31

# wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.31.tar.gz

# tar zxvf libpng-1.2.31.tar.gz

# cd libpng-1.2.31

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

jpeg-6b

# wget http://freeware.sgi.com/source/libjpeg/libjpeg-6b.tar.gz

# tar zxvf /libjpeg-6b.tar.gz

# cd libjpeg-6b

# ./configure --prefix=/usr/local/webkit --enable-shared --enable-static --host=arm-linux

# vi Makefile

23번 라인 : CC = arm-linux-gcc

63번 라인 : AR= arm-linux-ar rc

65번 라인 : AR2= arm-linux-ranlib

# make

# make install

# cd ..

FreeType 2.3.7

# wget http://download.savannah.gnu.org/releases/freetype/freetype-2.3.7.tar.gz

# tar zxvf freetype-2.3.7.tar.gz

# cd freetype-2.3.7

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

libxml 2.6.32

# wget ftp://xmlsoft.org/libxml2/libxml2-2.6.30.tar.gz

# tar zxvf libxml2-2.6.30.tar.gz

# cd libxml2-2.6.30

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

libgpg-error-1.6

# wget ftp://ftp.ring.gr.jp/pub/net/gnupg/libgpg-error/libgpg-error-1.6.tar.bz2

# tar jxvf libgpg-error-1.6.tar.bz2

# cd libgpg-error-1.6

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

libgcrypt-1.4.1

# wget ftp://ftp.ring.gr.jp/pub/net/gnupg/libgcrypt/libgcrypt-1.4.2.tar.gz

# tar zxvf libgcrypt-1.4.2.tar.gz

# cd libgcrypt-1.4.2

# vi Makefile.in

240: tests 삭제

241: tests 삭제

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

libxslt-1.1.24

# wget ftp://xmlsoft.org/libxslt/libxslt-1.1.24.tar.gz

# tar zxvf libxslt-1.1.24.tar.gz

# cd libxslt-1.1.24

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

openssl-0.9.8h

# wget http://www.openssl.org/source/openssl-0.9.8h.tar.gz

# tar zxvf openssl-0.9.8h.tar.gz

# cd openssl-0.9.8h

Configure 파일의 325번 라인에 있는linux-elf 라인전체를 복사해 아래 굵게 표시한 부분을 수정한다.

"linux-arm", "arm-linux-gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",

# ./Configure linux-arm --prefix=/usr/local/webkit --openssldir=/usr/local/webkit no-threads no-zlib no-asm shared

Makefile을 수정한다

AR = arm-linux-ar rc

RANLIB = arm-linux-ranlib

# make

# make install

expat 2.0.1

# wget http://nchc.dl.sourceforge.net/sourceforge/expat/expat-2.0.1.tar.gz

# tar zxvf expat-2.0.1.tar.gz

# cd expat-2.0.1

# ./configure --prefix=/usr/local/webkit --host=arm-linux --without-x

# make

# make install

# cp -au /usr/local/webkit/* /opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/armv6-vfp-linux-gnueabi/

# cd ..

fontconfig 2.6.0

# wget http://fontconfig.org/release/fontconfig-2.6.0.tar.gz

# tar zxvf fontconfig-2.6.0.tar.gz

# cd fontconfig-2.6.0

# ./configure --prefix=/usr/local/webkit --host=arm-linux --without-x --with-arch=arm-unknown-linux-gnu --disable-docs

# make

# make install

# cp -au /usr/local/webkit/* /opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/armv6-vfp-linux-gnueabi/

# cd ..

tslib 1.0

# wget http://download.berlios.de/tslib/tslib-1.0.tar.bz2

# tar jxvf tslib-1.0.tar.bz2

# cd tslib-1.0

# ./autogen.sh

# ./configure --prefix=/usr/local/webkit --target=arm-linux --host=arm-linux --enable-shared CC=arm-linux-gcc

# vi config.h

#define malloc rpl_malloc 을 삭제한다.

# make

# make install

# cd ..

DirectFB 1.2.8

# wget http://www.directfb.org/downloads/Core/DirectFB-1.2.8.tar.gz

# tar zxvf DirectFB-1.2.8.tar.gz

# cd DirectFB-1.2.8

# ./configure --prefix=/usr/local/webkit --target=arm-linux --host=arm-linux --without-x --disable-osx --disable-x11 --enable-fbdev --with-gfxdrivers=none --build=i686 --with-inputdrivers=tslib,keyboard --enable-zlib

# make

# make install

# cd ..

DirectFB Examples 1.2.0

# wget http://www.directfb.org/downloads/Extras/DirectFB-examples-1.2.0.tar.gz

# tar zxvf DirectFB-examples-1.2.0.tar.gz

# cd DirectFB-examples-1.2.0

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

이제 DirectFB빌드는 끝났다. 이대로 /usr/local/webkit을 보드에 올려서 DirectFB 예제들을 실행하면 된다.

glib 2.16.5

# wget http://ftp.gnome.org/pub/gnome/sources/glib/2.16/glib-2.16.5.tar.gz

# tar zxvf glib-2.16.5.tar.gz

# cd glib-2.16.5

# vi glib-config.cache

glib_cv_long_long_format=${glib_cv_long_long_format=ll}

glib_cv_stack_grows=${glib_cv_stack_grows=no}

glib_cv_has__inline=${glib_cv_has__inline=yes}

glib_cv_has__inline__=${glib_cv_has__inline__=yes}

glib_cv_uscore=${glib_cv_uscore=no}

ac_cv_func_posix_getpwuid_r=${ac_cv_func_posix_getpwuid_r=yes}

ac_cv_func_posix_getgrgid_r=${ac_cv_func_posix_getgrgid_r=yes}

glib_cv_use_pid_surrogate=${glib_cv_use_pid_surrogate=yes}

# ./configure --prefix=/usr/local/webkit --host=arm-linux --with-threads=posix --cache-file=glib-config.cache

# make

# make install

다음 빌드시 크로스 컴파일한 glib-genmarshal이 선택되지 않도록 한다.

# mv /usr/local/webkit/bin/glib-genmarshal /usr/local/webkit/bin/glib-genmarshal_arm

# cd ..

atk-1.23.5

# wget http://ftp.gnome.org/pub/gnome/sources/atk/1.23/atk-1.23.5.tar.gz

# tar zxvf atk-1.23.5.tar.gz

# cd atk-1.23.5

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

pixman-0.10.0

# wget http://www.cairographics.org/releases/pixman-0.11.10.tar.gz

# tar zxvf pixman-0.11.10.tar.gz

# cd pixman-0.11.10

# vi Makefile.in

201: test삭제

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

cairo-1.6.4

# wget http://www.cairographics.org/releases/cairo-1.6.4.tar.gz

# tar zxvf cairo-1.6.4.tar.gz

# cd cairo-1.6.4

FTP에서 cairo-1.6.4-patch.tar.gz파일을 받는다.

# tar zxvf cairo-1.6.4-patch.tar.gz

# patch -p1 < 001-cairo_dfb-run-clipped-function.patch

# patch -p1 < 002-cairo_dfb-dest-image-clip.patch

# patch -p1 < 003-cairo_dfb-zero-box-clip-fix.patch

# patch -p1 < 004-cairo-blit-optimization.patch

# patch -p1 < 005-cairo-font-crash-fix.patch

# ./configure --prefix=/usr/local/webkit --host=arm-linux --enable-directfb=yes --enable-xlib=no --enable-xlib-xrender=no --enable-xcb=no --without-x --disable-win32

# make

# make install

# cd ..

pango-1.20.5

# wget http://ftp.gnome.org/pub/GNOME/sources/pango/1.20/pango-1.20.5.tar.gz

# tar zxvf pango-1.20.5.tar.gz

# cd pango-1.20.5

# ./configure --prefix=/usr/local/webkit --host=arm-linux --without-x --enable-cairo --disable-xlib --disable-win32

# make

# make install

# cd ..

tiff 3.8.2

# wget ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.8.2.tar.gz

# tar zxvf tiff-3.8.2.tar.gz

# cd tiff-3.8.2

# ./configure --prefix=/usr/local/webkit --host=arm-linux --without-x

# make

# make install

# cp -au /usr/local/webkit/* /opt/crosstool/gcc-4.1.1-glibc-2.5/armv6-vfp-linux-gnueabi/armv6-vfp-linux-gnueabi/

# cd ..

gtk+-2.12.11

# wget http://ftp.gnome.org/pub/gnome/sources/gtk+/2.12/gtk+-2.12.11.tar.gz

# tar zxvf gtk+-2.12.11.tar.gz

# cd gtk+-2.12.11

# vi gtk+-config.cache

ac_cv_lib_Xinerama_XineramaQueryExtension=${ac_cv_lib_Xinerama_XineramaQueryExtension=no}

# ./configure --prefix=/usr/local/webkit --host=arm-linux --without-x --with-gdktarget=directfb --cache-file=gtk+-config.cache

# make

# make install

# cd ..

이제 DirectFB기반의 Gtk+-2.0이 빌드되었습니다. 이 상태로 보드에 올려서 gtk-demo를 실행하시면 됩니다.

sqlite 3.6.2

# wget http://www.sqlite.org/sqlite-3.6.2.tar.gz

# tar zxvf sqlite-3.6.2.tar.gz

# cd sqlite-3.6.2

# ./configure --prefix=/usr/local/webkit --host=arm-linux

# make

# make install

# cd ..

curl 7.18.2

# wget http://curl.s-lines.net/download/curl-7.18.2.tar.gz

# tar zxvf curl-7.18.2.tar.gz

# cd curl-7.18.2

# vi configure

28733라인에 { (exit 1); exit 1; }; } à } 만 남기고 지운다.

# ./configure --prefix=/usr/local/webkit --host=arm-linux --with-ca-path=/usr/local/webkit/certs

# make

# make install

# cd ..

icu 3.6 for x86

icu를 컴파일 하다보면 컴파일중 생성한 tool을 이용하여 새로운 소스코드를 생성하는 과정에서 크로스 컴파일된 툴이 실행되지 못하는 오류가 있어 먼저 x86용으로 빌드한다. (디렉토리 : icu_x86)

# wget http://download.icu-project.org/files/icu4c/3.8.1/icu4c-3_8_1-src.tgz

# tar zxvf icu4c-3_8_1-src.tgz

# mv icu icu_x86

# cd icu_x86/source

# ./configure --enable-tests=no --enable-samples=no

# make

# cd ../../

icu 3.6 for arm

# tar zxvf icu4c-3_8_1-src.tgz

# cd icu/source

이전에 x86으로 빌드했던 것을 링크한다.

# ln –s ../../icu_x86/source/bin bin_x86

# vi data/icupkg.inc.in

마지막줄을 아래와 같이 변경

GENCCODE=../bin_x86/genccode

GENCMN=../bin_x86/gencmn

ICUPKG=../bin_x86/icupkg

# vi data/Makefile.in

bin_x86=../bin_x86 ß 8번째 라인에 추가

Makefile내의 BINDIR bin_x86으로 변경한다. (vi 명령 “:%s/BINDIR/bin_x86”)

# vi icudefs.mk.in

229번 라인을 아래와 같이 수정

INVOKE = $(LDLIBRARYPATH_ENVVAR)= /home/juncon/WebKit/libs/icu_x86/source/lib:$(LIBRARY_PATH_PREFIX)$(LIBDIR):$(top_bu ilddir)/stubdata:$(top_builddir)/tools/ctestfw:$$$(LDLIBRARYPATH_ENVVAR) $(LEAK_CHECKER)

# vi extra/uconv/Makefile.in

141번 라인을 아래와 같이 수정

$(INVOKE) $(PKGDATA_INVOKE_OPTS) ../../bin_x86/pkgdata -p $(MSGNAME) $(PKGDATA_OPTS) -m $(PKGMODE) -s $(RESDIR) -d $(RESDIR) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst

164번 라인을 아래와 같이 수정

$(INVOKE) ../../bin_x86/genrb -e UTF-8 -s $(^D) -d $(@D) $(^F)

# vi extra/uconv/pkgdata.inc.in

마지막 라인을 아래와 같이 수정

GENCCODE=../../bin_x86/genccode

GENCMN=../../bin_x86/gencmn

ICUPKG=../../bin_x86/icupkg

# ./configure --prefix=/usr/local/webkit --host=arm-linux --enable-tests=no --enable-samples=no

# gmake

# gmake install


WebKit 빌드

FTP에서 다운받은 WebKit의 소스가 있는 디렉토리로 이동한다.

# cd /home/juncon/WebKit/WebKit-r36309

# ./autogen.sh --prefix=/usr/local/webkit --host=arm-linux --enable-debug=no --with-target=directfb

# make

# make install

WebKit의 실행파일인 GtkLauncher는 인스톨되지 않으므로 별도로 복사한다.

# cp ./Programs/.libs/GtkLauncher /usr/local/webkit/bin


한글 지원을 위한 폰트 설정

기본적으로 한글 폰트가 없어 보드에 포팅하고 실행을 하면 한글은 깨진다. 그래서 윈도우에서 사용하고 있는 gulim.ttc파일등을 사용하도록 설정한다.

폰트는 윈도우 PC c:\windows\fonts에 있다.

# mkdir /usr/local/webkit/share/fonts

# cp ARIALUNI.TTF gulim.ttc /usr/local/webkit/share/fonts

fonts.conf 파일을 수정해 준다.

# vi /usr/local/webkit/etc/fonts/fonts.conf

26라인에

/usr/local/webkit/share/fonts
를 추가한다.

USB 만들기

본 문서에는 USB메모리를 ext3로 포멧한 후 사용하였다. 만약 mtdblock에 복사하고자 한다면 USB에 담은 결과물을 그대로 올리면 된다.

먼저 USB메모리를 ext3로 포멧한다.

USB 디바이스: /dev/sdc1

# fdisk /dev/sdc

fdisk 사용법은 man fdisk를 참조한다.

# mkfs.ext3 /dev/sdc1

# mount /dev/sdc1 /mnt/usb

/usr/local/webkit 디렉토리를 USB에 복사한다.

# cp –aR /usr/local/webkit /mnt/usb/

# cd /mnt/usb/webkit

필요없는 파일들을 삭제한다.

# find ./ -name “*.a” | xargs rm -rf

# find ./ -name “*.la” | xargs rm -rf

# find ./ -name “include” | xargs rm -rf

# find ./ -name “man” | xargs rm –rf

# cd ../../

# umount /mnt/usb

A&W6410에서 실행

이제 보드를 부팅하고 WebKit을 실행하기 위한 환경들을 설정한다. 당연히 인터넷에 접속 가능한 상태여야 한다.

ip설정

# ifconfig eth0 192.168.0.45

# route add default gw 192.168.0.1 eth0

DNS 설정

# vi /etc/resolv.conf

nameserver 210.94.0.73

WebKit 실행전 준비

# mount /dev/sda1 /mnt/usb

# cd /usr/local

# ln -s /mnt/usb/webkit

환경변수를 설정한다.

export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/webkit/lib

export PATH=/usr/local/webkit/bin:/sbin:/usr/sbin:/bin:/usr/bin

export LD_PRELOAD=/usr/lib/libts.so:/usr/lib/ts/pthres.so

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/input/event1

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_PLUGINDIR=/usr/lib/ts

WebKit 실행

# cd /usr/local/webkit/bin

만약 빌드 후 처음 실행이라면 gdk-pixbuf-query-loaders와 pango-querymodules를 실행한다.

# mkdir /usr/local/webkit/etc/pango

# ./pango-querymodules > ../etc/pango/pango.modules

# ./gdk-pixbuf-query-loaders > ../etc/gtk-2.0/gdk-pixbuf.loaders

이제 WebKit을 실행한다.

# ./GtkLauncher http://www.google.co.kr

맨처음 실행하게 되면 font를 캐쉬하는 작업을 하기 때문에 WebKit이 뜨기 까지 시간이 걸린다.

posted by linuxian lilla

댓글 없음:

댓글 쓰기