我是zoro
分类: LINUX
2012-01-05 09:58:08
[学习准备]:
什么是交叉编译呢?在回答这个问题前,我们先解释两个概念:
主 机:运行编译过程的计算机。
目标机:运行编译结果(可执行文件)的计算机。
-------------------------------------------------------------------------------------一般情况下,主机和目标机是同一类型的计算机,这就是正常的编译,没有什么好说的。所谓交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行,这种编译就叫交叉编译。
交叉编译需要交叉编译器,不同的目标机(主要是看芯片类型)需要不同的交叉编译器,比如我们这里要介绍的arm-linux交叉编译,所用的交叉编译器就是arm-linux-gcc系列。
构建一个交叉编译器(toolchain),说简单也简单,说复杂也复杂。原理上很简单,实际情况常常比较复杂,原因是编译器一直处于开发状态,你要了解某个版本的稳定性,要去找patch。有时候还要看你的运气好不好,折腾一个星期才搞定也是很常见的。
网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。如何构建交叉编译器的知识请参考另一幅文章。
-------------------------------------------------------------------------------------在做交叉编译前,你最好了解autoconf系统工具的用法,遇到问题时,可以快速定位。先找一本autoconf的书看看,可以说是磨刀不识砍柴功,否则后面会浪费更多的时间。
在这里我专门介绍一下autoconf的相关知识,以方便用户学习。
------------------------------------------------------------------
官方下载地址:ftp://ftp.gnu.org/gnu/autoconf/)。
------------------------------------------------------------------
Autoconf的内容:
Autoconf 能生成用于自动配置源代码的 shell 脚本。
安装下列程序: autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate 和 ifnames
------------------------------------------------------------------
简要说明:
autoconf是一个产生可以自动配置源代码包,生成shell脚本的工具,以适应各种类UNIX系统的需要。autoconf 产生的配置脚本在运行时独立于autoconf ,因此使用这些脚本的用户不需要安装autoconf。
autoheader能够产生供configure脚本使用的C #define语句模板文件。
autom4te对文件执行 GNU M4。
autoreconf,如果有多个autoconf产生的配置文件,autoreconf可以保存一些工作,它通过重复运行autoconf(以及 在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。
autoscan程序可以用来为软件包创建configure.in文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以 当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是 configure.in的前身。
autoupdate程序将一个调用autoconf 宏的旧名称的configure.in文件中的宏更新为新的名称。
ifnames当为一个软件包写configure.in 时,ifnames可以提供一些帮助。它打印包中那些在C预处理器中已经使用了的表示符。如果一个包已经设置成具有某些可移植属性,这个程序能够帮助指出 它的配置应该如何检查。它可以用来填补由autoscan产生的configure.in中的隔阂。
------------------------------------------------------------------
Autoconf 安装依赖关系
Autoconf 依赖于: Bash, Coreutils, Diffutils, Grep, M4, Make, Perl, Sed.
[一.基本知识]
在linux下,绝大部分的软件包都是用autoconf配置的。除此之外,比较有名的就是X11的imake配置方式,imake实际上有点过时 了,用起来很不方便,所以xfree86已经计划向autoconf移植了。还有极少的直接使用Makefile编译,通过环境变量或者不同的 Makefile配置,当然这只适用于简单的软件包。
Autoconf是一个非常有用的配置工具,原理有点复杂,全面了解它要花不少时间,但使用很方便。这里简单介绍一下autoconf交叉编译的基本知识。
下载软件包无非两种方式,一种是直接从cvs里取最新版本,另一种是取发布的稳定版本。除非你想测试最新版本,否则后者是比较安全的方式。但有的软件包不提供发布的版本,这时就只能退而求其次了-使用cvs版本了。
编译cvs版本有一点不同,cvs版本通常不带configure脚本的,自己要重新产生configure脚本。当然这并不困难,多数开发人员都 会在自己的软件包里,放上一个autogen.sh或者bootstartup之类的脚本。利用这个脚本可以自动产生configure脚本。下面是一个 autogen.sh脚本示例,若软件包里没有提供这样的文件,可以仿照写一个:
--------------------------------------------------------------
#!/bin/sh
# $Id: autogen.sh,v 1.3 2005/02/26 01:47:22 kergoth Exp $ autoreconf -f -i -I `pwd`/m4 exit $? echo -n "Libtoolize..." libtoolize --force --copy echo "Done." echo -n "Aclocal..." aclocal echo "Done." echo -n "Autoheader..." autoheader echo "Done." echo -n "Automake..." automake --add-missing --copy echo "Done." echo -n "Autoconf..." autoconf echo "Done." #./configure $* echo "Now you can do ./configure, make, make install."--------------------------------------------------------------
正式发布的软件包里,已经有做好的configure脚本了。接下来我们要做的就是利用configure进行配置。对于交叉编译来说,最重要的配置选项有以下几个:
--host:指定目标机的平台类型。一般格式为CPU类型-操作系统名称。比如,目标机的CPU为arm,操作系统为linux,可以这样写--host=arm-linux。
--prefix:这是安装路径的前缀,即编译结果放置的位置。默认值是/usr或者/usr/local,交叉编译时不能使用默认值,否则它会覆盖你本机的文件,所以要指定一个路径。比如,可以指定为--prefix=/work/cross/rootfs/usr。
配置完成后,运行make编译,运行make install安装。
(pkg-config也是一个非常重要的工具,关于pkg-config的使用,可以参考笔者另外一篇文章,这里不再多说。)
[二.文档惯例及隐含前提]:
--------------------------------------------------------------
交叉编译器名称:arm-linux-gcc
交叉编译器版本:3.4.3
目标操作系统版本:2.6.9
默认依赖关系:依赖glibc
隐含环境变量:
WORK_DIR:工作目录,设置为/work/cross
ROOTFS_DIR:编译结果根目录,设置为$WORK_DIR/rootfs
ARCH:目标平台的体系架构,设置为arm
--------------------------------------------------------------
建立一个脚本用于设置变量和建立必要的目录,在编译前,先运行. corss.env。 其内容如下:
cross.env
export WORK_DIR=/work/cross
export ROOTFS_DIR=$WORK_DIR/rootfs
export ARCH=arm
export PKG_CONFIG_PATH=$ROOTFS_DIR/usr/local/lib/pkgconfig:$ROOTFS_DIR/usr/lib/pkgconfig:$ROOTFS_DIR/usr/X11R6/lib/pkgconfig
if [ ! -e "$ROOTFS_DIR/usr/local/include" ]; then mkdir -p $ROOTFS_DIR/usr/local/include;fi;
if [ ! -e "$ROOTFS_DIR/usr/local/lib" ]; then mkdir -p $ROOTFS_DIR/usr/local/lib; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/etc" ]; then mkdir -p $ROOTFS_DIR/usr/local/etc; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/bin" ]; then mkdir -p $ROOTFS_DIR/usr/local/bin; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/share" ]; then mkdir -p $ROOTFS_DIR/usr/local/share; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/man" ]; then mkdir -p $ROOTFS_DIR/usr/local/man; fi;
if [ ! -e "$ROOTFS_DIR/usr/include" ]; then mkdir -p $ROOTFS_DIR/usr/include; fi;
if [ ! -e "$ROOTFS_DIR/usr/lib" ]; then mkdir -p $ROOTFS_DIR/usr/lib; fi;
if [ ! -e "$ROOTFS_DIR/usr/etc" ]; then mkdir -p $ROOTFS_DIR/usr/etc; fi;
if [ ! -e "$ROOTFS_DIR/usr/bin" ]; then mkdir -p $ROOTFS_DIR/usr/bin; fi;
if [ ! -e "$ROOTFS_DIR/usr/share" ]; then mkdir -p $ROOTFS_DIR/usr/share; fi;
if [ ! -e "$ROOTFS_DIR/usr/man" ]; then mkdir -p $ROOTFS_DIR/usr/man; fi;
颜色字体含义
颜色字体 表示错误信息。
颜色字体 表示命令行脚本。
颜色字体 表示文件内容。
--------------------------------------------------------------
文档格局:
1. 基本信息:
软件名称
功能简述
下载地址
软件版本
依赖关系
前置条件
2. 过程分析
构建过程中遇到的问题分析。
3. 构建处方
通常是一个可用的Makefile,用它可以编译这个模块。或者一些patch文件。
[三。编译tslib]:
1. 基本信息:
软件名称
tslib
功能简述
tslib是一个触摸屏的库,它提供诸如滤波、去抖、校准之类的功能,为不同的触摸屏提供了一个统一的接口。
下载地址
export VSROOT=:pserver:cvs@pubcvs.arm.linux.org.uk:/mnt/src/cvsroot
cvs login
cvs co tslib
软件版本
2006-3-28 cvs版本
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/tslib
2. 过程分析
因为是cvs版本,所以先要生成configure脚本,tslib提供了一个autogen.sh文件,自然是用autogen.sh去产生了。运行:
[root@linux tslib]# ./autogen.sh
出现了如下错误:
: bad interpreter: No such file or directory
打开autogen.sh文件,发现了没有任何错误,猜想可能是一些不可见的非法字符引起的,用二进制方式打开该文件,发现它是dos格式的。需要转换成unix格式的。
索性用dos2unix把整个目录都转一遍。另外发现没有NEWS README AUTHORS 三个文件,为了避免出错,产生三个空文件:
[root@linux tslib]# touch NEWS README AUTHORS。
重新运行:
[root@linux tslib]# ./autogen.sh
一切OK!
-------------------------------------------------------------------
现在来做真正的配置:
[root@linux tslib]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
配置成功,但make时,出现下列错误:
ts_test.o(.text+0x218): In function `main':
: undefined reference to `rpl_malloc'
在当前目录查找了rpl_malloc,发现configure里有#define malloc rpl_malloc一行。分析configure 脚本相关的代码,原来是ac_cv_func_malloc_0_nonnull引起的,OK我们不让它检查了,产生一个cache文件arm- linux.cache,欺骗configure:
[root@linux tslib]# echo "ac_cv_func_malloc_0_nonnull=yes" >$ ARCH -linux.cache
[root@linux tslib]# ./configure --prefix=$(ROOTFS_DIR)/usr --host=$ ARCH -linux --cache-file=$ ARCH -linux.cache
配置成功后,重新编译一下,OK!
3. 构建处方
tslib.mk
TSLIB_DIR="tslib"
all: clean config build
config:
@cd $(TSLIB_DIR) && find * -exec dos2unix {} \; && \
touch NEWS README AUTHORS && \
./autogen.sh && \
echo "ac_cv_func_malloc_0_nonnull=yes" >$$ARCH-linux.cache && \
./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux --cache-file=$$ARCH-linux.cache && \
echo "config done"
build:
@cd $(TSLIB_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(TSLIB_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
[三。编译zlib]:
1. 基本信息:
软件名称
zlib
功能简述
zlib 一个压缩解压程序库
下载地址
软件版本
zlib-1.2.3.tar.gz
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/zlib
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux zlib-1.2.3]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
出现了如下错误:
usage:
configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]
[--libdir=LIBDIR] [--includedir=INCLUDEDIR]
看来此configure非彼configure也,打开一看,果然不是autoconf系列的,又是一个貌合神离的东东。OK,按它的用法说明做吧,但问题是如何指定交叉编译器呢,按照惯例,设置环境变量CC试试看:
[root@linux zlib-1.2.3]# export CC=$ARCH-linux-gcc
[root@linux zlib-1.2.3]# ./configure -shared --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux zlib-1.2.3]# make && make install
OK,编译成功。
3.构建处方
zlib.mk
ZLIB_DIR="zlib-1.2.3"
all: clean config build
config:
@cd $(ZLIB_DIR) && \
export CC=$$ARCH-linux-gcc && \
./configure --prefix=$$ROOTFS_DIR/usr/local --shared && \
echo "config done"
build:
@cd $(ZLIB_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(ZLIB_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
[编译readline和ncurses]
1. 基本信息:
软件名称
readline
功能简述
readline一个命令行编辑程序库
下载地址
软件版本
readline-5.1.tar.gz
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/ readline-5.1
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux readline-5.1]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux readline-5.1]# make && make install
OK,编译成功。少有的顺利!
3. 构建处方
readline.mk
READLINE_DIR="readline-5.1"
all: clean config build
config:
@cd $(READLINE_DIR) && \
./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux && \
echo "config done"
build:
@cd $(READLINE_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(READLINE_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
1. 基本信息:
软件名称
ncurses
功能简述
ncurses一个文本界面的图形程序库
下载地址
http://directory.fsf.org/ncurses.html
软件版本
ncurses-5.5.tar.gz
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/ ncurses-5.5
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux ncurses-5.5]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux ncurses-5.5]# make && make install
OK,编译成功。少有的顺利!
3. 构建处方
ncurses.mk
NCURSES_DIR="ncurses-5.5"
all: clean config build
config:
@cd $(NCURSES_DIR) && \
./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux && \
echo "config done"
build:
@cd $(NCURSES_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(NCURSES_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
[编译libjpeg和libpng]
1. 基本信息:
软件名称
libjpeg
功能简述
libjpeg一个jpeg图形编码解码程序库
下载地址
软件版本
jpegsrc.v6b.tar.gz
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/ jpeg-6b
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux jpeg-6b]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux jpeg-6b]# make && make install
哦,不对,怎么还是用gcc编译的,而不是用arm-linux-gcc编译的呢?看来--host没有生效,还是试试老方法-设置CC环境变量吧:
[root@linux jpeg-6b]# export CC=arm-linux-gcc
[root@linux jpeg-6b]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux jpeg-6b]# make && make install
OK,编译成功。
3. 构建处方
jpeg.mk
JPEG_DIR="jpeg-6b"
all: clean config build
config:
@cd $(JPEG_DIR) && \
export CC=arm-linux-gcc && \
./configure --prefix=$$ROOTFS_DIR/usr && \
echo "config done"
build:
@cd $(JPEG_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(JPEG_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
1. 基本信息:
软件名称
libpng
功能简述
libpng一个png图形编码解码程序库
下载地址
软件版本
libpng-1.2.8-config.tar.gz
依赖关系
默认zlib
前置条件
源文件位置:$(WORK_DIR)/ libpng-1.2.8-config
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux libpng-1.2.8-config]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
出现了如下错误:
configure: error: ZLib not installed
奇怪,zlib已经编译过了啊。为什么configure找不到zlib呢?设置一下环境变量CFLAGS和LDFLAGS试试,Makefile 一般都通过CFLAGS来设置额外的编译选项,通过LDFLAGS来设置额外的连接选项,configure大概也遵循这个规则吧。
[root@linux libpng-1.2.8-config]# export LDFLAGS=-L$ROOTFS_DIR/usr/local/lib
[root@linux libpng-1.2.8-config]# export CFLAGS=-I$ROOTFS_DIR/usr/local/include
[root@linux libpng-1.2.8-config]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
OK,配置成功,编译:
[root@linux libpng-1.2.8-config]# make && make install
OK,编译成功。
3. 构建处方
png.mk
PNG_DIR="libpng-1.2.8-config"
all: clean config build
config:
@cd $(PNG_DIR) && \
export LDFLAGS=-L$$ROOTFS_DIR/usr/local/lib && \
export CFLAGS=-I$$ROOTFS_DIR/usr/local/include && \
./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr && \
echo "config done"
build:
@cd $(PNG_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(PNG_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
[编译TinyX]
1. 基本信息:软件名称
TinyX
功能简述
TinyX是一个针对嵌入式系统设计的X Window,相对PC版的X Window而言,它占用的资源要少很多,服务器程序仅700多K,客户端的动态库约2M(看你需要而定)多。
下载地址
软件版本
XFree86-4.5.0-src-1.tgz
XFree86-4.5.0-src-2.tgz
XFree86-4.5.0-src-3.tgz
XFree86-4.5.0-src-4.tgz
XFree86-4.5.0-src-5.tgz
XFree86-4.5.0-src-6.tgz
XFree86-4.5.0-src-7.tgz
依赖关系
默认
readline
zlib
ncurses
前置条件
源文件位置:$(WORK_DIR)/xc
2. 过程分析
TinyX并不是一个独立的软件包,而是X Window的一种编译配置。X Window采用的imake配置方式,与autoconf不一样,你先要手工编译配置文件。在xc/config/cf/README文件里,有对各种选项详细的介绍。
修改这些配置文件是一种比较繁琐的事情,特别对于新手来说,往往要经历修改配置文件-编译-失败-再修改配置文件这个循环好几次。即使是对于有经验的人来说,一次搞定也并非那么容易。这个过程讲起来比较冗长,这里就不再多说,具体的配置文件可以参考构建处方。
按照BUILD.txt里的建议,我们决定建立一个临时目录,在这个临时目录里编译,避免破坏原始文件。实践证明这个建议很有用,因为很少第一次编译成功,重新编译时不用再去解压软件包,可以节省不少时间。
[root@linux cross]# cd xc/config/util/
[root@linux util]# make lndir
[root@linux util]# cp lndir /usr/local/bin/
[root@linux util]# cd -
[root@linux cross]# mkdir armtinyx
[root@linux cross]# cd armtinyx
[root@linux armtinyx]# lndir ../xc/
现在我们把配置文件和patch文件拷贝进来:
[root@linux armtinyx]# cp ../armtinyx.patch/* . -rf
编译:
[root@linux armtinyx] make World DESTDIR=$ROOTFS_DIR
出现下列错误:
/usr/local/arm-linux/lib/gcc/arm-linux/3.4.2/../../../../arm-linux/sys-include/sys/io.h:38: error: conflicting types for 'inb'
../../../../../programs/Xserver/hw/xfree86/common/compiler.h:1452: error: previous definition of 'inb' was here
/usr/local/arm-linux/lib/gcc/arm-linux/3.4.2/../../../../arm-linux/sys-include/sys/io.h:39: error: conflicting types for 'inw'
编辑armtinyx/programs/Xserver/hw/xfree86/common/compiler.h,删除outb之类的空函数。
重新编译:
[root@linux armtinyx] make
出现下列错误:
arm-linux-gcc: os/tiny/lbxio.o: No such file or directory
[root@linux armtinyx] cd programs/Xserver/os/tiny
[root@linux armtinyx] make lbxio.o
[root@linux armtinyx] cd -
[root@linux armtinyx] make
[root@linux armtinyx] make install DESTDIR=$ROOTFS_DIR
编译成功!
其它说明:
若是2.6的内核,你可能要修改NR_KEYS的值为128,否则programs/Xserver/hw/tinyx/linux/keyboard.c里有内存越界问题,造成无法运行。
若运行时,发现触摸屏不能使用,修改programs/Xserver/hw/tinyx/linux/tslib.c的数组TsNames,加入你使用的触摸屏设备文件。若还是不行,检查一下tslib需要的环境变量是否设置正确。
3. 构建处方
armtinyx.mk
ARMTINYX_PATCH_DIR=armtinyx.patch
XC_DIR=xc
all: clean config build
config:
cd xc/config/util && make lndir && cp -f lndir /usr/bin
rm -rf $(ARMTINYX_DIR)
mkdir $(ARMTINYX_DIR)
cd $(ARMTINYX_DIR) && lndir ../xc
cp -rvf $(ARMTINYX_PATCH_DIR)/* $(ARMTINYX_DIR)
echo "config done"
build:
@cd $(ARMTINYX_DIR) && \
make World DESTDIR=$$ROOTFS_DIR && make install && \
cd programs/Xserver/os/tiny && make lbxio.o && cd - && \
make && \
make install && \
echo "build done"
clean:
rm -rf $(ARMTINYX_DIR)
echo "clean done"
l armtinyx.patch/config/cf/cross.def
#undef Arm32Architecture
#undef i386Architecture
#undef Arm32Architecture
#undef Arm32Architecture
#define Arm32Architecture
#undef OptimizedCDebugFlags
#define OptimizedCDebugFlags -Os
#define ServerCDebugFlags -Os
#undef StandardDefines
#define StandardDefines -Dlinux -D__arm__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE \
-DX_LOCALE -DUSE_DYNAMIC_LC -DUSE_UTF8_LOADER -DUSE_DYNAMIC_LOADER
#define PreIncDir
#undef PostIncDir
#undef CcCmd
#define CcCmd arm-linux-gcc -I$(ROOTFS_DIR)/usr/include/ncurses -I$(ROOTFS_DIR)/usr/include
#undef HasCplusplus
#define HasCplusplus NO
#undef CplusplusCmd
#define CplusplusCmd NO
#define DoRanlibCmd YES
#define RanlibCmd arm-linux-ranlib
#undef ExtraLoadFlags
#define ExtraLoadFlags
#define FbNoPixelAddrCode
#undef TermcapLibrary
#define TermcapLibrary -L$(ROOTFS_DIR)/usr/lib -lncurses
#define NCursesLibName -L$(ROOTFS_DIR)/usr/lib -lncurses
#undef LdPostLib
#undef LdCmd
#define LdCmd arm-linux-ld
#undef ExtensionOSDefines
#define ExtensionOSDefines
#define ServerXdmcpDefines
#define GzipLibrary -L$(ROOTFS_DIR)/usr/local/lib -lz
#i nclude
l armtinyx.patch/config/cf/host.def
#define KDriveXServer YES
#define TinyXServer YES
#define XfbdevServer YES
#define CrossCompiling YES
#define ProjectRoot /usr/X11R6
#define NothingOutsideProjectRoot YES
#define HasFreetype2 NO
#define HasFontconfig NO
#define HasLibpng NO
#define HasZlib NO
#define Ha***pat NO
#define BuildXprintClients NO
#define TouchScreen YES
#define HasTsLib YES
#define BuildDocs NO
#define BuildXF86DRI NO
#define BuildGlxExt NO
#define BuildOSMesaLib NO
#define BuildLowMem NO
#define BuildIPv6 NO
#define HasMTRRSupport NO
#define U***86Emu NO
#define XF86INT10_BUILD X86INT10_STUB
#define BuildAppgroup NO
#define BuildDBE NO
#define BuildLBX NO
#define HasMTRRSupport NO
#define U***86Emu NO
#define XF86INT10_BUILD X86INT10_STUB
#define BuildAppgroup NO
#define BuildDBE NO
#define BuildLBX NO
#define BuildFonts YES
#undef BuildXF86RushExt
#define BuildXF86RushExt NO
#undef BuildRender
#define BuildRender YES
#define UseRgbTxt YES
#define BuildFontServer NO
#define BuildClients NO
#define BuildFonts YES
#undef BuildXF86RushExt
#define BuildXF86RushExt NO
#undef BuildRender
#define BuildRender YES
#define UseRgbTxt YES
#define BuildFontServer NO
#define OmitSnfSupport YES
#define XdecMultiDepthServer NO
#define XsunServer NO
#define Xsun24Server NO
#define XsunMonoServer NO
#define XsunLynxServer NO
#define XSavageServer NO
#define XIgsServer NO
#define XTridentServer NO
#define XchipsServer NO
#define Xmach64Server NO
#define Xi810Server NO
#define XSis530Server NO
#define XTrioServer NO
#define XipaqServer NO
#define XTS300Server NO
#define XItsyServer NO
#define XvesaServer NO
#define XDarwinServer NO
#define XF86CardDrivers fbdev
#define XInputDrivers mouse keyboard
[编译sqlite]
1. 基本信息:
软件名称
sqlite
功能简述
sqlite是一个针对嵌入式系统设计的数据库管理系统(DBMS),实现了SQL92的基本功能,ARM版的可执行文件约300K.
下载地址
软件版本
sqlite-3.3.4.tar.gz
依赖关系
默认
readline
前置条件
源文件位置:$(WORK_DIR)/ sqlite-3.3.4
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux sqlite-3.3.4]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
出现了如下错误:
configure: error: unable to find a compiler for building build tools
前面检查arm-linux-gcc都通过了,怎么还说没有找到编译器呢?花了点时间看configure的脚本,太复杂了,又结合 configure.ac看了一下。原来是要设置config_TARGET_CC和config_BUILD_CC两个环境变量。 config_TARGET_CC是交叉编译器,config_BUILD_CC是主机编译器。重来:
[root@linux sqlite-3.3.4]# export config_BUILD_CC=gcc
[root@linux sqlite-3.3.4]# export config_TARGET_CC=arm-linux-gcc
[root@linux sqlite-3.3.4]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
出现了如下错误:
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
readline我们已经编译过了,readline.h是肯定存在,没有必要检查。还是施展我们欺骗***吧,在cache文件里设置ac_cv_header_readline_h=yes,骗过configure脚本:
[root@linux sqlite-3.3.4]# echo ac_cv_header_readline_h=yes >$ARCH-linux.cache
[root@linux sqlite-3.3.4]#./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr --cache-file=$ARCH-linux.cache
这回配置成功了,编译:
[root@linux sqlite-3.3.4]# make && make install
有的机器上会出现下列错误:
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'
这时检查一下libtool里的CC变量是否设置为arm-linux-gcc,如果不是,可以手工改过来,或者设置环境变量lt_compiler=arm-linux-gcc,重新配置一下。
OK,经过几番周折,终于编译过去了。
3. 构建处方
sqlite.mk
SQLITE_DIR="sqlite-3.3.4"
all: clean config build
config:
@cd $(SQLITE_DIR) && \
export config_BUILD_CC=gcc && \
export config_TARGET_CC=arm-linux-gcc && \
echo ac_cv_header_readline_h=yes >$$ARCH-linux.cache && \
./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr --cache-file=$$ARCH-linux.cache && \
echo "config done"
build:
@cd $(SQLITE_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(SQLITE_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
[编译glib]
1. 基本信息:
软件名称
glib
功能简述
Glib是GNOME的一个基础库,提供基本的容器、算法、对象系统、OSAPI的适配器等。
下载地址
软件版本
glib-2.8.0.tar.gz
依赖关系
默认
前置条件
源文件位置:$(WORK_DIR)/ glib-2.8.0
2. 过程分析
下载的稳定版本,configure已经存在,直接进行配置:
[root@linux glib-2.8.0]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
出现了如下错误:
checking for growing stack pointer... configure: error: cannot run test program while cross compiling
原来configure不能为交叉编译检查glib_cv_stack_grows,glib_cv_stack_grows表示堆栈的增长方向。 configure无法在目标机上运行测试程序,自然无法检查,只好手工指定。顺便看一下还哪些相关的变量不能检查的,一起写到cache文件中,并重新 配置:
[root@linux glib-2.8.0]# echo ac_cv_type_long_long=yes>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_stack_grows=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_uscore=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
[root@linux glib-2.8.0]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr --cache-file=$ARCH-linux.cache
这回配置成功了,编译:
[root@linux glib-2.8.0]# make && make install
编译成功!
3. 构建处方
glib.mk
GLIB_DIR="glib-2.8.0"
all: clean config build
config:
@cd $(GLIB_DIR) && \
echo ac_cv_type_long_long=yes>$$ARCH-linux.cache && \
echo glib_cv_stack_grows=no>>$$ARCH-linux.cache && \
echo glib_cv_uscore=no>>$$ARCH-linux.cache && \
echo ac_cv_func_posix_getpwuid_r=yes>>$$ARCH-linux.cache &&\
./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr --cache-file=$$ARCH-linux.cache && \
echo "config done"
build:
@cd $(GLIB_DIR) && \
make && make install && \
echo "build done"
clean:
@cd $(GLIB_DIR) && \
if [ -e Makefile ]; then make distclean; fi && \
echo "clean done"
转自: