交叉编译场景分析(arm-linux)

转自:http://blog.csdn.net/absurd


交叉编译场景分析(arm-linux)()--基本知识

1.         基本知识

linux下,绝大部分的软件包都是用autoconf配置的。除此之外,比较有名的就是X11imake配置方式,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类型-操作系统名称。比如,目标机的CPUarm,操作系统为linux,可以这样写--host=arm-linux

--prefix这是安装路径的前缀,即编译结果放置的位置。默认值是/usr或者/usr/local,交叉编译时不能使用默认值,否则它会覆盖你本机的文件,所以要指定一个路径。比如,可以指定为--prefix=/work/cross/rootfs/usr

 

配置完成后,运行make编译,运行make install安装。

 

(pkg-config也是一个非常重要的工具,关于pkg-config的使用,可以参考笔者另外一篇文章,这里不再多说。)

 

2.         文档惯例及隐含前提:

 

交叉编译器名称: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文件。

交叉编译场景分析(arm-linux)()--编译tslib

 

1.         基本信息:


软件名称

tslib

功能简述

tslib是一个触摸屏的库,它提供诸如滤波、去抖、校准之类的功能,为不同的触摸屏提供了一个统一的接口。

下载地址

export CVSROOT=: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.         构建处方

l         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"


 

交叉编译场景分析(arm-linux)()--编译zlib

 

1.         基本信息:


软件名称

zlib

功能简述

zlib 一个压缩解压程序库

下载地址

http://www.zlib.net/

软件版本

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.         构建处方

l         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"


交叉编译场景分析(arm-linux)()--编译readlinencurses

1.         基本信息:


软件名称

readline

功能简述

readline一个命令行编辑程序库

下载地址

http://directory.fsf.org/readline.html

软件版本

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.         构建处方

l         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.         构建处方

l         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"


交叉编译场景分析(arm-linux)()--编译libjpeglibpng

1.         基本信息:

软件名称

libjpeg

功能简述

libjpeg一个jpeg图形编码解码程序库

下载地址

http://www.photopost.com/jpegsrc.v6b.tar.gz

软件版本

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.         构建处方

l         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图形编码解码程序库

下载地址

http://www.libpng.org/pub/png/libpng.html

软件版本

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呢?设置一下环境变量CFLAGSLDFLAGS试试,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.         构建处方

l         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"


交叉编译场景分析(arm-linux)()--编译TinyX

 

1.         基本信息:


软件名称

TinyX

功能简述

TinyX是一个针对嵌入式系统设计的X Window,相对PC版的X Window而言,它占用的资源要少很多,服务器程序仅700K,客户端的动态库约2M(看你需要而定)多。

下载地址

http://www.xfree86.org

软件版本

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

 

编译成功!

 

其它说明:

l         若是2.6的内核,你可能要修改NR_KEYS的值为128,否则programs/Xserver/hw/tinyx/linux/keyboard.c里有内存越界问题,造成无法运行。

l         若运行时,发现触摸屏不能使用,修改programs/Xserver/hw/tinyx/linux/tslib.c的数组TsNames,加入你使用的触摸屏设备文件。若还是不行,检查一下tslib需要的环境变量是否设置正确。

 

 

3.         构建处方

l         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

 

#include <cross.rules>

 

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 HasExpat        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 UseX86Emu               NO

#define XF86INT10_BUILD         X86INT10_STUB

#define BuildAppgroup           NO

#define BuildDBE                NO

#define BuildLBX                NO

#define HasMTRRSupport          NO

#define UseX86Emu               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



交叉编译场景分析(arm-linux)()--编译sqlite

 

1.         基本信息:

软件名称

sqlite

功能简述

sqlite是一个针对嵌入式系统设计的数据库管理系统(DBMS),实现了SQL92的基本功能,ARM版的可执行文件约300K.

下载地址

http://www.sqlite.org/

软件版本

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_CCconfig_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.         构建处方

l         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"


交叉编译场景分析(arm-linux)()--编译glib

1.         基本信息:

软件名称

glib

功能简述

GlibGNOME的一个基础库,提供基本的容器、算法、对象系统、OSAPI的适配器等。

下载地址

http://www.gtk.org

软件版本

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_growsglib_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.         构建处方

l         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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值