安峰
(苏州工业园区服务外包职业学院 信息技术系,苏州 215123)
安峰(工程师),主要研究领域为嵌入式图像处理。
在嵌入式Linux软件的开发当中,交叉编译基本是不可或缺的一步。如果整个系统规模较小的话,例如一些不需要其他库或者很少依赖包的系统,我们可以采取人工的办法:下载源代码、解压缩、设置参数、交叉编译然后下载运行。但是随着系统规模的不断扩大,依赖包的不断增长,人工交叉编译所需的工作量随之增长,同时需要富有经验的工程师进行操作,难以实现目前市场所要求的快速开发。
例如笔者对一款Linux下的媒体管理软件mythtv进行交叉编译的时候就遇到了这个问题,整个应用软件的压缩包达到几十兆,同时还依赖于其他几十个库,而每个库又有各自的依赖,如果按照传统的交叉编译方式进行的话无疑是个灾难。幸运的是,mythtv被集成在开源框架系统Openbricks当中,这使得整个系统的交叉编译、定制、开发和发布变得简单起来。
Openbricks是一个企业级的框架系统,内部集成了Bootloader,kernel,Systemd,X11和大量的工业标准(OpenGL ES,OpenVG,OpenMAX……),应用框架(Qt,GTK,EFL,SDL),多款大型的应用软件(均是开源媒体管理、播放软件)以及一系列的shell脚本。这些脚本智能化地管理着整个框架系统,可以根据用户的配置,自动化生成目标系统,智能地实现所有的库依赖、源代码下载、配置、编译以及目标系统生成的功能。
Openbricks是一个开源项目,其源代码目前由版本控制工具Mercurial来管理。在ubuntu环境下,我们可以通过命令行的方式(或者通过git的方式)来获取到源代码:hg clone http://hg.Openbricks.org/Openbricks
如图1所示,源代码目录下主要有sources、packages、scripts和build等目录。其中,scripts目录下存放控制脚本,以控制整个系统的运作;sources目录下存放有每个包的源代码(压缩包);packages目录下存放每个软件包的配置脚本、编译脚本和安装脚本;build目录下存放解压缩后的软件包源代码。
图1 源代码获取及目录层次
如上文所述,Openbricks内部集成有大量的开发库,因此在使用这些库之前需要进行适当的配置。在Openbricks源代码的根目录下输入make menuconfig,即可启动Openbricks配置界面。值得一提的是,Openbricks的智能管理功能会根据用户环境的不同,来提示用户是否需要自动下载安装所需的配置工具,如图2所示。
图2 自动下载配置工具
在安装完所需的工具之后,即可出现用户配置主界面,如图3所示。我们选择了框架中众多软件中的mythtv,以及目标平台的cpu、architecture和平台等,如果需要进一步定制软件,可以在packets、libs等目录下进行进一步的修改。在保存配置文件之后输入make命令即可进行整个系统的编译与生成,如果一切顺利的话,将会在binary目录下生成目标系统,而mythtv所依赖的Qt、X11、python和perl等众多库则被自动下载并且编译、安装。默认情况下,目标系统是以文件系统的形式存在,同时,目标系统的Bootloader和kernel也相应包含在内。由于目前硬件平台的多样性,因此在多数情况下,kernel还需要进一步的移植才能更好地适应用户的目标系统。
图3 用户配置主界面
Openbricks之所以能实现自动化的编译,在于一系列的shell脚本。在开始编译之后,脚本开始检查目录下的所有包,并按照makefile对时间规则的定义以及用户在配置界面中所作的选择对相关包进行编译。对于每个软件包,在Openbricks框架当中均有一系列的目录与之对应。以zlib包为例,在packet目录下有一个zlib文件夹,其中包含有meta、build和install三个文件,这三个文件分别记录了zlib包的版本、依赖、配置和编译参数。在script目录当中的编译安装脚本会判断相关的软件包是否已经被顺利编译安装,如果没有,则会检查包的依赖链,并进行代码下载、编译等操作。Openbricks脚本流程图如图4所示。
图4 Openbricks脚本流程图
其中,检测包之间的依赖关系是通过Linux平台下的pkg工具,源代码下载通过wget工具,其他一些需要用到的工具会在编译过程中自动下载,系统主机通常选择在ubuntu环境下。
基于Openbricks,可以快速地进行软件的开发工作。以开发一个基于Qt和OpenGL的3D嵌入式图形程序为例,在开发程序时,我们只希望关注于应用程序本身,而不是受困于Qt、OpenGL的配置、安装问题。基于Openbricks,我们将应用程序以packet的形式添加进Openbricks,假设应用程序名叫mythremote,则添加方法如下:
① 运行./scripts/newpacket mythremote命 令,将在packet目录下生成mythremote目录;
② 在mythremote目录下编辑meta文件,修改PKG_VERSION、PKG_URL和依赖包等宏变量;
③ 运行./scripts/unpacked mythremote命令,测试是否会根据PKG_URL来自动下载相应源代码,并解压缩到build目录下的mythremote目录下;
④ 编辑build文件,增加配置命令;
⑤ 运行./scripts/build mythremote命令,即可进行源代码编译,如果在meta文件下有包依赖的话,则会先进行依赖包的下载、编译与安装。
基于Openbricks,我们也可以快速地进行软件的发布工作,因为源代码是集成在Openbricks之中,因此用户在以源代码编译、安装我们的程序时不必再去关心Qt或者OpenGL的问题,只需简单地配置,然后一个指令,即可生成相应的目标系统,实现了嵌入式Linux软件的快速、简单的发布。
本文讨论的基于Openbricks的实现方法及应用的主要技术,使得开发者可以专注于应用相关的细节开发,不用再去关注硬件、Bootloader、kernel和应用框架等。工程实践证明这些方法都是可行的,可以较大地提高开发效率。由于主系统环境参数和用户经验的不同等,在首次编译该系统时会遇到一些问题,而且首次编译系统的时间也较长(10个小时左右),这也是该产品有待提高之处。
[1]http://www.Openbricks.org/.
[2]http://www.mythtv.org/.
[3]张元铜,向勇,郑志国.Peta Linux操作系统在 Micro Blaze系统中的移植[J].单片机与嵌入式系统应用,2010,10(7).
[4]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[5]文全刚.嵌入式Linux操作系统原理与应用[M].北京:北京航空航天大学出版社,2002:155-169.
[6]亚荷毛尔.构建嵌入式Linux系统[M].2版.O'keilly Taiwan公司,译.北京:中国电力出版社,2011.