WEB开发网
开发学院软件开发Shell Bash 实例:探讨 ebuild 系统 阅读

Bash 实例:探讨 ebuild 系统

 2009-06-30 04:46:00 来源:WEB开发网   
核心提示: 使代码通用 虽然可以使用这个自动编译脚本,但它不是很灵活,Bash 实例:探讨 ebuild 系统(2),基本上,bash 脚本只包含在命令行输入的所有命令列表,将添加一条 case 语句,该语句将测试 "$2",虽然可以使用这种解决方案,但是

使代码通用
   虽然可以使用这个自动编译脚本,但它不是很灵活。基本上,bash 脚本只包含在命令行输入的所有命令列表。虽然可以使用这种解决方案,但是,最好做一个只通过更改几行就可以快速解包和编译任何包的适用脚本。这样,包维护人员将新包添加到发行版所需的工作就大为减少。让我们先尝试一下使用许多不同的环境变量来完成,使构建脚本更加适用:

新的、更通用的脚本

#!/usr/bin/env bash# P is the package nameP=sed-3.02
# A is the archive nameA=${P}.tar.gzexport
ORIGDIR=`pwd`export WORKDIR=${ORIGDIR}/workexport
SRCDIR=${WORKDIR}/${P}if [ -z "$DISTDIR" ]then
# set DISTDIR to /usr/src/distfiles if not already set
DISTDIR=/usr/src/distfilesfiexport DISTDIRif [ -d ${WORKDIR} ]then
# remove old work directory if it exists
rm -rf ${WORKDIR}
fimkdir ${WORKDIR}
cd ${WORKDIR}tar
xzf ${DISTDIR}/${A}cd ${SRCDIR}./configure --prefix=/usrmake

已经向代码中添加了很多环境变量,但是,它基本上还是执行同一功能。但是,如果现在要要编译任何标准的 GNU 基于 autoconf 的源代码 tar 压缩包,只需简单地将该文件复制到一个新文件(用合适的名称来反映它所编译的新包名),然后将 "$A" 和 "$P" 的值更改成新值即可。所有其它环境变量都自动调整成正确设置,并且脚本按预想工作。虽然这很方便,但是代码还有改进余地。这段代码比我们开始创建的 "transcript" 脚本要长很多。既然任何编程项目的目标之一是减少用户复杂度,所以最好大幅度缩短代码,或者至少更好地组织代码。可以用一个巧妙的方法来做到这点 -- 将代码拆成两个单独文件。将该文件存为 "sed-3.02.ebuild":

sed-3.02.ebuild

#the sed ebuild file -- very simple!P=sed-3.02A=${P}.tar.gz   

第一个文件不重要,只包含那些必须在每个包中配置的环境变量。下面是第二个文件,它包含操作的主要部分。将它存为 "ebuild",并使它成为可执行文件:

ebuild 脚本

#!/usr/bin/env bashif [ $# -ne 1 ]then     
echo "one argument expected."
exit 1fiif [ -e "$1" ]then
source $1else
echo "ebuild file $1 not found."
exit 1fiexport ORIGDIR=`pwd`export
WORKDIR=${ORIGDIR}/workexport SRCDIR=${WORKDIR}/${P}if [ -z "$DISTDIR" ]then
# set DISTDIR to /usr/src/distfiles if not already set
DISTDIR=/usr/src/distfilesfiexport DISTDIRif [ -d ${WORKDIR} ]then
# remove old work directory if it exists
rm -rf ${WORKDIR}
fimkdir ${WORKDIR}
cd ${WORKDIR}tar
xzf ${DISTDIR}/${A}cd ${SRCDIR}./configure --prefix=/usrmake

既然已经将构建系统拆成两个文件,我敢打赌,您一定在想它的工作原理。基本上,要编译 sed,输入:

$ ./ebuild sed-3.02.ebuild

当执行 "ebuild" 时,它首先试图 "source" 变量 "$1"。这是什么意思?还记得 前一篇文章所讲的吗:"$1" 是第一个命令行自变量 -- 在这里,是 "sed-3.02.ebuild"。在 bash 中,"source" 命令从文件中读入 bash 语句,然后执行它们,就好象它们直接出现在 "source" 命令所在的文件中一样。因此,"source ${1}" 导致 "ebuild" 脚本执行在 "sed-3.02.ebuild" 中定义 "$P" 和 "$A" 的命令。这种设计更改确实方便,因为如果要编译另一个程序,而不是 sed,可以简单地创建一个新的 .ebuild 文件,然后将其作为自变量传递给 "ebuild" 脚本。通过这种方式,.ebuild 文件最终非常简单,而将 ebuild 系统复杂的操作部分存在一处,即 "ebuild" 脚本中。通过这种方式,只需编辑 "ebuild" 脚本就可以升级或增强 ebuild 系统,同时将实现细节保留在 ebuild 文件之外。这里有一个 gzip 的样本 ebuild 文件:

gzip-1.2.4a.ebuild

#another really simple ebuild script!P=gzip-1.2.4aA=${P}.tar.gz

添加功能性
   好,我们正在取得进展。但是,我还想添加某些额外功能性。我希望 ebuild 脚本再接受一个命令行自变量:"compile"、"unpack" 或 "all"。这个命令行自变量告诉 ebuild 脚本要执行构建过程的哪一步。通过这种方式,可以告诉 ebuild 解包档案,但不进行编译(以便在开始编译之前查看源代码档案)。要做到这点,将添加一条 case 语句,该语句将测试 "$2",然后根据其值执行不同操作。代码如下:

 

上一页  1 2 3 4 5  下一页

Tags:Bash 实例 探讨

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接