⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 153.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 5 页
字号:
    例如某描述文件的文件段中有这么三行:<br>
    /root/readme<br>
    %docdir /root<br>
    /root/mydoc.txt<br>
    <br>
    此例指明/root为说明文档的前缀,因为/root/mydoc.txt在%docdir的下一行,所以RPM打包时会设定此文件的类型为说明文档。而/root/readme文件则不做此设定,因为它在%docdir定义之前。<br>
    通过此修饰符,用户可以很方便地设定说明文档一类的文件,因为它们通常固定在某个目录下面,有着共同的前缀。<br>
    * %dir :<br>
    RPM在制作软件包时,如果要打包的文件是个目录,那么RPM会将该目录下面的所有文件包含到软件包中。(注意:如果要打包的文件是个符号连接,此符号连接又指向一个目录,则RPM并不会将其视作目录,只会把它当为普通文件处理。)如果仅想将这个目录名包含到软件包中,制作者用此修饰符修饰一下这个目录名就行了。<br>
    如: /etc是个系统目录,其下有多个文件,如果想将其均加入包中,描述文件的文件段里可写上这么一行:<br>
    /etc<br>
    如果仅想包含此目录,则可用:<br>
    %dir /etc<br>
    <br>
    <br>
    (3) 另类修饰符<br>
    此类只有一个%defattr。说它是另类修饰符,是由于它设定的是默认的文件属性,而非特定的某个文件。它一般放在文件段内容的第一行。<br>
    其使用格式为:<br>
    %defattr(权限,属主,属组)<br>
    <br>
    其中: 权限,属主和属组都可以使用减号(-)。使用减号的属性将由系统设定。<br>
    例如: %defattr(022,zzz,zhsoft) 设定其后的所有文件权限为022,属主为zzz,属组为zhsoft;又如: %defattr(-,zzz,-) 则是设定其后的所有文件属主为zzz,权限与属组由系统设置。<br>
    可选的功能段<br>
    描述文件中,可选功能段的内容都是些脚本程序。(LZE描述文件中多个脚本程序中仅含一个echo命令)<br>
    可选的功能段的描述格式为:<br>
    功能段名 [子包选项]<br>
    <br>
    注: 子包选项为"[-n] 子包名"。当无子包选项时,段内容描述的是父包的脚本程序。当有子包选项时,段内容则是描述子包的脚本程序。<br>
    <br>
    可选的功能段可分为如下三类:<br>
    1. 建包用功能段:<br>
    RPM通过源程序来建立一个软件包时,要执行预处理,编译,安装和清理四项操作,分别对应于%prep,%build,%install和%clean四个段。<br>
    下面按其执行顺序逐段进行说明:<br>
    1.1 %prep :<br>
    此为预处理段,其内容为预处理脚本程序。该程序完成以下任务:<br>
    * 建立软件编译用目录;<br>
    * 将源程序解压缩;<br>
    * 通过打补丁,升级源程序;<br>
    * 执行其它一些操作,使源程序随时可进行编译。<br>
    在此脚本程序中,可使用如下两个宏命令:<br>
    1.1.1 %setup<br>
    这个宏利用系统中的gzip与tar等命令,来解压源程序包。RPM会自动探测源程序包是否压缩,如果压缩,它会用gzip将其解压缩,否则直接用tar命令展开包中文件。其使用格式为:<br>
    %setup [-n name] [-c] [-D] [-T] [-b N] [-a N]<br>
    <br>
    注: []所括为可选项。<br>
    (1) 当没有任何选项时:<br>
    这个宏用来解压默认的源程序包(由文件头Source或Source0域指定)。注意:源程序包中的文件应用"软件名-版本号"作为其上层目录,这样%setup宏就可以正常工作。如果不以"软件名-版本号"作为其上层目录,则%setup宏工作时有一个指令"cd 软件名-版本号"(转目录)会因为系统中没有此目录而出错退出(除非在此宏上面加上建立此目录的命令)。如LZE软件源程序所在的目录为lze-6.0,我需要用命令"tar cvzf lze-6.0-2.src.tgz lze-6.0"将源程序打包并压缩,这样的包就可以被%setup宏正确使用了。<br>
    下面是%setup宏命令所执行的一系列命令: (指令前面为行号)<br>
    1 cd /usr/src/dist/BUILD<br>
    2 echo "预处理脚本程序(prep)开始执行"<br>
    3 cd /usr/src/dist/BUILD<br>
    4 rm -rf lze-6.0<br>
    5 /bin/gzip -dc /usr/src/dist/SOURCES/lze-6.0-2.src.tgz | tar -xvvf -<br>
    6 STATUS=$?<br>
    7 if [ $STATUS -ne 0 ]; then<br>
    8exit $STATUS<br>
    9 fi<br>
    10 cd lze-6.0<br>
    11 [ `/usr/bin/id -u` = '0' ] && /bin/chown -Rhf root .<br>
    12 [ `/usr/bin/id -u` = '0' ] && /bin/chgrp -Rhf root .<br>
    13 /bin/chmod -Rf a+rX,g-w,o-w .<br>
    14 exit 1<br>
    <br>
    看,第10行就有一个转到lze-6.0目录的命令,如果没有这个目录,程序就会出错退出了。也许你要问:这些指令你是怎么知道的?其实这很简单,只要在%setup宏下面加上一句"exit 1"命令,让预处理脚本程序非正常退出即可。这样RPM所执行的预处理脚本程序作为临时文件在其退出时并未删除,只要看一下这个文件(在/var/tmp目录下以rpm-tmp开头)就知道%setup宏命令做什么了。<br>
    <br>
    (2) -n name :<br>
    上面已经谈到,源程序包中的文件应采用"软件名-版本号"作为上层目录。如果用了别的什么目录(如name),%setup宏无法正常工作,那该怎么办?没关系,可以用-n选项,引用一下这个目录(name)就行了。假如我的LZE源程序包中的文件是以lze为上层目录,那么我就可以用"%setup -n lze"宏命令来解压缩该包。<br>
    <br>
    (3) -c :<br>
    此选项的作用是创建上层目录("软件名-版本号"目录)并转到这个目录。对于LZE软件,其效果相当于在上例的第4行与第5行之间加上这么两行命令:<br>
    mkdir -p lze-6.0<br>
    cd lze-6.0<br>
    它适用的情况是:有的源程序包是在源程序所在目录下打的包,所以其中的文件都没有上层目录。这样的话,要想正确解压,必须创建上层目录。<br>
    <br>
    (4) -D :<br>
    本选项的作用是在解压源程序包之前不要删除软件的上层目录(软件名-版本号)。在上例中,其效果是不执行第4行的命令(rm -rf lze-6.0)。<br>
    <br>
    (5) -T :<br>
    本选项的作用是不解压默认的源程序包(由文件头的Source或Source0域所定义)。在上例中,其效果是不执行第5-9行的命令:第5行是解压源程序包(用gzip -dc将包的内容解压缩到管道中,再由tar -xvvf -从管道中读取数据并展开),第6-9行是检查解压命令的返回值,非0时执行非正常退出。<br>
    <br>
    (6) -b N :<br>
    本选项指示RPM在转到上层目录前解压第N个源程序包(由文件头SourceN域定义)。这适用于含上层目录的源程序包。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-b选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。<br>
    下面的宏命令仅解压第1个源程序包,然后转到上层目录:<br>
    %setup -b 1 -T<br>
    <br>
    (7) -a N :本选项指示RPM在转到上层目录后再解压第N个源程序包(由文件头SourceN域定义)。这适用于不含上层目录的源程序包。使用本选项时,一般加上-c选项,以创建上层目录并转到此目录。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-a选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。<br>
    <br>
    下面的宏命令让RPM先转到上层目录,再仅解压第2个源程序包:<br>
    %setup -T -a 2<br>
    1.1.2 %patch<br>
    此宏利用系统中的patch命令,来给指定的源程序包打补丁,从而将程序升级。其使用格式为:<br>
    %patch [-P N] [-p N] [-b name] [-E]<br>
    注: []所括为可选项。<br>
    为了说明下列选项的作用,我们为LZE软件包描述文件中定义三个补丁文件:<br>
    Patch0 : lze-patch.zero<br>
    Patch1 : lze-patch.one<br>
    Patch2 : lze-patch.three<br>
    <br>
    (1) 当没有任何选项时:<br>
    没有任何选项时,该宏使用的是默认的补丁文件(第0个补丁文件),即由文件头Patch或Patch0域所定义的文件(LZE包使用lze-patch.zero)。<br>
    该宏在执行时,扩展为以下指令:<br>
    echo "Patch #0:"<br>
    patch -p0 -s &lt; /usr/src/dist/SOURCES/lze-patch.zero<br>
    注: 第一行指令是利用echo命令向屏幕输出字符串“Patch #0:”。第二行指令则是利用patch命令读取补丁文件lze-patch.zero升级源程序。<br>
    patch命令用了两个选项:(有关patch命令用法,详见其用户手册)<br>
    * -p : 这个选项用于确定patch所要操作的文件。它针对补丁文件头部的文件名,删除名字中指定数目个斜杠(/)前面的所有字符,从而得到要操作的文件名。如补丁文件里有个文件名/usr/zzz/src/lze.c,则用-p0时patch操作的文件名不变,用-p1时则变为usr/zzz/src/lze.c,用-p2时则变为zzz/src/lze.c,如用-p4则操作的文件名变为lze.c。<br>
    * -s : 这个选项指示patch在打补丁过程中不输出任何信息,即使有错误发生。<br>
    <br>
    (2) -P N :<br>
    使用此选项以指示RPM使用第N个补丁文件(由文件头PatchN域定义)。如想让RPM使用LZE的第2个补丁文件Patch2(lze-patch.three)时,可使用"-P 2"来指定。<br>
    <br>
    (3) -p N :<br>
    此选项与其参数是由%patch宏直接传给patch命令的。请参见上面patch命令所用的-p选项的介绍。<br>
    <br>
    (4) -b name :<br>
    当有多个patch命令操作同一个文件时,patch会将原文件换名保存(其后缀变作.orig),如lze.c会变作lze.orig。如果想用别的名字作后缀,则可用-b设置一下,这样原文件会换名为"原文件名+后缀",如用-b ZZZ时,lze.c会换名保存为lze.cZZZ。<br>
    此选项在执行时,实际上是给patch命令传递了一个选项及参数,即--suffix name。<br>
    <br>
    (5) -E :<br>
    此选项直接传给patch命令,其作用是:如果一个文件打完补丁后内容为空(字节数为0),则删除这个文件。<br>
    <br>
    1.2 %build :<br>
    此为编译段,其内容为编译脚本程序。该程序完成源程序的编译和连接。一个最简单的例子就是程序中仅有一个make命令。这适用于大部分情况,因为多数软件均有自己的makefile,这样通过make命令就可实现编译与连接。如果没有makefile的话,需要软件包制作者自己在编译段书写上一系列的编译连接命令。<br>
    <br>
    1.3 %install :<br>
    此为安装段,其内容是安装脚本程序。该程序将已编译连接好的执行程序或其它文件存放到指定目录下,这些程序或文件供RPM打包时使用。一个最简单的例子就是程序中仅用一个make install命令,从而完成安装。这也需要相应的软件有makefile维护文件。没有的话,软件包制作者也得自己写指令。<br>
    <br>
    1.4 %clean :<br>
    此为清理段,其内容是清理脚本程序。此程序在RPM制作好软件包后才执行,它通常是删除那些编译连接时产生的临时文件或目录,完成缮后工作。<br>
    <br>
    2. 管理用功能段:<br>
    此类段用于软件包自身的管理(安装,卸载和校验),包括%pre,%post,%preun,%postun,和%verifyscript五个功能段。<br>
    2.1 %pre :<br>
    <br>
    该段内容为安装前脚本程序。它在软件包安装之前执行,通常是检测操作环境,建立有关目录,清理多余文件等等,为软件包的顺利安装做准备。本段很少使用。<br>
    其段名格式为: %pre [子包选项]<br>
    <br>
    2.2 %post :<br>
    该段内容为安装后脚本程序。它在软件包安装完成之后执行,常用来建立符号连接,修改系统配置文件,运行ldconfig程序等,以利软件的正常运行。<br>
    其段名格式为: %post [子包选项]<br>
    <br>
    2.3 %preun :<br>
    该段内容为卸载前脚本程序。它在软件包卸载之前执行,主要为卸载做准备。具体如,要卸载的软件包中某个程序当前正在运行时,此脚本程序必须杀掉它,否则无法正确卸载。<br>
    其段名格式为: %preun [子包选项]<br>
    <br>
    2.4 %postun :<br>
    该段内容为卸载后脚本程序。它在软件包卸载后执行,完成卸载的缮后工作,如将系统配置文件inetd.conf改回原来的样子,重新运行一下ldconfig命令,将已卸载的共享库从缓冲文件ld.so.cache中删除等等。<br>
    其段名格式为: %postun [子包选项]<br>
    <br>
    2.5 %verifyscript :<br>
    该段内容为校验脚本程序。RPM校验软件包时,除了执行标准的校验外,如果软件包制作者设定有此校验脚本程序,还将执行之。<br>
    <br>
    其段名格式为: %verifyscript [子包选项]<br>
    下面是XFree86-libs-3.3.6-6.i386.rpm软件包中的校验脚本程序,它校验的是动态链接库目录/usr/X11R6/lib。校验时,在/etc/ld.so.cache文件中查找/usr/X11R6/lib,如果找不到,则显示"missing",找到则显示"found"。<br>
    # verifyscript<br>
    echo -n "Looking for /usr/X11R6/lib in /etc/ld.so.conf... "<br>
    if ! grep "^/usr/X11R6/lib$" /etc/ld.so.conf &gt; /dev/null<br>
    then<br>
    echo "missing"<br>
    echo "/usr/X11R6/lib missing from /etc/ld.so.conf" &gt;&2<br>
    else<br>
    echo "found"<br>
    fi<br>
    <br>
    3. 交互用功能段:<br>
    这类功能段有%triggerin,%triggerun,%triggerpostun,它们的内容都是RPM用于软件包之间交互控制的脚本程序。这些脚本程序都是在系统满足指定的条件下才触发执行的:<br>
    <br>
    1) %triggerin : 段内为安装时触发脚本程序,当其所在软件包与指定软件包仅有一方已安装时,安装另一方将触发此程序执行;<br>
    <br>
    2) %triggerun : 段内为卸载时触发脚本程序,当其所在软件包与指定软件包都已安装时,卸载二者中的任一个将触发此程序执行;<br>
    <br>
    3) %triggerpostun : 段内为卸载后触发脚本程序,只有指定软件包卸载后才触发此程序执行。<br>
    <br>
    3.1 段名格式<br>
    它们的段名描述格式均为:<br>
    交互段名 [子包选项] [-p 解释程序] -- 触发条件1 [,触发条件2] ...<br>
    <br>
    注: []所括为可选项。子包选项见前面介绍,不赘述。<br>
    <br>
    3.1.1 -p选项:<br>
    此选项用于指定一个解释程序,来解释执行交互功能段的脚本程序。默认情况下,RPM使<br>
    用/bin/sh来执行脚本(此类脚本用SHELL语言编写,也叫SHELL程序)。有的RPM包则是使用/usr/bin/perl<br>
    来执行脚本(此类脚本是用PERL这种解释性语言写的),这就需要用-p选项来指定解释程序为<br>
    /usr/bin/perl,如:<br>
    %triggerin -- sendmail<br>
    ln -sf /usr/bin/sendmail /etc/mymailer/mailer<br>
    %triggerin -- vmail<br>
    ln -sf /usr/bin/vmail /etc/mymailer/mailer<br>
    <br>
    注: 此例中定义package子软件包安装时触发脚本程序:当触发条件(fileutils&gt;3.0,perl&lt;1.2)满足时,用/usr/bin/perl执行脚本,即用print命令输出字符串"I'm in my trigger!"。<br>
    <br>
    3.1.2 触发条件:<br>
    交互功能段的触发条件格式是:<br>
    功能名 [比较符 版本号]<br>
    <br>
    其中:比较符与版本号可选。仅有一个功能名时,表明该功能存在时触发程序执行。比较符可用大于(&gt;),等于(=),小于(&lt;),大于等于(&gt;=)和小于等于(&lt;=)。<br>
    如触发条件bash,又如触发条件fileutils&gt;3.0,这种使用均合法。<br>
    交互功能段最少有一个触发条件。当有多个触发条件时,这些条件间均以逗号(,)分隔,它们之间是"或"的关系,即只要其中有一个条件系统满足,RPM就将执行触发脚本程序。如上面介绍-p选项时举的例子:例子中有两个触发条件fileutils&gt;3.0和perl&lt;1.2,在安装软件包时,只要有一个条件满足,RPM就会执行触发脚本,即输出"I'm in my trigger!"。<br>
    <br>
    3.2 交互用功能段的使用<br>
    为什么要使用交互用功能段?下面的例子很能说明问题。<br>
    假定mymailer软件包需要/etc/mymailer/mailer这个符号连接文件指向当前使用的邮件发送代理程序。如果sendmail包安装了,那么这个符号连接文件应指向/usr/bin/sendmail程序。如果vmail包安装了,那么它应当指向/usr/bin/vmail程序。如果这两个软件包都安装了(实际上,sendmail与vmail彼此是冲突的),那么我们也无需考虑符号连接指向哪个文件了。当然,如果这两个包都未安装,那么/etc/mymailer/mailer符号连接文件也没有理由存在了。<br>
    <br>
    上述要求,我们通过为mymailer软件包编写触发脚本程序来实现,这些脚本程序在下列事件发生时,将改变/etc/mymailer/mailer符号连接的内容:<br>
    1) sendmail已安装;<br>
    2) vmail已安装;<br>
    3) sendmail卸载时;<br>
    4) vmail卸载时。<br>
    <br>
    前两个事件触发的脚本程序可以这样写:<br>
    %triggerin -- sendmail<br>
    ln -sf /usr/bin/sendmail /etc/mymailer/mailer<br>
    %triggerin -- vmail<br>
    ln -sf /usr/bin/vmail /etc/mymailer/mailer<br>
    <br>
    这是两个安装时被sendmail或vmail所触发脚本程序。它们将在下列情况下执行:<br>
    1) 在mymailer

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -