LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 786|回复: 7

ebuild-lfs

[复制链接]
发表于 2003-3-8 16:18:42 | 显示全部楼层 |阅读模式
即将第二次安装LFS,就搞点新鲜的玩意吧。
注:下面的代码是抄袭了gentoo的代码和下面这篇文章,并非原创!
http://www-900.ibm.com/developerWorks/cn/linux/shell/bash/bash-3/index.shtml

ebuild脚本:

  1. #!/bin/bash

  2. if [ $# -ne 2 ]
  3. then
  4.     echo "Please specify ebuild file and unpack, compile, clean or all"
  5.     exit 1
  6. fi

  7. source ./ebuild.conf

  8. if [ -z "$DISTDIR" ]
  9. then
  10.     DISTDIR=`pwd`
  11. fi
  12. export DISTDIR

  13. unpack() {
  14.     local x
  15.     local y
  16.     local myfail

  17.     for x in $@
  18.     do
  19.         myfail="failure unpacking ${x}"
  20.         echo ">>> Unpacking ${x} to $(pwd)"
  21.         y="$(echo $x | sed 's:.*\.\(tar\)\.[a-zA-Z0-9]*:\1:')"
  22.         case "${x##*.}" in
  23.         tar)
  24.             tar x --no-same-owner -f ${DISTDIR}/${x} || exit 1
  25.             ;;
  26.         tgz)
  27.             tar xz --no-same-owner -f ${DISTDIR}/${x} || exit 1
  28.             ;;
  29.         tbz2)
  30.             tar xj --no-same-owner -f ${DISTDIR}/${x} || exit 1
  31.             ;;
  32.         ZIP|zip)
  33.             unzip -qo ${DISTDIR}/${x} || exit 1
  34.             ;;
  35.         gz|Z|z)
  36.             if [ "${y}" == "tar" ]; then
  37.                 tar xz --no-same-owner -f ${DISTDIR}/${x} || exit 1
  38.             else
  39.                 gzip -dc ${DISTDIR}/${x} > ${x%.*} || exit 1
  40.             fi
  41.             ;;
  42.         bz2)
  43.             if [ "${y}" == "tar" ]; then
  44.                 tar xj --no-same-owner -f ${DISTDIR}/${x} || exit 1
  45.             else
  46.                 bzip2 -dc ${DISTDIR}/${x} > ${x%.*} || exit 1
  47.             fi
  48.             ;;

  49.         *)
  50.             echo "unpack ${x}: file format not recognized. Ignoring."
  51.             ;;
  52.         esac
  53.     done
  54. }

  55. econf() {
  56.     if [ -x ./configure ] ; then
  57.         ./configure \
  58.             --prefix=/usr \
  59.             "$@" || exit 1
  60.     else
  61.         echo "no configure script found"
  62.     fi
  63. }

  64. emake() {
  65.     if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
  66.         make "$@" || exit 1
  67.     else
  68.         echo "no Makefile found"
  69.     fi
  70. }

  71. einstall() {
  72.     if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
  73.         make "$@" install || exit 1
  74.     else
  75.         echo "no Makefile found"
  76.     fi
  77. }

  78. src_unpack() {
  79.     #make sure we're in the right directory
  80.     cd ${ORIGDIR}
  81.    
  82.     if [ -d ${WORKDIR} ]
  83.     then   
  84.         rm -rf ${WORKDIR}
  85.     fi

  86.     mkdir ${WORKDIR}
  87.     cd ${WORKDIR}
  88.     if [ ! -e ${DISTDIR}/${A} ]
  89.     then
  90.         echo "${DISTDIR}/${A} does not exist.  Please download first."
  91.         exit 1
  92.     fi
  93.     unpack ${A}
  94.     echo "Unpacked ${DISTDIR}/${A}."
  95.     #source is now correctly unpacked
  96. }

  97. src_compile() {
  98.     if [ ! -d "${SRCDIR}" ]
  99.     then
  100.         echo "${SRCDIR} does not exist -- please unpack first."
  101.         exit 1
  102.     fi
  103.         #make sure we're in the right directory  
  104.     cd ${SRCDIR}
  105.     econf
  106.     emake
  107.     einstall
  108.     return
  109. }

  110. src_clean() {
  111.     cd ${ORIGDIR}
  112.     if [ -d ${WORKDIR} ]
  113.     then   
  114.         rm -rf ${WORKDIR}
  115.     fi
  116. }

  117. export ORIGDIR=`pwd`
  118. export WORKDIR=${ORIGDIR}/work

  119. if [ -e "$1" ]
  120. then
  121.     source $1
  122. else
  123.     echo "Ebuild file $1 not found."
  124.     exit 1
  125. fi

  126. export SRCDIR=${WORKDIR}/${P}

  127. case "${2}" in
  128.     unpack)
  129.         src_unpack
  130.         ;;
  131.     compile)
  132.         src_compile
  133.         ;;
  134.     clean)
  135.         src_clean
  136.         ;;
  137.     all)
  138.         src_unpack
  139.         src_compile
  140.         src_clean
  141.         ;;
  142.     *)
  143.         echo "Please specify unpack, compile, clean or all as the second arg"
  144.         exit 1
  145.         ;;
  146. esac
