Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->发行版专区 ->Gentoo ->正文

Bash 实例-探讨Gentoo ebuild系统

来源:IBM DW中国 作者:Daniel Robbins  时间:2007-04-22 点击: [收藏] [投稿]

已经做了很多改动,下面来回顾一下。首先,将编译和解包步骤放入各自的函数中,其函数名分别为 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 "${SRCDIR}" ]
    then
        ebuild_unpack
        fi
    cd ${SRCDIR}
    ./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. 如果在 "${SRCDIR}" 中有一个配置脚本,则按如下执行它:
    ./configure --prefix=/usr
    否则,跳过这步。
  2. 执行以下命令:
    make

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


拆成两个函数的 ebuild_compile()


user_compile() {
    #we're already in ${SRCDIR}
    if [ -e configure ]
    then
        #run configure script if it exists
        ./configure --prefix=/usr
    fi
    #run make
    make
}          
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
}

现在这样做的原因可能还不是很明显,但是,再忍耐一下。虽然这段代码与 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=${P}.tar.gz
 
user_compile() {
       ./configure --enable-elf-shlibs
       make
}

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

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2 34 5 下一页


上一篇:SPARC中怎么样安装Linux系统(Gentoo)   下一篇:构建一个 SELinux 就绪的 Gentoo 系统

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
· Gentoo 下LAMP 的安装和配置
· 一步一步教你装linux:gentoo从装笔记
· Gentoo Linux 1.4_rc4版本安装说明
·Gentoo 下LAMP 的安装和配置
·新手安装Xentoo(Xen+Gentoo)的极速体验
·构建一个 SELinux 就绪的 Gentoo 系统
·Bash 实例-探讨Gentoo ebuild系统
·SPARC中怎么样安装Linux系统(Gentoo)
·《Gentoo Linux 发行版》(Gentoo Linux)[ISO]
·Gentoo系统下LAMP的安装和配置简介
推荐文章
·发行版发布:Gentoox 5.0 对象是Xbo
·磨炼Gentoo的锋芒之十步骤实现基本
·《Gentoo Linux 发行版》(Gentoo Li
·新手安装Xentoo(Xen+Gentoo)的极速
· Gentoo 下LAMP 的安装和
·SPARC中怎么样安装Linux系统(Gentoo
·Bash 实例-探讨Gentoo ebuild系统
·Gentoo 下LAMP 的安装和配置
精彩文章
·Gentoo版Linux操作系统的前世今生
·SPARC中怎么样安装Linux系统(Gentoo
·Bash 实例-探讨Gentoo ebuild系统
·《Gentoo Linux 发行版》(Gentoo Li
·构建一个 SELinux 就绪的 Gentoo 系
·Gentoo 下LAMP 的安装和配置
· Gentoo 下LAMP 的安装和
·磨炼Gentoo的锋芒之只要敢想 就有Ge
·磨炼Gentoo的锋芒之十步骤实现基本
·Gentoo系统下LAMP的安装和配置简介
·新手安装Xentoo(Xen+Gentoo)的极速
· 一步一步教你装linux:gentoo从装
· Gentoo Linux 1.4_rc4版本安装说明
·发行版发布:Gentoox 5.0 对象是Xbo
Power by linux-cn.com 粤ICP备05006655号