您的位置:首页 > 其它

Cross-compiling GTK+ over DirectFB

2011-08-29 09:52 330 查看
This guide explains how to cross-compile GTK+ over DirectFB.

Intro

This guide is based in the wiki
GTK on DirectFB for Embedded Systems from the
DirectFB site, but it uses the latest packages available to this date. Since this procedure has some unstable packages and is still experimental, it’s not in the mentioned wiki. Hopefully, once this procedure becomes stable, the wiki will be updated.

I tested this procedure in a STMicroelectronics ST40 processor (SH architecture). If you’re using this processor, this is the configuration I have:

Board: STB7109 cut 3.0, also called cocoref_gold_7109
Linux distribution: STLinux 2.2
ST drivers and API: STFAE A16

Warnings

This documentation assumes you already have DirectFB install in $PREFIX/usr. Change it accordingly to your installation.

This documentation is still a work in progress, some steps of this procedure could be useless, ugly and/or dangerous. In order to make this procedure easier, it might be that there is the need of some patches.

The autotools are not very user-friendly when cross-compiling, thus, several configure files and Makefile (that are generated by the autotools) have to be edited by hand.

This procedure uses unstable or development versions of some packages like Glib and Cairo. However, the procedure should be the same for the latest stable release.

GTK+ and all the packages underneath need a considerable amount of space and processor. If your embedded device provides a hard-drive/compact-flash and supports hardware accelerated graphics you can use GTK+ without problems.

Requirements

Typically, when developing applications for an embedded system a cross-toolchain is needed. If you already have a cross-toolchain you don’t have to worry about building it yourself. Otherwise, a well known resource for building one is
http://www.kegel.com/crosstool

When developing for embedded systems, there are very few Linux distributions or packages that contain all the required software for building GTK+, therefore you have to build everything from scratch.

The order in which the packages are compiled is important since some of them won’t compile without the others. The packages, their versions and the order used for building GTK+ are the following:

Glib from git repository 15/02/08
atk-1.20.0
freetype-2.3.5
zlib-1.2.3
libxml2-2.6.30
fontconfig-2.5.0
libpng-1.2.24
Pixmap from git repository 15/02/08
Cairo from git repository 15/02/08
pango-1.19.2
gtk+-2.12.3

Environment configuration

Suppose that the libraries will be installed in /opt/gtkdfb/usr/local (may be /opt/gtkdfb is the root fs of your embedded target) and that the cross-toolchain (compiler, linker…) is in your path.

Set the following environment variables that will make our life easier:

$ export PREFIX=/opt/gtkdfb/usr/local

$ export LD_LIBRARY_PATH=$PREFIX/lib

$ export PKG_CONFIG_PATH=$LD_LIBRARY_PATH/pkgconfig

$ export COMPILER=sh4-linux-gcc

$ export HOST=sh4-linux

$ export BUILD=i386-linux

$ export STRIP=sh4-linux-strip


Building GTK+ and its requirements

Glib

Edit the “configure” file:

Search for the texts “cannot run test program while cross compiling” and “cross-compiling”. Remove the following code that appears a couple of lines below the searched texts:

{ (exit 1); exit 1; };

Compile and install:

$ CC=$COMPILER ./configure –build=$BUILD –host=$HOST –prefix=$PREFIX \

–disable-selinux –disable-fam –disable-largefile –enable-debug=no –disable-gtk-doc \

–disable-man

$ make

$ make install


Atk

Compile and install:

$ CC=$COMPILER ./configure –host=$HOST –build=$BUILD –prefix=$PREFIX \

–disable-glibtest –disable-gtk-doc

$ make

$ make install


Freetype

Compile and install:

$ CC=$COMPILER ./configure –host=$HOST –build=$BUILD –prefix=$PREFIX

$ make

$ make install


Zlib

Compile and install:

$ CC=$COMPILER ./configure –prefix=$PREFIX –shared

$ make

$ make install


libxml2

Compile and install:

$ CC=$COMPILER ./configure –host=$HOST –build=$BUILD –prefix=$PREFIX \

–without-debug

$ make

$ make install


Fontconfig

Change the value of the flag –with-arch according to your architecture.

Compile and install:

$ CC=$COMPILER ./configure –build=$BUILD –host=$HOST –prefix=$PREFIX \

–with-freetype-config=$PREFIX/bin/freetype-config \

