porting gtk on arm

声明:本文详细阐述了GTK+DFB在TI OMAP上面的移植过程,期间参考文档如下:
http://blog.sina.com.cn/s/blog_7e6c13550100xtju.html
http://bbs.chinaunix.net/thread-1964087-1-1.html
http://blog.csdn.net/chinalmy/article/details/2781916

构建TI OMAP 下的GTK+DFB开发环境

有过移植经验的人都知道,就算是拿着上面的教程按部就班地去做,也可能会因主机的系统差异,环境变量以及一系列地依赖关系而产生不可预知地结果,我本人按照网上的教程移植了3个不同版本的,现在把当初移植的心得和各个版本的用户体验表述如下:

平台环境:

  1. 主机系统:ubuntu10.04
  2. 目标板: TI OMAP3530
  3. 编译器: arm-none-linux-gnueabi-gcc-4.2.1

软件包的选择

linux软件包相互依赖性比较强,不建议大家改变软件包的版本,若想对其升级,请大家好好阅读各个软件包的依赖声明,软件包的具体功能见附录一,我的推荐配置如下:
核心软件包:

  1. glib-2.19.0
  2. atk-1.24.0
  3. pango-1.20.2
  4. DirectFB-1.3.0
  5. cairo-1.8.4
  6. gtk+-2.12.9

功能增强软件包:

  1. tslib-1.4
  2. jpegsrc.v6b
  3. libpng-1.2.44
  4. expat-2.0.1
  5. fontconfig-2.6.0
  6. freetype-2.3.7
  7. libxml2-2.6.31
  8. pixman-0.12.0
  9. zlib-1.2.3

软件包的依赖关系

为什么我们要搞清楚软件包的依赖关系呢?大家想一想,如果软件包A的编译需要软件包B的库支持,那么我们肯定需要先编译好软件包B。因此,当我们编译以上15个软件包时,编译顺序就直接影响成败。

软件包 依赖
glib
atk glib
pango glib,fontconfig,cairo
DirectFB freetype,jpegsrc, libpng,zlib,expat,libxml
cairo freetype,zlib
gtk+ atk,cairo,jpegsrc,libpng,pkg-config,

建立软件包安装目录

