Cited from http://hi.baidu.com/zengzhaonong/blog/item/4b901ee9b5ef343cb90e2d16.html

来源:互联网 发布:阿里云阿里巴巴矢量图 编辑:程序博客网 时间:2024/06/15 02:53
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/to olchain_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版的) 

   从http://repository.handhelds.org/hasty-armv6el-vfp/ pool/main/g/glibc/ 下载 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-gn ueabi/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 <stdio.h> 

  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 <sys/kd.h> 

  添加#include <linux/kd.h> 

  添加屏幕分辨率的支持: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中}

Cited from: http://www.ispcs.cn/view-75003-4.html

原创粉丝点击