Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1867501
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: LINUX

2011-07-12 15:35:06

目录

------------------------------------

0.交叉编译环境的搭建

1.环境变量设置

2.busybox移植及根文件系统的构建

3.Xserver移植

4.matchbox移植

5.gtk移植

6.测试

0.交叉编译环境的搭建

-------------------------------------

所需要的交叉编译工具链:S3C6410X Tool Chain 4.2.2 - EABI V0.0 - cross-4.2.2-eabi.tar

0.1.解压上述工具链获得文件夹:4.2.2-eabi/

0.2.在/usr/local/下面创建目录arm/ (注意,最好是放到这个目录,不然在以后的编译过程中可能出现一些错误)

0.3.将目录4.2.2-eabi/移动到/usr/local/arm/下面

0.4.设置环境变量:

    编辑/etc/profile文件,在文件末尾添加:

        PATH="$PATH:/usr/local/arm/4.2.2-eabi/usr/bin"

        export PATH

    使环境变量生效:

        在终端输入命令: source /etc/profile

    测试环境变量是否设置成功:

        在终端输入:echo $PATH,如果输出的路径中包含了/usr/local/arm/4.2.2-eabi/usr/bin则说明环境变量设置成功

0.5.测试交叉编译工具链

    在终端输入:arm-linux-gcc -v

    显示如下:

    Using built-in specs.

    Target: arm-unknown-linux-gnueabi

    Configured with: /home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-unknown-linux-gnueabi --enable-languages=c,c++ --with-sysroot=/usr/local/arm/4.2.2-eabi/ --with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/usr/local/arm/4.2.2-eabi//gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t --with-float=soft --enable-cxx-flags=-msoft-float

    Thread model: posix

    gcc version 4.2.2

    说明交叉编译工具链已经安装成功。

0.6需要修正的库的位置(将libc从2.6替换成2.7版的)

从 下载    libc6-dbg_2.7-10ubuntu3-mojo1_arm.deb并解压拷贝对应的文件覆盖到工具链的对应位置

sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/usr/lib/gconv/*   /usr/local/arm/4.2.2-eabi/usr/lib/gconv

/

sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/  /usr/local/arm/4.2.2-eabi/lib/

1.环境变量设置

-------------------------------------

export PREFIX=/home/hanjinlai/Work/X/target/usr

export CC=arm-linux-gcc

export PKG_CONFIG_PATH=/home/hanjinlai/Work/X/target/usr/lib/pkgconfig

export LD_LIBRARY_PATH=/home/hanjinlai/Work/X/target/usr/lib

2.busybox移植

-------------------------------------

2.1.创建根文件系统目录rootfs及其子目录bin,sbin,boot,root,sys,srv,proc,usr等

2.2.编译busybox1.7.0:(所需要的源码包:busybox-1.7.0.tar.bz2)

    2.2.1解压源码包,进入源码目录;

    2.2.2配置busybox:在源码目录执行make menuconfig, 如果使用默认配置则直接退出、保存,如果需要配置自己的则更改相应的选项再保存退出。

              选上以下选项可以支持Tab补全功能

         Busybox Settings--->

                       Busybox Library Tuning--->

                                    [ ] Tab competion

    已经支持了mount nfs功能

    2.2.3修改源码目录的Makefile:

    将175行:  ARCH                     ?= $(SUBARCH)     修改为:  ARCH             ?= arm

    将176行: CROSS_COMPILE   ?=                             修改为: CROSS_COMPILE   ?=  arm-linux-

        2.2.4正式编译busybox:在源码目录执行make编译

    2.2.5安装busybox: 执行命令 make CONFIG_PREFIX=/***/rootfs(根文件系统目录) install

2.3.拷贝glibc库相关文件到根文件系统

    glibc相关库文件在交叉编译工具链中已经有了,可以直接拷贝过来用

    $ sudo cp /usr/local/arm/4.2.2-eabi/lib/*.so*  /***/rootfs/lib/   -d

    $ sudo cp /usr/local/arm/4.2.2-eabi/usr/arm-unknown-linux-gnueabi/lib/*.so*  /***/rootfs/lib/  -d

2.4.创建配置文件:

    2.4.1创建/etc/inittab, 内容如下:

                            # /etc/inittab

                            ::sysinit:/etc/init.d/rcS

                            ::askfirst:-/bin/sh

                            ::ctrlaltdel:/sbin/reboot

                            ::shutdown:/bin/umount -a -r

    2.4.2创建/etc/init.d/rcS,内容如下:(创建完成后改变其属性使它可以执行sudo chmod  +x  /etc/init.d/rcS)

        #!/bin/sh(这段脚本主要用来自动生成设备文件)

        #ifconfig eth0 192.168.1.17

        mount -a

        mkdir /dev/pts

        mount -t devpts devpts /dev/pts

        echo /sbin/mdev > /proc/sys/kernel/hotplug

        mdev -s

    2.4.3创建/etc/fstab文件,内容如下:

        # device     mount-point    type   options         dump  fsck order

        proc           /proc                  proc   defaults        0         0

        tmpfs          /tmp                  tmpfs  defaults       0         0

        sysfs          /sys                    sysfs  defaults        0         0

        tmpfs          /dev                   tmpfs  defaults       0         0