我们需要建立一个目录来安装我们编译好的软件包,建议统一存放,这样,当我们编译应用程序或者是在目标板上运行交叉编译好的程序时,会省去很多麻烦,例如:假设我们在PC主机上把编译好的软件包都安装在/home/gtkdfb目录下,这样我们就推荐把PC主机上的/home/gtkdfb目录通过NFS挂载到目标板的/home/gtkdfb目录下(对于目标板存储空间足够的,也可以直接拷贝过去),此时,我们在目标板上运行交叉编译好的应用程序时,程序会默认去安装目录寻找所需的动态库。否则的话,我们还必须把库路径加入到目标板的环境变量里去。NFS挂载方法见我另外一篇博客:http://oldboys.sinaapp.com/qrs/transplant/nfs.html

  1. 建立安装目录和路径
    view source
    print?
    1 # mkdir /home/gtkdfb           
    2 # export PREFIX=/home/gtkdfb            安装路径
    3 # export LDFLAGS=-L$PREFIX/lib          arm 环境连接库路径
    4 # export CFLAGS=”-g –I$PREFIX/include”  arm 环境头文件路径
    5 # export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig   arm 环境pkgconfig配置文件路径
  2. 交叉编译tslib
    view source
    print?
    1 # ./autogen.sh
    2 # echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
    3 # CC= arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache     注:CC路径需要填写绝对路径
    4 # make
    5 # make install
  3. 交叉编译glib-2.19.0
    view source
    print?
    1 # echo ac_cv_type_long_long=yes>arm-linux.cache
    2 # echo glib_cv_stack_grows=no>>arm-linux.cache
    3 # echo glib_cv_uscore=no>>arm-linux.cache
    4 # echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
    5 # CC=arm-none-linux-gnueabi-gcc  ./configure --host=arm-linux --build=i686-pc-linux --prefix=$PREFIX --cache-file=arm-linux.cache
    6 # make
    7 # make install
  4. 交叉编译atk
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
    2 # make
    3 # make install
  5. 交叉编译jpeg-6b
    view source
    print?
    01 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    02 # vi Makefile 修改生成的Makefile文件
    03   # library (.a) file creation command
    04   AR= ar rc 该成 AR= arm-none-linux-gnueabi-ar rc (填写自己交叉编译器的绝对路径)
    05   # second step in .a creation (use "touch" if not needed))
    06   AR2= ranlib 该成 AR2=arm-none-linux-gnueabi-ranlib (同上)
    07 # mkdir $PREFIX/man
    08 # mkdir $PREFIX/man/man1
    09 # make
    10 # make install
    11 # make install-lib
    12 注:若编译出错
    13 make: ./libtool: Command not found
    14 make: *** [jcapimin.lo] Error 127
    15 这是由于缺少2个关键文件造成的,还好我们的系统里面有,现在我们去把他们拷贝过来,请按如下操作:
    16 # cp /usr/share/libtool/config/config.sub ./
    17 # cp /usr/share/libtool/config/config.guess ./
    18 然后重新执行configue,就可以在当前目录生成libtool了,切记:Makefile又重新生成了,又需要按上面步骤修改哦
  6. 交叉编译zlib-1.2.3
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --prefix=$PREFIX -shared
    2 # make
    3 # make install
  7. 交叉编译libpng-1.2.44
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    2 # make
    3 # make install
  8. 交叉编译expat-2.0.1
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    2 # make
    3 # make install
  9. 交叉编译freetype-2.3.7
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    2 # make
    3 # make install
  10. 交叉编译libxml2-2.6.31
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    2 # make
    3 # make install
  11. 交叉编译fontconfig-2.6.0
    view source
    print?
    1 # export LIBXML2_CFLAGS=-I$PREFIX/include/libxml2
    2 # export LIBXML2_LIBS="-L$PREFIX/lib -lxml2"
    3 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --with-arch=arm
    4 # make
    5 # make install
  12. 交叉编译DirectFB-1.3.0
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --with-gfxdrivers=none --enable-png --enable-jpeg --disable-tiff --enable-zlib --enable-sdl=no --enable-gif=no --disable-x11
    2 # make
    3 # make install
    4 注:如环境需要tslib 进行触摸屏校正,那需要添加—with-inputdrivers=all 参数使directfb支持 tslib ,并在编译DirectFB 程序前,先编译 tslib 程序
  13. 交叉编译pixman-0.12.0
    view source
    print?
    1 # CC=arm-none-linux-guneabi-gcc ./configure --host=arm-linux --prefix=$PREFIX
    2 # make
    3 # make install
    4 注:如果出现错误,在配置选项后面加上  --disable-gtk 试试
  14. 交叉编译cairo-1.8.4
    view source
    print?
    1 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --without-x --disable-xlib --disable-xlib-xrender --enable-directfb --enable-freetype --disable-win32 --enable-pdf --enable-ps --disable-svg --enable-png
    2 # make
    3 # make install
  15. 交叉编译pango-1.20.2
    view source
    print?
    1 # vi configure 修改configure文件,将下面一些参数改成true
    2     have_cairo=true
    3     have_cairo_png=true        
    4     have_cairo_ps=true
    5     have_cairo_pdf=true
    6     have_cairo_freetype=true
    7 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --enable-cairo --without-x
    8 # make
    9 # make install
  16. 交叉编译gtk+-2.12.9
    view source
    print?
    1 # export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib" 解决找不到 pango 的问题
    2 # export CPPFLAGS="-I$PREFIX/include"  解决 jpeglib.h 找不到的问题,从而支持jpeg
    3 # CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=$PREFIX --with-gdktarget=directfb --without-x --without-libtiff
    4 # make
    5 # make install

至此,GTK+DFB交叉编译环境成功搭建完毕,下面我们来放到目标板上运行一下下

GTK+DFB在TI OMAP目标板上测试工作

下载编译好的库到目标板上

我们可以查看一下/home/gtkdfb的大小,大概有100M左右,串口下载肯定不切实际,所以我们可以使用TFTP或者NFS挂载来实现。将我们PC主机上的/home/gtkdfb目录copy或者挂载到目标板的/home/gtkdfb目录下。如果你还不会这两种方法,请看我的博客关于TFTP与NFS这一章节

字库安装

GTK-DFB环境运行还需要字库文件支持,需要复制pc环境的字库到的构建的环境中去,当没有正确显示字体,显示是方框
我们打开/home/gtkdfb/etc/fonts下的fonts.conf
view source
print?
1 # vi /home/gtkdfb/fonts/fonts.conf
2            <dir>/usr/share/fonts</dir>
3                <dir>~/.fonts</dir>

