How to cross compile SQLite - Step by Step Guide
Introduction
This tutorial introduces the way to cross compile the SQLite database engine (versions 2.x.x and 3.x.x) on an GNU Linux embedded platform.
The host machine will be a PC on which a GNU Linux distribution is installed.
The embedded platform might be constructed on top of one of the following architectures: arm, mips, mipsel, ppc or sparc.
The SQLite's home page: http://www.sqlite.org/.
The latest available release at the time of writing of this tutorial is 3.5.6 (February 6 2008).
For people wishing to cross compile an SQLite 2 package, the latest and last available release is 2.8.17.
Downloading any SQLite 3 releases can be done by typing:
wget http://sqlite.org/sqlite-3.5.6.tar.gzSince it is very hard to find the sqlite 2.8.17 tarball on the sqlite web site, you can directly download the file here. Also, you may download it from the SQLite cvs server by typing the following commands:
cvs -d :pserver:[email protected]:/sqlite login cvs -d :pserver:[email protected]:/sqlite checkout sqlite cvs update -r version_2
Overview
SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
SQLite is the most widely deployed SQL database engine in the world. It is used in countless desktop computer applications as well as consumer electronic devices including cellphones, PDAs, and MP3 players. The source code for SQLite is in the public domain.
Prerequisites
To cross compile the SQLite database engine, you need either a cross compiler, or an emulated Linux running on top of a virtualization software such as QEMU, matching your specific target platform.
If you wish to build yourself such a cross compiler, you should read the crosstool tutorial. There you will find all the information you need in order to build a C, C++ 4.1 GNU compiler for an ARM platform.
If you prefer to setup an ARM Debian system on top of a traditional Ubuntun distro (after all you are an hacker, aren't you?), have a look at How to setup an ARM Debian on Ubuntu tutorial in this wiki.
In addition to the cross compiler, a native compiler should be installed on your system as well. Please check you have gcc
and g++
correctly installed on your system (include files, libraries) since SQLite needs to compile native tools during the compilation process.
On Debian or Ubuntu systems, these components should be installed by successively typing:
apt-get install build-essential apt-get install gcc apt-get install g++
Cross Compilation Process
In this section, we will cover the process to compile both SQLite 2 and 3 releases.
Using a cross compiler
Assumptions
During the process, we will assume the cross toolchain is called xxx-yyy-linux-gnu
, meaning that the gcc, g++, ar, ..., ld
utilities are prefixed by xxx-yyy-linux-gnu
. For example, for this toolchain the C compiler (gcc) is called xxx-yyy-linux-gnu-gcc
.
We will also assume that the bin, include, lib
and libexec
folders of the cross toolchain are accessible through the PATH
variable environment in order to work with the compilers from any place in the file system.
Finally, we suppose it is intalled in the following folder: /opt/crosstool/gcc-4.1.2-glibc-2.3.2/xxx-yyy-linux-gnu
.
Organization
The releases being cross compiled are 2.8.17 and 3.5.6.
The tarball files will then be respectively extracted under the /opt/external_packages/sqlite/2.8.17/source
and /opt/external_packages/sqlite/3.5.6/source
folders. And the results of the compilation will be respectively stored under the /opt/external_packages/sqlite/2.8.17/compiled/xxx-yyy-linux-gnu
and /opt/external_packages/sqlite/3.5.6/compiled/xxx-yyy-linux-gnu
folders.
The files resulting from the cross compilation are listed here:
SQLite 2
.: total 12 drwxr-xr-x 2 root root 4096 2008-01-02 15:35 bin drwxr-xr-x 2 root root 4096 2008-01-02 15:35 include drwxr-xr-x 3 root root 4096 2008-01-02 15:35 lib ./bin: total 56 -rwxr-xr-x 1 root root 49171 2008-01-02 15:35 sqlite ./include: total 40 -rw-r--r-- 1 root root 38781 2008-01-02 15:35 sqlite.h ./lib: total 2272 -rw-r--r-- 1 root root 1325160 2008-01-02 15:35 libsqlite.a -rwxr-xr-x 1 root root 818 2008-01-02 15:35 libsqlite.la lrwxrwxrwx 1 root root 18 2008-01-07 14:27 libsqlite.so -> libsqlite.so.0.8.6 lrwxrwxrwx 1 root root 18 2008-01-07 14:27 libsqlite.so.0 -> libsqlite.so.0.8.6 -rwxr-xr-x 1 root root 979692 2008-01-02 15:35 libsqlite.so.0.8.6 drwxr-xr-x 2 root root 4096 2008-01-02 15:35 pkgconfig ./lib/pkgconfig: total 4 -rw-r--r-- 1 root root 247 2008-01-02 15:35 sqlite.pc
SQLite 3
.: total 12 drwxr-xr-x 2 root root 4096 2008-01-02 16:27 bin drwxr-xr-x 2 root root 4096 2008-01-02 16:27 include drwxr-xr-x 3 root root 4096 2008-01-02 16:27 lib ./bin: total 1000 -rwxr-xr-x 1 root root 1016645 2008-01-02 16:27 sqlite3 ./include: total 196 -rw-r--r-- 1 root root 19433 2008-01-02 16:27 sqlite3ext.h -rw-r--r-- 1 root root 175550 2008-01-02 16:27 sqlite3.h ./lib: total 3440 -rw-r--r-- 1 root root 2075294 2008-01-02 16:27 libsqlite3.a -rwxr-xr-x 1 root root 823 2008-01-02 16:27 libsqlite3.la lrwxrwxrwx 1 root root 19 2008-01-07 14:27 libsqlite3.so -> libsqlite3.so.0.8.6 lrwxrwxrwx 1 root root 19 2008-01-07 14:27 libsqlite3.so.0 -> libsqlite3.so.0.8.6 -rwxr-xr-x 1 root root 1429254 2008-01-02 16:27 libsqlite3.so.0.8.6 drwxr-xr-x 2 root root 4096 2008-01-02 16:27 pkgconfig ./lib/pkgconfig: total 4 -rw-r--r-- 1 root root 269 2008-01-02 16:27 sqlite3.pc
Cross compiling SQLite 2.8.17
Step 1
Install the sqlite software by untaring it into /opt/external_packages/sqlite/2.8.17/source
folder and then cd
to this directory.
Note: All the directories and files listed below must be moved from sqlite-2.8.17
folder to the parent folder(/opt/external_packages/sqlite/2.8.17/source
):
aclocal.m4 art config.guess config.sub configure configure.ac CVS doc install-sh ltmain.sh main.mk Makefile.in Makefile.linux-gcc publish.sh README spec.template sqlite.1 sqlite.def sqlite.pc.in src test tool VERSION www
Step 2
We want to cross compile sqlite with its default parameters therefore we configure it by typing:
./configure --host=xxx-yyy-linux-gnu --prefix=/opt/external_packages/sqlite/2.8.17/compiled/xxx-yyy-linux-gnu
Yet, during the configuration process, you will get the following errors:
checking for xxx-yyy-linux-gnu-gcc option to accept ANSI C... (cached) none needed configure: error: unable to find a compiler for building build tools
Or
checking for tcl.h... no checking for /usr/local/include/tcl.h... configure: error: cannot check for file existence when cross compiling
Solving theses errors consists in making the following changes in the configure script:
The section:
if test "$cross_compiling" = "yes"; then { { echo "$as_me:$LINENO: error: unable to find a compiler for building build tools" >&5 echo "$as_me: error: unable to find a compiler for building build tools" >&2;} { (exit 1); exit 1; }; } fi
Becomes:
if test "$cross_compiling" = "yes"; then { { echo "$as_me:$LINENO: error: unable to find a compiler for building build tools" >&5 echo "$as_me: error: unable to find a compiler for building build tools" >&2;} } fi
The section:
if eval "test "${$as_ac_File+set}" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "$dir/include/tcl.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi
Becomes:
if eval "test "${$as_ac_File+set}" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} } eval "$as_ac_File=yes" fi
The section:
if eval "test "${$as_ac_File+set}" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "$dir/include/readline.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi
Becomes:
if eval "test "${$as_ac_File+set}" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} } eval "$as_ac_File=yes" fi
The previous changes are already performed in the following modified sqlite-2.8.17-configure (Should be renamed as configure
) file.
Once the Makefile is produced, open it and apply the following changes:
The line:
BCC = arm-unknown-linux-gnu-gcc -g -O2Becomes:
BCC = gcc -g -O2
Step 3
To compile and install sqlite, type successively make
and make install
. You should now find the directories and files listed above under /opt/external_packages/sqlite/2.8.17/compiled/xxx-yyy-linux-gnu
.
Cross compiling SQLite 3.5.6
Step 1
Install the sqlite software by untaring it in the /opt/external_packages/sqlite/3.5.6/source
folder and then cd
to this directory.
Note:
All the below directories and files must be moved from the sqlite-3.5.6
folder to the parent folder (/opt/external_packages/sqlite/3.5.6/source
)
Step 2
We want to cross compile sqlite with its default parameters then we configure it by typing:
./configure --host=xxx-yyy-linux-gnu --prefix=/opt/external_packages/sqlite/3.5.6/compiled/xxx-yyy-linux-gnu
Step 3
To compile and install sqlite, type successively make
and make install
. You should find the directories and files listed above under /opt/external_packages/sqlite/3.5.6/compiled/xxx-yyy-linux-gnu
.
With QEMU
This section is not yet available.
Download
- arm-sqlite-3.5.4-tar.gz
- arm-sqlite-2.8.17-tar.gz
- sqlite-2.8.17-configure
You may consult this section if you want to download the SQLite database engine already cross compiled for your target platform if it is available.
You can also contribute to expand the crosscompile.org community by uploading your own results in the case a given platform is not already supported.
Supported platforms
- arm-unknown-linux-gnu
Written by David Sayada.