2.5.创建设备文件

                   在根文件系统的/dev目录下执行

                    $sudo mknod  console  c  5  1

                    $sudo mknod  null          c  1  3

                  这样我们的最基本的根文件系统就做好了。

2.6.测试已经制作好的根文件系统

    在 PC上安装mkcramfs包,以便可以制作cramfs格式的文件

    制作出根文件系统: $mkcramfs    /***/rootfs/       rootfs.cramfs

               烧录uboot,kernel,rootfs到开发板并重启开发板(如何烧录这些内容请参考第三节:内核及文件系统镜像的烧写)

              系统正常启动,并进入shell,测试成功。

2.7.测试基本的C程序在根文件系统的运行

                 在PC上写一个最简单的hello.c程序:

                            #include

                            int main()

                            {

                                    printf("hello!\n");

                                    return 0;

                               }

                   编译程序:$arm-linux-gcc -o hello hello.c

                  将编译出来的hello复制到根文件系统的/bin或/sbin或/usr/bin或/usr/sbin等任一目录

                  重新制作根文件系统镜像rootfs.cramfs

                  重新烧写根文件系统镜像到开发板

                  重启动开发板,进入shell,执行hello程序,显示hello!

                  测试成功。

3.Xserver移植

---------------------------------------

3.1移植ncurses-5.6

    $tar xzf ncurses.tar.gz

     $cd ncurses-5.6

    $./configure --host=arm-linux --with-shared --prefix=$PREFIX

    $make

    $make install

3.2移植libtool    

    $tar xzf libtool_1.5.6.orig.tar.gz

     $cd libtool_1.5.6

    $./configure --host=arm-linux --prefix=$PREFIX

    $make

    $make install

3.3移植zlib

    $tar xzf zlib-1.2.3.tar.gz

     $cd zlib-1.2.3

    $./configure --shared --prefix=$PREFIX

    $make

    $make install

3.4移植libpng

    $tar xjf libpng-1.2.23.tar.bz2

     $cd libpng-1.2.23

    $ ./configure --host=arm-linux --prefix=$PREFIX

    $make

    $make install

    

3.5移植expat

    $tar xzf expat-2.0.1.tar.gz

     $cd expat-2.0.1

    $./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX

    $make

    $make install

3.6移植freetype

    $tar xzf freetype-2.3.9.tar.gz

     $cd freetype-2.3.9

    $ ./configure --host=arm-linux --build=i386-linux --target=arm-linux --prefix=$PREFIX

    $make

    $make install

3.7移植libxml2.0

    $tar xzf libxml2-2.6.30.tar.gz

     $cd libxml2-2.6.30

    $ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX

    $make

    $make install

   

3.8移植fontconfig-2.6.0

    $tar xzf fontconfig-2.6.0.tar.gz

     $cd fontconfig-2.6.0

    $ ./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --disable-static --with-confdir=$PREFIX/etc/fonts --enable-libxml2 --with-arch=arm

    $make

    $make install

3.9移植libdrm

    $tar xjf libdrm-2.3.0.tar.bz2

     $cd libdrm-2.3.0

    $ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX

    $make

    $make install

3.10移植openssl

    $tar xjf openssl-0.9.8g.tar.gz

     $cd openssl-0.9.8g

    $./config --prefix=$PREFIX shared zlib-dynamic enable-camellia

    $make depend

    $make install

