directfb+gtk+webkit在arm上的移植

directfb+gtk+webkit在arm上的移植
最近在tcc8900(arm11)平臺上移植了一下webkit瀏覽器(gtk),花了近兩天時間,大部分時間都給編譯各種依賴的庫給耗費了,特記錄一下,以備後來者參考。
atk-1.30.0    fontconfig-2.8.0  gtk+-2.16.0  libsoup-2.30.2  pango-1.28.0   webkit-1.3.3  zlib-1.2.3    DirectFB-1.4.5  freetype-2.3.9  jpeg-6b 
libxml2-2.7.7 cairo-1.8.10  enchant-1.6.0 glib-2.24.0       icu4c-3_8_1
libpng-1.2.39  pixman-0.18.2

1.首先設置下環境變量,並且考慮好在開發板上的存儲路徑
比如我用sd卡存儲測試,我就把編譯的程序和庫安裝到/mnt/SD目錄,然後把文件複製到sd,再把sd卡掛載到板子的/mnt/SD目錄,這樣不用來回變換運行時需要設置的環境變量
在臺式機上操作:
#ln -s /home/qwdu/8900/webkit/deplib /mnt/SD
#cd /mnt/SD
#vi setenv.sh
#!/bin/sh
export CC="/opt/armv6/codesourcery/bin/arm-linux-gcc"
export CXX="/opt/armv6/codesourcery/bin/arm-linux-g++"
export RANLIB="/opt/armv6/codesourcery/bin/arm-linux-ranlib"
export AR="/opt/armv6/codesourcery/bin/arm-linux-ar"
export LD="/opt/armv6/codesourcery/bin/arm-linux-ld"
export STRIP="/opt/armv6/codesourcery/bin/arm-linux-strip"

export PREFIX=`pwd`
export PATH=$PATH:$PREFIX/bin
export C_INCLUDE_PATH=$PREFIX/include
export LD_LIBRARY_PATH=$PREFIX/lib
export PKG_CONFIG_PATH=$LD_LIBRARY_PATH/pkgconfig
export LDFLAGS=-L$LD_LIBRARY_PATH
export CFLAGS=-I$PREFIX/include
#source ./setenv.sh

2.開始編譯
jpeg-6b
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux --enable-static --enable-shared --prefix=$PREFIX
make;make install

libpng-1.2.39
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux --enable-static --enable-shared --prefix=$PREFIX
make;make install

freetype-2.3.9
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux --enable-static --enable-shared --prefix=$PREFIX
make;make install

pixman-0.18.2
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX
make;make install

enchant-1.6.0
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX
make;make install

DirectFB-1.4.5
./configure -host=arm-linux --prefix=$PREFIX --with-gfxdrivers=none --enable-sdl=no  --disable-x11 "CFLAGS=-I$PREFIX/include" "LIBS=-L$PREFIX/lib -lz -ljpeg"
make;make install

libxml2-2.7.7
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX
make;make install

fontconfig-2.8.0
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --enable-libxml2 --with-arch=arm
make;make install

icu4c-3_8_1
這個比較特殊,先編譯一個pc版本,然後把bin目錄重命名爲bin-host,再交叉編譯
./configure
make
mv bin bin-host
mv lib lib-host
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX
make;make install
cp config/icu-config /mnt/SD/bin

glib-2.24.0
export ARCH=arm
echo ac_cv_type_long_long=yes>>$ARCH-linux.cache
echo glib_cv_stack_grows=no>>$ARCH-linux.cache
echo glib_cv_uscore=no>>$ARCH-linux.cache
echo c_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux --enable-shared --prefix=$PREFIX --cache-file=$ARCH-linux.cache
make;make install

cairo-1.8.10
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --enable-directfb=yes --without-x --disable-xlib --disable-xlib-xrender --disable-win32 --enable-png
make;make install

pango-1.28.0
export CAIRO_CFLAGS="-fno-strict-aliasing -I$PREFIX/include/cairo -I$PREFIX/include/fontconfig -I$PREFIX/include -I$PREFIX/include/pixman-1 -I$PREFIX/include/freetype2 -I$PREFIX/include/libpng12"
export CAIRO_LIBS="-L$PREFIX/lib -lcairo"
export GLIB_CFLAGS="-I$PREFIX/include -I$PREFIX/include/glib-2.0 -I$PREFIX/lib/glib-2.0/include"
export GLIB_LIBS="-L$PREFIX/lib -lgobject-2.0 -lgmodule-2.0 -lglib-2.0"
export FONTCONFIG_CFLAGS="-I$PREFIX/include/fontconfig -I$PREFIX/include"
export FONTCONFIG_LIBS="-L$PREFIX/lib -lfontconfig"
export FREETYPE_CFLAGS="-I$PREFIX/include/freetype2 -I$PREFIX/include"
export FREETYPE_LIBS="-L$PREFIX/lib -lfreetype -lz"
export FREETYPE_CONFIG="${PREFIX}/bin/freetype-config"
export CAIRO_PREFIX=$PREFIX
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --without-x
make;make install

libsoup-2.30.2
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --without-gnome --with-libgcrypt-prefix=/home/qwdu/8900/webkit/deplib --disable-ssl --without-apache-httpd
make;make install
因爲我主機上安裝了libgcrypt-dev,不想讓他找到,估計設置一個目錄,讓他找不到

atk-1.30.0
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --disable-glibtest
make;make install

gtk+-2.16.0
echo gio_can_sniff=yes >arm-linux.cache
export BASE_DEPENDENCIES_LIBS="-L$PREFIX/lib -lpangocairo-1.0 -lpango-1.0 -lcairo -ljpeg -lpng12 -lpangoft2-1.0"
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --with-gdktarget=directfb --without-libtiff --disable-glibtest --disable-largefile --with-included-loaders=jpeg,gif,png,xpm --without-libjasper --without-x --enable-debug=no --cache-file=arm-linux.cache --disable-cups
make;make install

webkit-1.3.3
./configure  --build=i686-pc-linux --host=arm-linux --target=arm-linux  --enable-shared --prefix=$PREFIX --with-target=directfb --disable-datalist --disable-ruby --disable-sandbox --disable-video --disable-xslt  --disable-dom-storage --disable-offline-web-applications --disable-channel-messaging --disable-database --disable-eventsource  --disable-icon-database
make;make install

3.遇到的問題以及解決方法
icu編譯,請先下載icu-cross-compile.patch
文件: icu-cross-compile.rar
大小: 3KB
下載: 下載
在編譯icu之前打上補丁(patch -p0<icu-cross-compile.patch)

pango編譯出錯,運行下面命令:
cd pango
perl -pi -e 's//@ENUMPREFIX/@/PANGO/g' pango-enum-types.h
cd ..

gtk編譯出錯,請按照下面方法修改
(1)configure階段找不到pango,明明pango已經編譯安裝,打開config.log,發現鏈接庫依賴出錯,做如下修改:
方法一:
vi configure:
----PANGO_PACKAGES="pango pangocairo
++++PANGO_PACKAGES="pango pangocairo pangoft2 pixman-1 directfb libxml-2.0 libpng"
方法二:
export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"

(2)編譯階段出錯
perl -pi -e 's//@ENUMPREFIX/@/GDK/g' gdk-pixbuf/gdk-pixbuf-enum-types.h
perl -pi -e 's//@ENUMPREFIX/@/GDK/g' gdk/gdkenumtypes.h
perl -pi -e 's//@ENUMPREFIX/@/GTK/g' gtk/gtktypebuiltins.h

webkit編譯出錯
請對照下面的patch修改,具體行數可能不一樣,不能直接patch,需要手工一步一步修改
文件: webkit-directfb.rar
大小: 6KB
下載: 下載

編譯過程中出現
DerivedSources/WebCore/JSDOMWindow.cpp:330:26: error: JSTimeRanges.h: No such file or directory
請到DerivedSources/WebCore/JSDOMWindow.cpp文件330行,註釋這一句即可

到開發板上的操作
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$/mnt/SD/lib
#mkdir /mnt/SD/etc/pango
#pango-querymodules > /mnt/SD/etc/pango/pango.modules
#gdk-pixbuf-query-loaders > /mnt/SD/etc/gtk-2.0/gdk-pixbuf.loaders

#mkdir /mnt/SD/share/fonts
#複製一個矢量字體文件到/mnt/SD/share/fonts,比如文泉譯字體wqy-microhei.ttc
修改一下字體配置路徑
#vi /mnt/SD/etc/fonts/fonts.conf
<!-- Font directory list -->
<dir>/mnt/SD/share/fonts</dir>
 
一般arm上的移植到此就可結束,運行GtkLauncher,應該沒有問題

但是我用的tcc8900平臺需要直接高清分辨率1080p顯示,而且framebuffer默認輸出模式是yuv,還要做一些修改
systems/fbdev/fbdev.c
dfb_pixelformat_name(config->format), shared->fix.line_length );
這裏改成
dfb_pixelformat_name(config->format), var.xres*2 );
這裏var.yres_virtual * shared->fix.line_length );改成
var.yres_virtual * var.xres*2 );

//     if (config->format == DSPF_RGB332)
//          dfb_fbdev_set_rgb332_palette();
//     else
//          dfb_fbdev_set_gamma_ramp( config->format );
這三行註釋,否則運行directfb相關程序內核直接崩潰,好像是調色板那個fb的ioctl沒支持

在open fb之後加入
        int color = IMGFMT_RGB565;
        int on=1;
        ioctl(dfb_fbdev->fd, TCC_LCD_FB_IOCTL_SET_FORMAT, &color);
        ioctl(dfb_fbdev->fd, TCC_LCD_FB_IOCTL_DISP_ONOFF,&on);


systems/fbdev/fbdev_surface_pool.c
lock->pitch  = shared->fix.line_length;
這裏改成
lock->pitch  = surface->config.size.w*2;

編譯之後替換板子上的/mnt/SD/lib/directfb-1.4-5/systems/libdirectfb_fbdev.so
最後關閉fb1,fb2,運行GtkLauncher,終於正常運行


部分patch參考此網站
https://www.tuxbuilder.org/websvn/listing.php?repname=Tuxbuilder&path=%2Ftuxbuilder%2Ftrunk%2Fcross%2Fdirectfb%2F&rev=0&sc=1


發佈了35 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章