手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Bash 实例-探讨Gentoo ebuild系统

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

配置文档

现在为止,已讲了很多不方便的 bash 技术,现在再讲一个。通常,假如程式在 /etc 中有一个配置文档是很方便的。幸运的是,用 bash 做到这点很容易。只需创建以下文档,然后并其存为 /etc/ebuild.conf 即可:


/ect/ebuild.conf



            # /etc/ebuild.conf: set system-wide ebuild options in this file

            # MAKEOPTS are options passed to make

            MAKEOPTS="-j2"

            

在该例中,只包括了一个配置选项,但是,您能够包括更多。bash 的一个妙处是:通过执行该文档,就能够对他进行语法分析。在大多数解释型语言中,都能够使用这个设计窍门。执行 /etc/ebuild.conf 之后,在 ebuild 脚本中定义 "$MAKEOPTS"。将利用他允许用户向 make 传递选项。通常,将使用该选项来允许用户告诉 ebuild 执行 并行 make。

什么是并行 make?

为了提高多处理器系统的编译速度,make 支持并行编译程式。这意味着,make 同时编译用户指定数目的源文档(以便使用多处理器系统中的额外处理器),而不是一次只编译一个源文档。通过向 make 传递 -j # 选项来启用并行 make,如下所示:

make -j4 MAKE="make -j4"

这行代码指示 make 同时编译四个程式。 MAKE="make -j4" 自变量告诉 make,向其启动的任何子 make 进程传递 -j4 选项。

这里是 ebuild 程式的最终版本:


ebuild,最终版本



            #!/usr/bin/env bash

            if [ $# -ne 2 ]

            then

            echo "Please specify ebuild file and unpack, compile or all"

            exit 1

            fi

            source /etc/ebuild.conf

            if [ -z "$DISTDIR" ]

            then

            # set DISTDIR to /usr/src/distfiles if not already set

            DISTDIR=/usr/src/distfiles

            fi

            export DISTDIR

            ebuild_unpack() {

            #make sure we're in the right directory

            cd ${ORIGDIR}

            if [ -d ${WORKDIR} ]

            then

            rm -rf ${WORKDIR}

            fi

            mkdir ${WORKDIR}

            cd ${WORKDIR}

            if [ ! -e ${DISTDIR}/${A} ]

            then

            echo "${DISTDIR}/${A} does not exist.  Please download first."

            exit 1

            fi

            tar xzf ${DISTDIR}/${A}

            echo "Unpacked ${DISTDIR}/${A}."

            #source is now correctly unpacked

            }

            user_compile() {

            #we're already in ${SRCDIR}

            if [ -e configure ]

            then

            #run configure script if it exists

            ./configure --prefix=/usr

            fi

            #run make

            make $MAKEOPTS MAKE="make $MAKEOPTS"

            }

            ebuild_compile() {

            if [ ! -d "${SRCDIR}" ]

            then

            echo "${SRCDIR} does not exist -- please unpack first."

            exit 1

            fi

            #make sure we're in the right directory

            cd ${SRCDIR}

            user_compile

            }

            export ORIGDIR=`pwd`

            export WORKDIR=${ORIGDIR}/work

            if [ -e "$1" ]

            then

            source $1

            else

            echo "Ebuild file $1 not found."

            exit 1

            fi

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

            case "${2}" in

            unpack)

            ebuild_unpack

            ;;

            compile)

            ebuild_compile

            ;;

            all)

            ebuild_unpack

            ebuild_compile

            ;;

            *)

            echo "Please specify unpack, compile or all as the second arg"

            exit 1

            ;;

            esac

            

请注意,在文档的开始部分执行 /etc/ebuild.conf。另外,还要注意,在缺省 user_compile() 函数中使用 "$MAKEOPTS"。您可能在想,这管用吗 - 毕竟,在执行实际上事先定义 "$MAKEOPTS" 的 /etc/ebuild.conf 之前,我们引用了 "$MAKEOPTS"。对我们来说幸运的是,这没有问题,因为变量扩展只在执行 user_compile() 时才发生。在执行 user_compile() 时,已执行了 /etc/ebuild.conf,并且 "$MAKEOPTS" 也被配置成正确的值。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!