在ARM-Linux平台上移植SQLite

时间:2022-06-01 16:37:22
SQLite是一种嵌入式数据库。SQLite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色。它具有这样一些特点[1]:支持ACID事务(ACID是Atomic、Consistent、Isolated、Durable的缩写);零配置,不需要任何管理性的配置过程;实现了大部分SQL92标准;所有数据存放在一个单独的文件之中,支持的文件大小最高可达2TB;数据库可以在不同字节序的机器之间共享;体积小,在去掉可选功能的情况下,代码体积小于150KB,即使加入所有可选功能,代码大小也不超过250KB;系统开销小,检索效率高,执行常规数据库操作时速度比客户/服务器类型的数据库快;简单易用的API接口;可以和Tcl、Python、C/C++、Java、Ruby、Lua、Perl、PHP等多种语言绑定;自包含,不依赖于外部支持;良好注释的代码;代码测试覆盖率达95%以上;开放源码,可以用于任何合法用途。由于这样一些杰出的优点,SQLite获得了由Google与O’Reilly举办的2005 Open Source Award! 由于SQLite具有功能强大、接口简单、速度快、占用空间小这样一些特殊的优点,因此特别适合于应用在嵌入式环境中。SQLite在手机、PDA、机顶盒等设备上已获得了广泛应用。本文将说明如何在ARM-Linux内核的基础上移植SQLite3。 2、软硬件平台 本文中采用的硬件平台为Sitsang嵌入式评估板。Sitsang评估板的核心是PXA255嵌入式处理器,PXA255是一款基于IntelXScale微架构的高性能、低功耗嵌入式处理器。Sitsang评估板上配备了Flash存储器、LCD、触摸屏、USB接口、以太网接口、全功能串口(FFUART)、蓝牙串口(BTUART)、音频接口等诸多硬件资源。 底层软件系统是以ARM-Linux内核为基础的。Sitsang评估板使用的ARM-Linux是在linux-2.4.19内核上打了patch-2.4.19-sitsang2补丁后编译而成。 要将SQLite3移植到Sitsang评估板上,除了要有底层操作系统的支持外,还必须要有相应的交叉编译工具链。由于Sitsang评估板采用的是ARM-Linux作为底层操作系统,因此需要首先安装ARM-Linux工具链。关于ARM-Linux工具链的安装可以参阅文献[4]。ARM-Linux工具链通常安装在/usr/local/arm-linux/bin/目录下,通常以arm-linux-开头。本文中将会涉及到的主要是arm-linux-gcc、arm-linux-ar、arm-linux-ranlib这样三个工具。 3、移植过程 首先从http://sqlite.org下载SQLite 3.3.8。本文中假设将sqlite-3.3.8.tar.gz下载到/root目录下。然后,通过下列命令解压缩sqlite-3.3.8.tar.gz并将文件和目录从归档文件中抽取出来: # tar zxvf sqlite-3.3.8.tar.gz 解压抽取完成之后将会在/root目录下生成一个sqlite-3.3.8/子目录,在该目录中包含了编译所需要的所有源文件和配置脚本。SQLite3的所有源代码文件都位于sqlite-3.3.8/src/目录下。 和在PC环境下编译SQLite3不同,不能通过sqlite-3.3.8/目录下的configure脚本来生成Makefile文件。取而代之的是必须手动修改Makefile文件。在sqlite-3.3.8/目录下有一个Makefile范例文件Makefile.linux-gcc。首先通过下面的命令拷贝此文件并重命名为Makefile: # cp Makefile.linux-gcc Makefile 接下来,用vim打开Makefile文件并手动修改Makefile文件的内容。首先找到Makefile文件中的下面这样一行: TOP = ../sqlite 将其修改为: TOP = . 找到下面这样一行: TCC = gcc -O6 将其修改为: TCC = arm-linux-gcc -O6 找到下面这样一行: AR = ar cr 将其修改为: AR = arm-linux-ar cr 找到下面这样一行: RANLIB = ranlib 将其修改为: RANLIB = arm-linux-ranlib 找到下面这样一行: MKSHLIB = gcc -shared 将其修改为: MKSHLIB = arm-linux-gcc -shared 注释掉下面这一行: TCL_FLAGS = -I/home/drh/tcltk/8.4linux 注释掉下面这一行: LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl 原则上,对Makefile的修改主要包括两个方面:首先是将编译器、归档工具等换成交叉工具链中的对应工具,比如,gcc换成arm-linux-gcc,ar换成ar-linux-ar,ranlib换成arm-linux-ranlib等等;其次是去掉与TCL相关的编译选项,因为默认情况下,将会编译SQLite3的Tcl语言绑定,但是在移植到ARM-Linux的时候并不需要,因此将两个与TCL有关的行注释掉。对Makefile的修改总结如表1所示。 1 Makefile修改情况
修改为
17 TOP = ../sqlite TOP = .
73 TCC = gcc -O6 TCC = arm-linux-gcc -O6
81 AR = ar cr AR = arm-linux-ar cr
83 RANLIB = ranlib RANLIB = arm-linux-ranlib
86 MKSHLIB = gcc -shared MKSHLIB = arm-linux-gcc -shared
96 TCL_FLAGS = -I/home/drh/tcltk/8.4linux #TCL_FLAGS = -I/home/drh/tcltk/8.4linux
103 LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl #LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
接下来,还需要修改的一个的文件是main.mk,因为Makefile包含了这个文件。找到这个文件中的下面一行: select.o table.o tokenize.o trigger.o / 把它替换成: select.o table.o tclsqlite.o tokenize.o trigger.o / 也就是把该行上的tclsqlite.o去掉。这样编译的时候将不会编译SQLite3的Tcl语言绑定。 自此,修改工作就完成了,接下来就可以开始编译SQLite3了,这通过make命令即可完成: # make 编译完成之后,将在sqlite3.3.8/目录下生成库函数文件libsqlite3.a和头文件sqlite3.h,这就是所需要的两个文件了。