另外,还在 ebuild_compile() 函数的开始处添加了一个有用的检查。现在,他检查以确保 "$SRCDIR" 存在,假如不存在,则打印一条告诉用户首先解包档案然后退出的错误消息。假如愿意,能够改变这种行为,以便在 "$SRCDIR" 不存在的情况下,ebuild 脚本将自动解包源代码档案。能够用以下代码替换 ebuild_compile() 来做到这点:
ebuild_compile() 上的新代码
|
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 脚本缺省执行以下操作:
- 假如在 "$" 中有一个配置脚本,则按如下执行他:
./configure --prefix=/usr
否则,跳过这步。 - 执行以下命令:
make
既然 ebuild 只在 configure 实际存在时才运行他,现在能够自动地适应那些不使用 autoconf 但有标准 make 文档的程式。但是,在简单的 "make" 对某些源代码无效时该怎么办?需要一些处理这些情况的特定代码来覆盖合理的缺省值。要做到这一点,将把 ebuild_compile() 函数转换成两个函数。第一个函数(可将其当成“父”函数)的名称仍是 ebuild_compile()。但是,将有一个名为 user_compile() 的新函数,该函数只包含合理的缺省操作:
拆成两个函数的 ebuild_compile()
|
现在这样做的原因可能还不是很明显,但是,再忍耐一下。虽然这段代码和 ebuild 前一版的工作方式几乎相同,但是现在能够做一些以前无法做的 -- 能够在 sed-3.02.ebuild 中覆盖 user_compile()。因此,假如缺省的 user_compile() 不满足需要,能够在 .ebuild 文档中定义一个新的,使其包含编译包所必需的命令。例如,这里有一个 e2fsprogs-1.18 的 ebuild 文档,他需要一个略有不同的 "./configure" 行:
e2fsprogs-1.18.ebuild
|
现在,将完全按照我们希望的方式编译 e2fsprogs。但是,对于大多数包来说,能够省略 .ebuild 文档中的任何定制 user_compile() 函数,而使用缺省的 user_compile() 函数。
ebuild 脚本又怎样知道要使用哪个 user_compile() 函数呢?实际上,这很简单。ebuild 脚本中,在执行 e2fsprogs-1.18.ebuild 文档之前定义缺省 user_compile() 函数。假如在 e2fsprogs-1.18.ebuild 中有一个 user_compile(),则他覆盖前面定义的缺省版本。假如没有,则使用缺省 user_compile() 函数。
这是好工具,我们已添加了很多灵活性,而无需任何复杂代码(假如无需的话)。在这里就不讲了,但是,还应该对 ebuild_unpack() 做类似修改,以便用户能够覆盖缺省解包过程。假如要做任何修补,或文档包含在多个档案中,则这很方便。更有个好主意是修改解包代码,以便他能够缺省识别由 bzip2 压缩的 tar 压缩包。
配置文档
现在为止,已讲了很多不方便的 bash 技术,现在再讲一个。通常,假如程式在 /etc 中有一个配置文档是很方便的。幸运的是,用 bash 做到这点很容易。只需创建以下文档,然后并其存为 /etc/ebuild.conf 即可:
/ect/ebuild.conf