看到了吗?目标板上的应用程序会在目标板的/usr/share/fonts下查找字库,我们可以去PC主机的/usr/share/fonts/truetype/freefont拷贝一个.ttf的文件放到目标板的/usr/share/fonts目录下,我当时拷贝了一个,但是只能显示英文,不能显示汉字,后来我就从网上搜索了一个.ttf格式的中文字体字库,嘿嘿,搞定了。

一些必要配置文件的创建

以下操作均在目标板上执行:

view source
print?
01 # mkdir /home/gtkdfb/etc/pango
02 # vi /home/gtkdfb/etc/pango/pangorc
03    # pangorc file for uninstalled operation.
04    # We set the path as ../modules, such that it works from any of
05    # top level build subdirs.
06    #
07    [Pango]
08    ModuleFiles = /usr/gtkdfb/etc/pango/pango.modules
09    ModulesPath = /usr/gtkdfb/lib/pango/1.6.0/modules
10 保存退出

gfxdrivers
下面的命令在开发板上运行:
/home/gtkdfb/bin/pango-querymodules > /home/gtkdfb/etc/pango/pango.modules
gdk-pixbuf.loaders
mkdir /home/gtkdfb/etc/gtk-2.0
/home/gtkdfb/bin/gdk-pixbuf-query-loaders > /home/gtkdfb/etc/gtk-2.0/gdk-pixbuf.loaders
gtk.immodules
/home/gtkdfb/bin/gtk-query-immodules-2.0 > /home/gtkdfb/etc/gtk-2.0/gtk.immodules

directfbrc 配置文件
这个地方不用配置也可以运行,但是配置了会提高性能(详细配置说明见附录二)

测试程序的执行

在我们目标板上的/home/gtkdfb/bin目录下有个gtk-demo的程序,我们来执行一下:
/home/gtkdfb/bin/gtk-demo,然后我们可以看到触摸屏上显示出了界面,如果你的内核配置了鼠标驱动,那么你可以接上鼠标,如果你的屏支持触摸,你可以用手去感受下,但是:有可能你发现没有触屏功能,不用着急,我下面教你怎么做。

实现触屏功能

由于安装包里面自带的测试程序没有链接我们编译好的tslib库,所以没有效果,我们可以自己写一个程序,然后指定库路径,然后按下面方法编译:

arm-linux-gcc -o hello hello.c -lts -Wl,-rpath,$PREFIX/lib `pkg-config gtk+-2.0 --cflags --libs`

编译后tslib已经自动包含在其中,呵呵。拷到开发板即可运行自己的hello了,此时我们发现可以触摸了。提醒:如果你的开发板是买的,拿一般已经存在tslib的配置文件了,我们不需要在目标板上配置便已经可以触摸了,但是如果板子是你自己制作的,文件系统也是你自己做的,那么你很可能没有tslib的配置文件,需要自己配置,详情请看附录三



GTK+DFB 开发环境在PC主机上的搭建

有些人就纳闷啊,我们不是已经搭建了一个环境了,怎么还要在PC主机上搭建一个呢,事实上,我们之前编译的库是只能在ARM板上运行的,如果我们写了一个应用程序,必须在arm板上运行去调试,PC机上由于没有相应的库,所以你用GCC去编译是通不过的,这样的情况我们有两种解决办法。
  1. 按照上面的步骤重新编译PC主机上的版本,事实上,多少人编译这些库可花了一个星期,甚至三个星期,就算不出错也得一天,所以非常困难。如果你执意去做,可以发邮件给我,我给你一篇文档给你,这里我就不写了,邮件地址[email protected]
  2. 下面这种就比较简单了,虽然如今的GTK+2.0版本修改了不少,但是大部分还是兼容的,所以我们可以去下载最新的库安装,而ubuntu安装软件是非常方便的,搭建方法见我的另外一篇博客:http://oldboys.sinaapp.com/qrs/GTK+/serialtools.html 文章中有一节是讲搭建环境的。



附录一

atkThe ATK library provides a set of interfaces for accessibility.By supporti ng the ATK interfaces, an application or toolkit canbe used such astools such as screen readers, magnifiers, and alternative input device

cairo
DirectFB

expat
XML parsing C library - example application This package contains xmlwf, an exam ple application of expat, the C library for parsing XML. The arguments to xmlwf are one ormore files which are each to be checked for XML well-formedness

fontconfig
Fontconfig is a library for font customization and configuration

freetypeFreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF 等。支持单色位图、反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用 ANSI C开发,但是采用面向对象的思想(下文中将会介绍到)。因此,FreeType的用户可以灵活地对它进行裁剪,例如我们在使用过程中,仅仅使用TrueType字体格式的处理,就可以将其他和这个格式无关的代码通过若干宏定义的取消就可以达到裁剪目的,这可以保证最后的二进制代码的紧凑性。例如,我们对TrueType格式处理的裁剪,使用单色位图渲染,最后的二进制代码大约只有25KB

glib
GLib是GTK+和GNOME 工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C 程序库,它提供C 语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API

gtk
jpegsrc.v6b.tar.gz
libjpeg 一个 jpeg 图形编码解码程序库

libpng

libpng 一个png 图形编码解码程序库

libxml2

Libxml 是一个实现读、创建及操纵XML数据功能的C语言库

pango
Pango is a library for laying out and rendering of text, with an emphasis on internationalization. Pango can be used anywhere that text layout is needed, though most of the work on Pango so far has been done in the context of the GTK+ widget toolkit. Pango forms the co re of text and font handling for GTK+-2.x.

tiff
zlib

zlib 是个支援 gzip 档案格式的函数库,它使得 gz档的存取就犹如开档关档一样地容易,您可以很容易地为您的程序加入gz档的支援

附录二

有关directfbrc文件的参数情况,请发邮件至[email protected]

附录三

tslib 的配置:
tslib 环境变量
TSLIB_TSEVENTTYPE 旧有版本的参数,新版本不使用
TSLIB_CONSOLEDEVICE 控制台设备文件名
TSLIB_FBDEVICE framebuffer的文件名
TSLIB_TSDEVICE 触屏的文件名
TSLIB_CALIBFILE 触屏校正信息保存文件
TSLIB_CONFFILE tslib 配置文件
TSLIB_PLUGINDIR tslib需要加载模块所在的目录


如何配置:我们可以将其写入到目标板的/etc/profile
vi /etc/profile
加入如下内容:

  1. export TSLIB_CONSOLEDEVICE=none 控制台参数
  2. export TSLIB_FBDEVICE=/dev/fb0 framebuffer 设备文件路径
  3. export TSLIB_TSDEVICE=/dev/input/event0 触摸屏设备文件路径
  4. export TSLIB_CALIBFILE=/tmp/ts-calib.conf 触摸屏校正后的参数输出配置文件
  5. export TSLIB_CONFFILE=/home/gtkdfb/etc/ts.conf tslib 执行的配置文件
  6. export TSLIB_PLUGINDIR=/home/gtkdfb/lib/ts tslib 插件模块文件所在路径

ts.conf 配置文件参数说明
module_raw input 指定tslib 使用的输入模块
module pthres pmin=1 触摸屏灵敏度门槛插件参数设置
module variance delta=30 触摸屏滤波算法插件参数设置
module dejitter delta=100 触摸屏去噪算法插件参数设置
module linear 触摸屏坐标变换插件参数设置

tslib1.4 的使用
执行./ts_calibrate 来对触摸屏进行校正
执行./ts_test 来对莫触摸进行校正后的测试

基于tslib 的GTK+DFB 触屏应用
DFB按照 directfbrc配置文件的信息进行初始化,然后加载辅助模块,模块的加载都是动态的,采用dlopen方式加载的。tslib 加载一些模块也是采用这种方式加载的。应用程序动态链接到DFB 的库,加载能加载的模块,同时加载了libdirectfb_tslib.so ,这个模块动态链接到 libts.so 这个库,动态加载libdirectfb_tslib.so 同时做一些初始化 tslib 的工作,初始 tslib 又会动态加载 tslib 的一些模块,这四个模块pthres 、variance 、dejitter、linear 会用到libts.so 这个库里的一个函数tslib_parse_vars ,由于libdirectfb_tslib.so 是用dlopen 加载的,加载tslib 的上四个模块时,根本就不知道到何处去找函数tslib_parse_vars,而 tslib 的测试程序已经动态链接了libts.so,加载 tslib 的上速模块时能够正确识别函数,tslib_parse_vars。基于以上所以在开发 gtk+directfb应用程序时,需要在编译应用程序的 makfile文件里加上以下参数:
LDFLAGS = -L/home/gtkdfb/lib -lts -Wl,-rpath,/home/gtkdfb/lib

-lts 就是在编译应用程序时能够动态调用 tslib 的库,从而实现利用校后的触摸屏来作为gtk+directfb应用程序的输入端设备



http://oldboys.sinaapp.com/qrs/transplant/GTKDFB.html


你可能感兴趣的:(porting gtk on arm)