复制代码
 楼主| 发表于 2003-3-8 16:20:28 | 显示全部楼层
ebuild.conf

  1. LFS=/mnt/lfs
  2. CC='gcc -s'
  3. CHOST="i686-pc-linux-gnu"
  4. CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer -ffast-math  -funroll-loops -fforce-addr -falign-functions=4"
  5. CXXFLAGS="${CFLAGS}"
  6. export LFS CC CHOST CFLAGS CXXFLAGS
复制代码
 楼主| 发表于 2003-3-8 16:27:45 | 显示全部楼层
bash-2.05b-static.ebuild

  1. P=bash-2.05b
  2. A=${P}.tar.gz
  3. econf() {
  4. ./configure --enable-static-link \
  5.     --prefix=$LFS/static --with-curses
  6. }
复制代码


你可以按照上面的格式写你的ebuild文件。
如果源码需要打patch,就重写unpack()
如果make和make install 需要加上其他的选项的话,就重写emake()和einstall()。太体上就是这样。
 楼主| 发表于 2003-3-8 16:32:32 | 显示全部楼层
最后就是makestatic.sh:

  1. ./ebuild bash-2.05b-static.ebuild all &&
  2. ....#在这里加上其他的ebuild
复制代码

由于本人刚学linux,基础较差,如有错误之处,还望各位大侠多多包涵。
发表于 2003-3-8 18:58:20 | 显示全部楼层
文件后缀名挺有意思的,呵呵!
 楼主| 发表于 2003-3-10 12:25:09 | 显示全部楼层
为什么我不能修改我发表的帖子?已经过了时限了啊!
改正一下错误之处:
先是ebuild脚本,在src_clean()中的if语句前加上cd ${ORIGDIR}确保在正确的目录。
再是ebuild.conf里面要export LFS CC CHOST CFLAGS CXXFLAGS才能使用优化参数。
还有就是makestatic.sh里调用./ebuild时少了个参数,改为
./ebuild bash-2.05b-static.ebuild all &&

错误多多,望各位老兄不要见怪。呵呵~
不过,各位老兄好象不喜欢的说~郁闷!
发表于 2003-3-10 12:52:15 | 显示全部楼层
不是啊,以前flaboy写过一个,和你的不太一样,不过想法差不多的,呵呵,我们都记下来了!
发表于 2003-3-11 13:34:31 | 显示全部楼层
crazythink兄,你说说我们能不能把你的脚本和flaboy的脚本结合一下,把各种情况考虑好,比如:编译时出错,还有编译的记录,编译的顺序。把这些做好,咱们就能推出自己的小发行版了,呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表