3.11移植Xserver(《参考于嵌入式linux应用开发完全手册》一书)

    X源码包:Xorg_git_20071119.tar.bz2,解压后进入源码目录

    使用util/modules/build.sh来对源码进行编译

    编译前的修改:

        修改X server的配置参数,生成Xfbdev:

        在    if test "$1" = "xserver" && test -n "$MESAPATH"; then

            MOD_SPECIFIC="--with-mesa-source=${MESAPATH}"

                fi

        后面添加

            if test "$1" = "xserver"; then

                MOD_SPECIFIC="${MOD_SPECIFIC} --enable-kdrive --enable-xfbdev

                    --disable-ipv6 \

                    --disable-xorg \

                    --disable-xnest \

                    --disable-xvfb \

                    --disable-xevie \

                    --disable-xwin \

                    --disable-xsdl \

                    --disable-xephyr \

                    --disable-xfake \

                    --disable-kdrive-vesa \

                --disable-dri"

                 fi

        注释掉一些不需要的软件:

        如:#build_doc,#build_mesa,#build_driver,#build_data,#build_util,

        #build app xdriinfo, #build app xprop, #build app xsm等

                   

        修改出错的地方:

        xserver/hw/kdrive/src/kaa.c:

        pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp);改为:

        pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp,usage_hint);

        xserver/hw/xfree86/modes/xf86Crtc.c:       

        在#include "xf86.h前一行添加" #include "xf86Priv.h"

       

        xserver/hw/xfree86/os-support/xf86_OSlib.h:

        删除#include

        添加#include

        添加屏幕分辨率的支持:xserver/hw/kdrive/src/kmode.c:

        在const KdMonitorTiming  kdMonitorTimings[]数组中添加需要的分辨率

            /* 800x480 modes */

            {    800,    480,    85,    56250,                /* VESA */

                    32,        152,    248,    KdSyncPositive, /* 53.674 */

                    1,        27,        31,        KdSyncPositive, /* 85.061 */

            },

            {    800,    480,    75,    49500,                /* VESA */

                    16,        160,    256,    KdSyncPositive, /* 46.875 */

                    1,        21,        25,        KdSyncPositive, /* 75.000 */

            },

            /* DEFAULT */

        #define MONITOR_TIMING_DEFAULT    9

            {    800,    480,    72,    50000,                /* VESA */

                    56,        64,        240,    KdSyncPositive, /* 48.077 */

                    37,        23,        66,        KdSyncPositive, /* 72.188 */

            },

            {    800,    480,    60,    40000,                /* VESA */

                    40,        88,        256,    KdSyncPositive, /* 37.879 */

                    1,        23,        28,        KdSyncPositive, /* 60.317 */

            },

            {    800,    480,    56,    36000,                /* VESA */

                    24,        128,    224,    KdSyncPositive, /* 35.156 */

                    1,        22,        25,        KdSyncPositive, /* 56.250 */

            }

    编译程序: $ ./util/modular/build.sh -b $PREFIX

    在编译libX11时要用到makekeys这个执行文件,但是这时是编译的arm文件,执行时报错,手动编译一个PC上能用的版本覆盖原来的文件gcc -o makekeys makekeys.c

4.mathcbox移植

--------------------------------------------------

4.1移植jpeg

    ./configure --build=i386-linux --host=arm-linux --target=arm-linux --enable-shared --enable-static --prefix=$PREFIX

4.2移植matchbox-window-manager-1.2和libmatchbox-1.9

5.gtk移植

---------------------------------------------------

5.1移植glib

   

   [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]# LIBS=`pkg-config --libs gthread-2.0` ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --cache-file=arm-linux.cache

5.2移植cairo

   $tar xjf cairo-1.8.0.tar.bz2

   $cd cairo-1.8.0

   $ ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --enable-pdf=yes --enable-xlib=yes --enable-xlib-xrender=yes --enable-ps=yes --enable-freetype --enable-png

   $make

   $make install

5.3移植pango

   $tar xjf pango-1.16.4.tar.bz2

   $cd pango-1.16.4

   $./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" CAIRO_CFLAGS="-I$PREFIX/include" CAIRO_LIBS="-L$PREFIX/lib" --prefix=$PREFIX

   $make

   $make install

5.4移植atk

   $tar xjf atk-1.9.1.tar.bz2

   $cd atk-1.9.1   

   $./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX

   $make

   $make install

5.5移植TIFF

   $tar xjf tiff-3.7.4.tar.bz2

   $cd tiff-3.7.4

   $./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX

   $make

   $make install

5.6移植gtk

   $tar xjf gtk-2.12.9.tar.bz2

   $cd gtk-2.12.9

   $ac_cv_func_XOpenDisplay=yes

   $ac_cv_func_XextFindDisplay=yes

   $ac_cv_func_XRenderQueryExtension=yes

   $./configure --prefix=$PREFIX --host=arm-linux --build=i386-linux --enable-shared=yes --enable-static=yes --without-libtiff --disable-xkb --disable-glibtest --with-gdktarget=x11 --with-xinput=yes --enable-display-migration --without-libjpeg

     修改config.h:

    #define HAVE_XCONVERTCASE 1

    /* #undef HAVE_XCONVERTCASE */

    #define HAVE_SHAPE_EXT 1

    /* #undef HAVE_SHAPE_EXT */    

    $make

    $make install

6.测试

-----------------------------------------------------

将编译安装后的结果拷贝到已经做好的基本的文件系统里面

在/etc/init.d/rcS中增加:

    #start Xserver

    Xfbdev -mouse mouse -keybd keyboard >/dev/null 2>&1 &

    #start matchbox-window-manager

    export HOME=/home

    export DISPLAY=:0.0

    sleep 1

    matchbox-window-manager &

启动系统可看到屏幕上X窗口和matchbox的指针

在超级终端里运行gtk-demo

显示出gtk-demo程序界面,移植成功。

注:测试前

确认 /usr/lib/xserver/SecurityPolicy 文件存在

确认 /usr/etc/gtk-2.0/gdk-pixbuf.loaders 文件存在

    {/usr/bin/gdk-pixbuf-query-loaders > gdk-pixbuf.loaders 来生成}

确认 /usr/etc/pango/pango.modules 文件存在

    {/usr/bin/pango-querymodules > pango.modules 来生成。

    此文件会把pango+modules的相关资料调入/usr/lib/pango/1.16.4/modules中}

阅读(1285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~