–enable-libxml2 –with-arch=sh4 –disable-docs

$ make

$ make install


libpng

Edit the “configure” file:

Set to ‘yes’ the following variable:

ac_cv_lib_z_zlibVersion=yes

Compile and install:

$ CC=$COMPILER ./configure –host=$HOST –build=$BUILD –prefix=$PREFIX

$ make

$ make install


Pixman

Compile and install:

$ CC=$COMPILER ./autogen.sh –host=$HOST –build=$BUILD –prefix=$PREFIX

$ make

$ make install


Cairo

Compile and install:

$ CC=$COMPILER \

directfb_CFLAGS=”-I$PREFIX/../include/directfb” \

directfb_LIBS=”$PREFIX/../lib/libdirectfb.so \

$PREFIX/../lib/libdirect.so \

$PREFIX/../lib/libfusion.so” \

png_CFLAGS=”-I$PREFIX/include” \

png_LIBS=$PREFIX/lib/libpng12.so \

FONTCONFIG_CFLAGS=”-I$PREFIX/include/fontconfig” \

FONTCONFIG_LIBS=$PREFIX/lib/libfontconfig.so \

FREETYPE_CFLAGS=”-I$PREFIX/include/freetype2″ \

FREETYPE_LIBS=$PREFIX/lib/libfreetype.so \

./configure –host=$HOST –build=$BUILD –prefix=$PREFIX \

–enable-directfb=yes –without-x –disable-xlib –disable-xlib-xrender \

–disable-win32 –enable-pdf=no –enable-ps=no –enable-png

$ make

$ make install


Pango

Configure:

$ CC=$COMPILER \

GLIB_CFLAGS=”-I$PREFIX/include/glib-2.0 \

-I$PREFIX/lib/glib-2.0/include” \

GLIB_LIBS=”$PREFIX/lib/libglib-2.0.so \

$PREFIX/lib/libgmodule-2.0.so \

$PREFIX/lib/libgobject-2.0.so \

$PREFIX/lib/libfontconfig.so \

$PREFIX/lib/libxml2.so \

$PREFIX/lib/libfreetype.so” \

CAIRO_CFLAGS=”-I$PREFIX/include/cairo” \

CAIRO_LIBS=$PREFIX/lib/libcairo.so \

FONTCONFIG_CFLAGS=”-I$PREFIX/include/fontconfig” \

FONTCONFIG_LIBS=$PREFIX/lib/libfontconfig.so \

FREETYPE_CFLAGS=”-I$PREFIX/include/freetype2″ \

FREETYPE_LIBS=$PREFIX/lib/libfreetype.so \

FREETYPE_CONFIG=$PREFIX/bin/freetype-config \

./configure –host=$HOST –build=$BUILD –prefix=$PREFIX \

–without-x


Edit the examples/Makefile:

Add to the GLIB_LIBS variable the following:

/opt/gtkdfb/usr/local/lib/libpng12.so \

/opt/gtkdfb/usr/lib/libdirectfb.so \

/opt/gtkdfb/usr/lib/libdirect.so \

/opt/gtkdfb/usr/lib/libfusion.so


Edit the tests/Makefile:

Set the LIBS variables to the following value:

LIBS = $(GLIB_LIBS)

Compile and install:

$ gmake

$ gmake install


GTK+

Configure:

$ CC=$COMPILER \

BASE_DEPENDENCIES_CFLAGS=”-I$PREFIX/include \

-I$PREFIX/lib/glib-2.0/include -I$PREFIX/include/glib-2.0 \

-I$PREFIX/include/pango-1.0 \

-I$PREFIX/include/cairo \

-I$PREFIX/include/atk-1.0″ \

BASE_DEPENDENCIES_LIBS=”-L$PREFIX/lib \

$PREFIX/lib/libglib-2.0.so \

$PREFIX/lib/libgobject-2.0.so $PREFIX/lib/libgmodule-2.0.so \

$PREFIX/lib/libfontconfig.so $PREFIX/lib/libxml2.so” \

GLIB_CFLAGS=”-I$PREFIX/include \

-I$PREFIX/lib/glib-2.0/include \

-I$PREFIX/include/glib-2.0″ \

GLIB_LIBS=”-L$PREFIX/lib \

$PREFIX/lib/libglib-2.0.so \

