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

    技术2022-05-19  24

    转自: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)