WebKit on DirectFB をARM cross compile
目的
arm-qemu&DirectFB上で動くWebブラウザを構築しようと、WebKitをクロスコンパイルした際のめも。
ネットでいろいろ調べたけど、DirectFB向けのWebKitのコンパイル情報がなかなかない。あまり需要がないのかなぁ~?
それにしてもWebKitをコンパイルするまでが非常に大変。全て終わった時の達成感は半端なかった。
他にもっと簡単にできる方法があったら、教えてほしい・・・。
使用パッケージ
WebKit on DirectFBのARMクロスコンパイルのため、今回は以下のパッケージをダウンロード。
環境変数設定
export CTARGET=arm-unknown-linux-gnueabi export CROSS=${クロスコンパイラのルートパス} export ROOTFS_DIR=$CROSS/$CTARGET/sysroot export PATH=$PATH:$CROSS/bin export PKG_CONFIG_PATH=${ROOTFS_DIR}/usr/lib/pkgconfig
glib
$tar jxvf glib-2.24.0.tar.bz2 $cd glib-2.24.0 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ glib_cv_stack_grows=no \ glib_cv_uscore=no \ ac_cv_func_posix_getpwuid_r=no \ ac_cv_func_posix_getgrgid_r=no \ ./configure \ --host=$TARGET \ --prefix=$ROOTFS_DIR/usr \ --disable-static \ --disable-selinux \ --disable-dependency-tracking $make $make install
atk
$tar xvfz atk-1.26.0.tar.gz $cd atk-1.26.0 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=$ROOTFS_DIR/usr \ --disable-static \ --disable-glibtest $make $make install
jpegsrc.v9
$tar xvfz jpegsrc.v9.tar.gz $cd jpeg-9 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --enable-shared \ --disable-static \ --prefix=${ROOTFS_DIR}/usr $make $make install
libpng
$tar xvfz libpng-1.2.50.tar.gz $cd libpng-1.2.50 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --disable-static --prefix=${ROOTFS_DIR}/usr $make $make install
freetype
$tar jxvf freetype-2.4.11.tar.bz2 $cd freetype-2.4.11 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr $make $make instal
libxml2
$tar xvfz libxml2-2.7.8.tar.gz $cd libxml2-2.7.8 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr --disable-rebuild-docs --without-debug --disable-static $make $make install
fontconfig
$tar xvfz fontconfig-2.5.0.tar.gz $cd fontconfig-2.5.0 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --enable-libxml2 \ --with-freetype-config=${ROOTFS_DIR}/usr/bin/freetype-config \ --with-arch=arm $make $make install
tiff
$tar xvfz tiff-3.8.2.tar.gz $cd tiff-3.8.2 $CC=$CTARGET-gcc CXX=$CTARGET-g++ LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr --without-x --enable-cxx
- ソースを一時修正
$vi $ROOTFS_DIR/usr/include/jmorecfg.h typedef enum { FALSE = 0 , TRUE = 1 } boolean; ↓ typedef enum { false= 0 , true= 1 } boolean;
$make $make install
giflib
$tar jxvf giflib-4.1.6.tar.bz2 $cd giflib-4.1.6 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr --without-x $make $make install
pkg-config
$tar xvfz pkg-config-0.23.tar.gz $cd pkg-config-0.23 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr --with-installed-glib $make $make install
zlib
$tar jxvf zlib-1.2.7.tar.bz2 $cd zlib-1.2.7 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --shared --prefix=${ROOTFS_DIR}/usr $make $make install
DirectFB
$tar xvfz DirectFB-1.4.1.tar.gz $cd DirectFB-1.4.1 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr \ --disable-static --disable-osx --enable-shared --disable-vnc\ --disable-sdl --disable-mmx --disable-sse \ --disable-x11 --enable-sysfs \ --enable-fbdev --enable-jpeg --enable-zlib \ --enable-png --enable-gif --enable-freetype \ --disable-libtool-lock \ --with-inputdrivers=linuxinput,keyboard,ps2mouse
- ソースを修正
$vi $ROOTFS_DIR/usr/include/jmorecfg.h typedef enum { false= 0 , true= 1 } boolean; ↓ typedef enum { FALSE = 0 , TRUE = 1 } boolean; $vi gfxdrivers/davinci/davinci_c64x.c →「#include」を追加
$make $make install
pixman
$tar xvfz pixman-0.14.0.tar.gz $cd pixman-0.14.0 $CC=$CTARGET-gcc LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ png_CFLAGS="-I$ROOTFS_DIR/usr/include/libpng12" png_LIBS="-lpng" ./configure --host=$CTARGET --prefix=${ROOTFS_DIR}/usr \ --disable-simd \ --disable-vmx --disable-static \ --disable-mmx --disable-sse2 \ --disable-gtk $make $make install
cairo
$tar xvfz cairo-1.8.6.tar.gz $cd cairo-1.8.6 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ pixman_CFLAGS="-I$ROOTFS_DIR/usr/include/pixman-1" pixman_LIBS="-lpixman-1" \ png_REQUIRES=libpng12 \ png_CFLAGS="-I$ROOTFS_DIR/usr/include/libpng12" png_LIBS="-lpng" \ directfb_CFLAGS="-I$ROOTFS_DIR/usr/include/directfb" directfb_LIBS="-ldirectfb" \ FREETYPE_CFLAGS="-I$ROOTFS_DIR/usr/include/freetype2" FREETYPE_LIBS="-lfreetype" \ FONTCONFIG_CFLAGS="-I$ROOTFS_DIR/usr/include/fontconfig" FONTCONFIG_LIBS="-lfontconfig" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --disable-xlib \ --disable-xlib-xrender \ --disable-static \ --disable-some-floating-point \ --enable-test-surfaces \ --disable-quartz \ --disable-quartz-font \ --disable-quartz-image \ --disable-win32 \ --disable-win32-font \ --disable-os2 \ --disable-beos \ --enable-png \ --enable-directfb \ --enable-ft \ --without-x \ --enable-svg $make $make install
pango
$tar jxvf pango-1.24.0.tar.bz2 $cd pango-1.24.0 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ LIBS="-lgobject-2.0 -lgmodule-2.0 -lgio-2.0" \ FONTCONFIG_CFLAGS="-I$ROOTFS_DIR/usr/include/fontconfig" FONTCONFIG_LIBS="-lfontconfig" \ FREETYPE_CFLAGS="-I$ROOTFS_DIR/usr/include/freetype2" FREETYPE_LIBS="-lfreetype" \ CAIRO_CFLAGS="-I$ROOTFS_DIR/usr/include/cairo" CAIRO_LIBS="-lcairo" \ GLIB_CFLAGS="-I$ROOTFS_DIR/usr/include/glib-2.0" GLIB_LIBS="-lglib-2.0" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --without-x $make $make install
gtk+
コンパイル時にgdk-fixbuf-csourceというコマンドがないと怒られるのでインストールする。
#yum -y install gtk2-devel
$tar jxvf gtk+-2.16.2.tar.bz2 $cd gtk+-2.16.2 $gio_can_sniff=no \ CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --with-gdktarget=directfb \ --without-xinput \ --with-libpng \ --with-libjpeg \ --with-libtiff \ --without-libjasper \ --without-x \ --enable-debug=yes $make $make install
libxslt
$tar xvfz libxslt-1.1.24.tar.gz $cd libxslt-1.1.24 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --disable-static xml2-configというコマンドが使用され、configureで失敗するので、以下のパッケージを追加 #yum -y install libxml2 libxml2-devel $make 失敗する。「xmlDebugDumpNode」や「xmlXPathDebugDumpObject」がないと言われる。 そもそもlibxml2はwithout-debugオプションを付けてコンパイルしているので、debug系の関数 がないし、includeにも「LIBXML_DEBUG_ENABLED」スイッチがOFFになっているのに、コンパイル 時はホスト側の/usr/includeの方が参照され、スイッチがONにされる見たい。 いろいろオプションを試してみたが、なぜか/usr/includeが参照される。 強制的にdebug関数を参照している箇所をコメントアウトして対応。 [LIBXML_DEBUG_ENABLED]を検索し、該当箇所を全てコメントアウト $make $make install
gperf
$tar xvfz gperf-3.0.4.tar.tar $cd gperf-3.0.4 $ CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --disable-static $make $make install
icu4c
$tar xvfz icu4c-4_4_2-src.gz ・一部ソースを修正する。 --------------------------------------------------------------- icu/source/tools/toolutil/pkg_genc.c } assemblyHeader[] = { {"gcc", ".globl %s\n" - "\t.section .note.GNU-stack,\"\",@progbits\n" + "\t.section .note.GNU-stack,\"\",%%progbits\n" "\t.section .rodata\n" "\t.align 8\n" /* Either align 8 bytes or 2^8 (256) bytes. 8 bytes is needed. */ - "\t.type %s,@object\n" + "\t.type %s,%%object\n" "%s:\n\n", ".long ","",HEX_0X ------------------------------------------------------------------- 次にhost用とtarget用とビルドフォルダを作成する。 $mkdir -p icu_build1 icu_build2 ・ホスト側のコンパイル $cd icu_build1 $../icu/source/runConfigureICU Linux $make ・ターゲット側のコンパイル $cd icu_build2 $AR=$CTARGET-ar \ CC=$CTARGET-gcc \ CPP=$CTARGET-cpp \ CXX=$CTARGET-g++ \ RUNLIB=$CTARGET-runlib \ LD=$CTARGET-ld \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ../icu/source/configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --disable-static \ --with-cross-build=/home/xappuser/opensource/webkit/icu_build1 $make $make install
libsoup
$tar jxvf libsoup-2.26.0.tar.bz2 $cd libsoup-2.26.0 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --without-gnome \ --disable-static \ --disable-glibtest $make $make install
sqlite-autoconf
$tar xvfz sqlite-autoconf-3080002.tar.gz $cd sqlite-autoconf-3080002 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ ./configure \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr $make $make install
WebKit
そして最後のWebKit。
でもこれも一筋縄にはいかなかった・・・。
- bisonのダウングレード
bison2.4だと問題が発生する為、2.3にダウングレードする。
#yum remove bison #wget http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2 #tar jxvf bison-2.3.tar.bz2 #./configure #make; make install #ln -s /usr/local/bin/bison /usr/bin/bison
- 本体のコンパイル
$tar jxvf WebKit-r35620.tar.bz2 $cd WebKit-r35620 $CC=$CTARGET-gcc \ LDFLAGS="-L$ROOTFS_DIR/usr/lib" \ CPPFLAGS="-I$ROOTFS_DIR/usr/include" \ UNICODE_CFLAGS="-I$ROOTFS_DIR/usr/includ" \ UNICODE_LIBS="-licudata -licui18n -licuio -licule -liculx -licutest -licutu -licuuc" \ ./autogen.sh \ --host=$CTARGET \ --prefix=${ROOTFS_DIR}/usr \ --with-target=directfb \ --with-http-backend=soup \ --with-font-backend=pango \ --disable-video $make
いろいろエラーが発生し、その都度修正
- configureの修正
UNICODE_CFLAGSが入力された時はicu-configチェックしないようにする。
$vi configure if test "$unicode_backend" = "icu"; then if test "$os_darwin" = "yes"; then UNICODE_CFLAGS="-I\$(srcdir)/JavaScriptCore/icu -I\$(srcdir)/WebCore/icu" UNICODE_LIBS="-licucore" elif test "$os_win32" = "yes"; then UNICODE_CFLAGS="" UNICODE_LIBS="-licuin -licuuc" else + if test "x$UNICODE_CFLAGS" = "x" -o "x$UNICODE_LIBS" = "x"; then : : : + fi fi
- コンパイルエラーによるソース修正①
$vi WebCore/platform/text/TextBreakIterator.h - class TextBreakIterator; + typedef struct UBreakIterator TextBreakIterator;
- コンパイルエラーによるソース修正②
$vi ${ROOTFS_DIR}/usr/include/jmorecfg.h //typedef enum { FALSE = 0, TRUE = 1 } boolean; ↓ typedef unsigned char boolean;
- コンパイルエラーによるソース修正③
$vi WebKitTools/DumpRenderTree/gtk/LayoutTestControllerGtk.cpp →include文を追加 #include <stdio.h> #include <stdlib.h>
コンパイルが終わったら、インストール $make install
これでWebKitのコンパイルが完了!
WebKit-r35620/Programs/.lib/GtkLauncharというプログラムが作成されていて、こいつをARM環境で叩けばブラウザが立ち上がるっぽい。
実動作はまた今度。