keropoの備忘録

しらべたことをメモるブログ

WebKit on DirectFB をARM cross compile

目的

arm-qemu&DirectFB上で動くWebブラウザを構築しようと、WebKitをクロスコンパイルした際のめも。
ネットでいろいろ調べたけど、DirectFB向けのWebKitコンパイル情報がなかなかない。あまり需要がないのかなぁ~?
それにしてもWebKitコンパイルするまでが非常に大変。全て終わった時の達成感は半端なかった。
他にもっと簡単にできる方法があったら、教えてほしい・・・。

使用パッケージ

WebKit on DirectFBのARMクロスコンパイルのため、今回は以下のパッケージをダウンロード。

パッケージ URL
atk-1.26.0 http://ftp.gnome.org/pub/gnome/sources/atk/1.26/atk-1.26.0.tar.gz
cairo-1.8.6 http://cairographics.org/releases/cairo-1.8.6.tar.gz
DirectFB-1.4.1 http://directfb.org/downloads/Core/DirectFB-1.4/DirectFB-1.4.1.tar.gz
expat-2.1.0 http://downloads.sourceforge.net/expat/expat-2.1.0.tar.gz
fontconfig-2.5.0 http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.5.0.tar.gz
freetype-2.4.11 http://downloads.sourceforge.net/freetype/freetype-2.4.11.tar.bz2
giflib-4.1.6 http://sourceforge.net/projects/giflib/files/giflib-4.x/giflib-4.1.6/giflib-4.1.6.tar.bz2
glib-2.24.0 http://ftp.gnome.org/pub/gnome/sources/glib/2.24/glib-2.24.0.tar.bz2
gperf-3.0.4 http://ftp.gnu.org/pub/gnu/gperf/gperf-3.0.4.tar.gz
gtk+-2.16.2 http://ftp.gnome.org/pub/gnome/sources/gtk+/2.16/gtk+-2.16.2.tar.bz2
jpegsrc.v9 http://www.ijg.org/files/jpegsrc.v9.tar.gz
libpng-1.2.50 http://download.sourceforge.net/libpng/libpng-1.2.50.tar.gz
libsoup-2.26.0 http://ftp.gnome.org/pub/gnome/sources/libsoup/2.26/libsoup-2.26.0.tar.bz2
libtool-2.2.2 http://ftp.gnu.org/gnu/libtool/libtool-2.2.2.tar.bz2
libxml2-2.7.8 http://xmlsoft.org/sources/libxml2-2.7.8.tar.gz
libxslt-1.1.24 http://xmlsoft.org/sources/libxslt-1.1.24.tar.gz
pango-1.24.0 http://ftp.gnome.org/pub/gnome/sources/pango/1.24/pango-1.24.0.tar.bz2
pixman-0.14.0 http://cairographics.org/releases/pixman-0.14.0.tar.gz
pkg-config-0.23 http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz
sqlite-autoconf-3080002 http://www.sqlite.org/2013/sqlite-autoconf-3080002.tar.gz
icu4c-4_4_2 http://download.icu-project.org/files/icu4c/4.4.2/icu4c-4_4_2-src.tgz
tiff-3.8.2 http://download.osgeo.org/libtiff/tiff-3.8.2.tar.gz
WebKit-r35620 http://builds.nightly.webkit.org/files/trunk/src/WebKit-r35620.tar.bz2

事前にインストールしたパッケージ

  yum -y install gettext
  yum -y install gettext-libs

環境変数設定

  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

gtk+コンパイル

  $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環境で叩けばブラウザが立ち上がるっぽい。
実動作はまた今度。