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

Bash 实例,第 3 部分

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

已做了很多改变,下面来回顾一下。首先,将编译和解包步骤放入各自的函数中,其函数名分别为 ebuild_compile() 和 ebuild_unpack()。这是个好的步骤,因为代码正变得越来越复杂,而新函数提供了一定的模块性,使代码更有条理。在每个函数的第一行,显式 "cd" 到想要的目录,因为,随着代码变得越来越模块化而不是线形化,出现疏忽而在错误的当前工作目录中执行函数的可能性也变大。"cd" 命令显式地使我们处于正确的位置,并防止以后出现错误 - 这是重要的步骤,特别是在函数中删除文档时更是如此。

另外,还在 ebuild_compile() 函数的开始处添加了一个有用的检查。现在,他检查以确保 "$SRCDIR" 存在,假如不存在,则打印一条告诉用户首先解包档案然后退出的错误消息。假如愿意,能够改变这种行为,以便在 "$SRCDIR" 不存在的情况下,ebuild 脚本将自动解包源代码档案。能够用以下代码替换 ebuild_compile() 来做到这点:

ebuild_compile() 上的新代码


ebuild_compile() {

    #make sure we're in the right directory  

    if [ ! -d "$" ]

    then

        ebuild_unpack

        fi

    cd $

    ./configure --prefix=/usr

    make     

}

ebuild 脚本第二版中最明显的改变之一就是代码末尾新的 case 语句。这条 case 语句只是检查第二个命令行自变量,然后根据其值执行正确操作。假如现在输入:

$ ebuild sed-3.02.ebuild

就会得到一条错误消息。现在需要告诉 ebuild 做什么,如下所示:

$ ebuild sed-3.02.ebuild unpack

$ ebuild sed-3.02.ebuild compile

$ ebuild sed-3.02.ebuild all

假如提供上面所列之外的第二个命令行自变量,将得到一条错误消息(* 子句),然后,程式退出。

使代码模块化
既然代码很高级并且实用,您可能很想创建几个更高级的 ebuild 脚本,以解包和编译所喜爱的程式。假如这样做,迟早会碰到一些不使用 autoconf ("./configure") 的源代码,或可能碰到其他使用非标准编译过程的脚本。需要再对 ebuild 系统做一些改变,以适应这些程式。但是在做之前,最好先想一下如何完成。

将 "./configure --prefix=/usr; make" 硬编码到编译阶段的妙处之一是:大多数时候,他能够正确工作。但是,还必须使 ebuild 系统适应那些不使用 autoconf 或正常 make 文档的源代码。要解决这个问题,建议 ebuild 脚本缺省执行以下操作:

  1. 假如在 "$" 中有一个配置脚本,则按如下执行他:
    ./configure --prefix=/usr
    否则,跳过这步。
  2. 执行以下命令:
    make

既然 ebuild 只在 configure 实际存在时才运行他,现在能够自动地适应那些不使用 autoconf 但有标准 make 文档的程式。但是,在简单的 "make" 对某些源代码无效时该怎么办?需要一些处理这些情况的特定代码来覆盖合理的缺省值。要做到这一点,将把 ebuild_compile() 函数转换成两个函数。第一个函数(可将其当成“父”函数)的名称仍是 ebuild_compile()。但是,将有一个名为 user_compile() 的新函数,该函数只包含合理的缺省操作:

拆成两个函数的 ebuild_compile()


user_compile() {

    #we're already in $

    if [ -e configure ]

    then

        #run configure script if it exists

        ./configure --prefix=/usr

    fi

    #run make

    make

}          



ebuild_compile() {

    if [ ! -d "$" ]

    then

        echo "$ does not exist -- please unpack first."

        exit 1

    fi

    #make sure we're in the right directory  

    cd $

    user_compile

}

现在这样做的原因可能还不是很明显,但是,再忍耐一下。虽然这段代码和 ebuild 前一版的工作方式几乎相同,但是现在能够做一些以前无法做的 -- 能够在 sed-3.02.ebuild 中覆盖 user_compile()。因此,假如缺省的 user_compile() 不满足需要,能够在 .ebuild 文档中定义一个新的,使其包含编译包所必需的命令。例如,这里有一个 e2fsprogs-1.18 的 ebuild 文档,他需要一个略有不同的 "./configure" 行:

e2fsprogs-1.18.ebuild


#this ebuild file overrides the default user_compile()

P=e2fsprogs-1.18

A=$.tar.gz

 

user_compile() {

       ./configure --enable-elf-shlibs

       make

}

现在,将完全按照我们希望的方式编译 e2fsprogs。但是,对于大多数包来说,能够省略 .ebuild 文档中的任何定制 user_compile() 函数,而使用缺省的 user_compile() 函数。

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