$PREFIX/lib/libgobject-2.0.so \

$PREFIX/lib/libgmodule-2.0.so \

$PREFIX/lib/libfontconfig.so \

$PREFIX/lib/libxml2.so” \

PANGO_CFLAGS=”-I$PREFIX/include/pango-1.0″ \

PANGO_LIBS=”-L$PREFIX/lib \

$PREFIX/lib/libpango-1.0.so \

$PREFIX/lib/libpangoft2-1.0.so \

$PREFIX/lib/libpangocairo-1.0.so” \

GDK_DEP_CFLAGS=”-pthread -I$PREFIX/include/glib-2.0 \

-I$PREFIX/lib/glib-2.0/include \

-I$PREFIX/include/pango-1.0 \

-I$PREFIX/include/cairo \

-I$PREFIX/include \

-D_REENTRANT -D_GNU_SOURCE \

-I$PREFIX/../include \

-I$PREFIX/../include/directfb” \

GDK_DEP_LIBS=”-L$PREFIX/lib -lpthread -ldl -lpangocairo-1.0 \

-lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lpng12 -lm \

$PREFIX/../lib/libdirectfb.so \

$PREFIX/../lib/libdirect.so \

$PREFIX/../lib/libfusion.so” \

GDK_PIXBUF_DEP_CFLAGS=”-pthread -I$PREFIX/include/glib-2.0 \

-I$PREFIX/lib/glib-2.0/include \

-I$PREFIX/include \

-I$PREFIX/../include” \

GDK_PIXBUF_DEP_LIBS=”-L$PREFIX/lib \

-lgmodule-2.0 -ldl -lgobject-2.0 -lglib-2.0 -lpng12 -lm” \

GTK_DEP_CFLAGS=”-pthread -I$PREFIX/include/glib-2.0 \

-I$PREFIX/lib/glib-2.0/include \

-I$PREFIX/include/pango-1.0 \

-I$PREFIX/include/cairo \

-I$PREFIX/include -D_REENTRANT -D_GNU_SOURCE \

-I$PREFIX/../include/directfb \

-I$PREFIX/include/atk-1.0 \

-I$PREFIX/../include” \

GTK_DEP_LIBS=”-L$PREFIX/lib \

-lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lgobject-2.0 -lgmodule-2.0 \

-ldl -lglib-2.0 -lcairo -lpng12 -lm \

$PREFIX/../lib/libdirectfb.so \

$PREFIX/../lib/libdirect.so \

$PREFIX/../lib/libfusion.so” \

GDK_EXTRA_CFLAGS=”-I$PREFIX/../include” \

GDK_EXTRA_LIBS=”-L$PREFIX/../lib -lz -lpthread -ldl \

$PREFIX/../lib/libdirectfb.so \

$PREFIX/../lib/libdirect.so \

$PREFIX/../lib/libfusion.so” \

./configure \

–host=$HOST \

–build=$BUILD \

–prefix=$PREFIX \

–with-gdktarget=directfb \

–without-libtiff \

–disable-glibtest \

–disable-largefile \

–disable-modules \

–with-included-loaders=gif,jpeg,png,xpm


Dangerous/ugly step:

GTK needs a cairo-pdf/ps printing support for compiling, but it’s unlikely that PDF/PS will be needed in an embedded system. There is no flag to compile it without this setting. There are some patches in development to solve this issue, meanwhile it was
compiled without the cairo-pdf support by doing the following very ugly and dangerous step. If you want to add to add PDF/PS support you can try
Poppler.

Edit the files:

gtk/gtkprintoperation.c
gtk/gtkprintoperation-unix.c
modules/printbackends/lpr/gtkprintbackendlpr.c
modules/printbackends/file/gtkprintbackendfile.c

Comment the lines in all these files that contains the following includes or function calls:

#include <cairo-pdf.h>

#include <cairo-ps.h>

cairo_pdf_surface_set_size()

cairo_pdf_surface_create()

cairo_ps_surface_create_for_stream()


Compile and install:

$ make

$ make install


That’s it.

Keep in mind that this procedure is still experimental and uses unstable versions of Glib and Cairo. In fact, with a stable version of Cairo, there’s no need for compiling Pixman because it’s already included in Cairo.

Any help, suggestions and/or ideas are welcome.

BTW:http://www.paguilar.org/blog/?cat=4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: