rpmbuild SPEC语法

摘自:http://bbs.chinaunix.net/thread-4179207-1-1.html

spec文件写作规范 2008-09-28 11:52:17 
分类: LINUX

1.The RPM system assumes five RPM directories
BUILD:rpmbuild编译软件的目录
RPMS:rpmbuild创建的binary RPM所存放的目录
SOURCES:存放源代码的目录
SPEC:存放spec文件的目录
SRPMS:rpmbuild创建的source RPM所存放的目录
2.rpm内建的宏在文件/usr/lib/rpm/redhat/macros文件中有定义,这些宏基本上定义了目录路径或体系结构等等,rpm也包含了一组用于调试有问题的spec文件的宏,如下:
%dump:打印宏的值
%{echo:message} :打印信息到标准错误
%{error:message} :打印信息到标准错误,然后返回BADSPEC
%{expand:expression} :like eval, expands expression
%{F:file_exp} :扩展file_exp到一个文件名
%global name value :定义一个全局宏
%{P:patch_exp} :扩展patch_exp到一个补丁文件名 
%{S:source_exp} :扩展source_exp到一个源码文件名
%trace :跟踪调试信息
%{uncompress:filename} 
Tests if file filename is compressed. If so, uncompresses and includes 
in the given context. If not compressed, calls cat to include file in given context. 
%undefine macro :取消给定的宏定义
%{warn:message} :打印信息到标准错误
3.宏
%define  macro_name  value
然后可以用%macro_name或者%{macro_name}来调用,也可以扩展到shell,如
%define today %(date)  (变量定义宏)
也可以传递参数给宏
%define macro_name(option)  value
%foo 1 2 3 传递1,2,3三个参数给宏foo
在宏扩展的宏参数
%0:宏的名字
%*:传递给宏的所有参数
%#:传递给宏的参数个数
%1:第一个参数
%2:第二个参数,等等
%{-p}:Holds -p
%{-p*}:Holds the value passed with the -p parameter, if the -p parameter was passed to the macro;otherwise holds nothing
%{-p:text}:Holds text if the -p parameter was passed to the macr;otherwise holds nothing
%{?macro_to_text:expression}:如果macro_to_text存在,expand expression,如国不存在,则输出为空;也可以逆着用,:%{!?macro_to_text:expression}
%{?macro}:忽略表达式只测试该macro是否存在,如果存在就用该宏的值,如果不存在,就不用,如:./configure %{?_with_ldap}
%if %{old_5x}
%define b5x 1
%undefine b6x
%endif
or
%if %{old_5x}
%define b5x 1
%undefine b6x
%else
%define b6x 1
%undefine b5x
%endif
还可以用!,&&等符号,如:
%if %{old_5x} && %{old_6x}
%{error: you cannot build for .5x and .6x at the same time}
%quit
%endif
%ifarch sparc  alpha:判断处理器的结构
%ifnoarch i386 alpha:跟%ifarch相反
%ifos linux:测试操作系统
%ifnos linux:跟%ifos相反
4.# This is a comment.
以#开头的一行为注释,如果在注释里加%会产生错误,如%prep,应该加上两个%,即%%prep
5.spec文件的写法:
Name: myapp    #设置rpm包的名字
Version: 1.1.2    #设置rpm包的版本号
Release:1        #设置rpm包的修订号
Group: System Environment/Shells        #设置rpm包的分类,所有组列在文件/usr/share/doc/rpm-version/GROUP
Distribution: Red Hat Linux    #列出这个包属于那个发行版
Icon: file.xpm or file.gif        #存储在rpm包中的icon文件
Vendor: Company            #指定这个rpm包所属的公司或组织
URL:   #公司或组织的主页
Packager: sam shen <email>    #rpm包制作者的名字和email
License: LGPL            #包的许可证
Copyright: BSD            #包的版权
Summary: something descripe the package    #rpm包的简要信息
ExcludeArch: sparc s390        #rpm包不能在该系统结构下创建
ExclusiveArch: i386 ia64        #rpm包只能在给定的系统结构下创建
Excludeos:windows            #rpm包不能在该操作系统下创建
Exclusiveos: linux            #rpm包只能在给定的操作系统下创建
Buildroot: /tmp/%{name}-%{version}-root    #rpm包最终安装的目录
Source0: telnet-client.tar.gz
Source1: telnet-xinetd
Source2: telnet-wmconfig        #源代码文件,如果只有一个源码目录,可以只写Source: telnet-client.tar.gz
NoSource:0                #第一个源码不包含在包中
Patch1:telnet-client-cvs.patch
Patch2:telnetd-0.17.diff
Patch3:telnet-0.17-env.patch    #补丁文件
NoPatch:0                #第一个补丁文件不包含在包中
Requires:packagename        #该包需要给定的packagename包
Requires:bash>=2.0        #该包需要包bash,且版本至少为2.0,还有很多比较符号如<,>,<=,>=,=
Requires:perl(Carp)>=3.2        #requirement for the Carp add-on module for Perl
PreReq: capability >=version    #capability包必须先安装
Conflicts:bash>=2.0            #该包和所有不小于2.0的bash包有冲突
BuildRequires:
BuildPreReq:
BuildConflicts:           
#这三个选项和上述三个类似,只是他们的依赖性关系在构建包时就要满足,而前三者是在安装包时要满足
Autoreq: 0                 #禁用自动依赖
Prefix: /usr            
#定义一个relocatable的包,当安装或更新包时,所有在/usr目录下的包都可以映射到其他目录,当定义Prefix时,所有%files标志的文件都要在Prefix定义的目录下
%triggerin --package < version   
#当package包安装或更新时,或本包安装更新且package已经安装时,运行script    
...script...                    
%triggerun --package        
#当package包删除时,或本包删除且package已经安装时,运行script    
...script...                        
%triggerpostun --package        
#当package删除时运行script,本包删除时不运行
...script...
%triggerpostun -p /usr/bin/perl  --vixie-cron <3.0.1-56
               -p /usr/sh package < version
               -n subpackage_name –vixie-cron <3.0.1-56
...script...
in trigger script,$1:the number of instances of your package that will remain     after operation has completed, $2:the number of instances of the target package that will remain after the operation ,if $2 is 0, the target package will be removed
%description: something        #rpm包的描述
%prep                 #定义准备编译的命令
%setup  -c            #在解压之前创建子目录
        -q            #在安静模式下且最少输出
     -T            #禁用自动化解压包
      -n name      #设置子目录名字为name
        -D            #在解压之前禁止删除目录
        -a number        #在改变目录后,仅解压给定数字的源码,如-a 0 for source0
        -b number        #在改变目录前,仅解压给定数字的源码,如-b 0 for source0                            
%patch -p0                #remove no slashes
%patch -p1                 #remove one slashes
%patch                #打补丁0
%patch1                #打补丁1
%patch2                #打补丁2
%patch -P 2           #打补丁2
%build                #编译软件
./configure  --prefix=$RPM_BUILD_ROOT/usr
make    
or
%configure            #可以用rpm –eval '%configure'命令查看该宏
make
%install              #安装软件
make install PREFIX=$RPM_BUILD_ROOT/usr
install -m755 myapp $RPM_BUILD_ROOT/usr/bin/myapp
or
%makeinstall
%clean                #清除编译和安装时生成的临时文件
rm -rf $RPM_BUILD_ROOT
%post                 #定义安装之后执行的脚本
...script...          
#rpm命令传递一个参数给这些脚本,1是第一次安装,>=2是升级,0是删除最新版本,用到的变量为$1,$2,$0
%preun                #定义卸载软件之前执行的脚本
...script...
%postun               #定义卸载软件之后执行的脚本
...script...
%files                #rpm包中要安装的所有文件列表
file1                 #文件中也可以包含通配符,如*
file2
directory             #所有文件都放在directory目录下
and so on
%dir   /etc/xtoolwait    #包含一个空目录/etc/xtoolwait
%doc  /usr/X11R6/man/man1/xtoolwait.*    #安装该文档
%doc README NEWS            #安装这些文档到/usr/share/doc/ or /usr/doc
%docdir                    #定义存放文档的目录
%config /etc/yp.conf            #标志该文件是一个配置文件
%config(noreplace) /etc/yp.conf       
#该配置文件不会覆盖已存在文件(被修改)覆盖已存在文件(没被修改),创建新的文件加上扩展后缀.rpmnew(被修改)
%config(missingok)    /etc/yp.conf    #该文件不是必须要的
%ghost  /etc/yp.conf            #该文件不应该包含在包中
%attr(mode, user, group)  filename    #控制文件的权限如%attr(0644,root,root) /etc/yp.conf,如果你不想指定值,可以用-
%config  %attr(-,root,root) filename    #设定文件类型和权限
%defattr(-,root,root)            #设置文件的默认权限
%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh*    #用特定的语言标志文件
%verify(owner group size) filename    #只测试owner,group,size,默认测试所有
%verify(not owner) filename        #不测试owner
                    #所有的认证如下:
                    #group:认证文件的组
                    #maj:认证文件的主设备号
                    #md5:认证文件的MD5
                    #min:认证文件的辅设备号
                    #mode:认证文件的权限
                    #mtime:认证文件最后修改时间
                    #owner:认证文件的所有者
                    #size:认证文件的大小
                    #symlink:认证符号连接
%verifyscript                #check for an entry in a system             
...script...                #configuration file    
%changelog
* Wen Sep 24 sam shen <sxc_1985921@126.com>
- sam updated to 1.3
    
%package sub_package_name   #定义一个子包,名字为package-subpackage
       -n sub_package_name  #定义一个子包,名字为sub_package_name
当定义一个子包时,必须至少包含Summary:,Group:,%description选项,任何没有指定的选项将用父包的选项,如版本等,如:
%package server
Requires: xinetd
Group: System Environment/Daemons
Summary:The server program for the telnet remote login protocol
%description server
Telnet is a popular protocol for logging into remote systems
如果在%package时用-n选项,那么在%description时也要用,如:
%description -n my-telnet-server
%files server
%defattr(-,root,root)
%{_sbindir}/in.telnetd
如果在%package时用-n选项,那么在%files时也要用,如:
%files -n my-telnet-server,也可以定义安装或卸载脚本,像定义%files和%description 一样

rpmbuild SPEC语法的更多相关文章

  1. rpmbuild spec 打包jar变小了、设置禁止压缩二进制文件Disable Binary stripping in rpmbuild

    Disable Binary stripping in rpmbuild 摘自:http://livecipher.blogspot.com/2012/06/disable-binary-stripp ...

  2. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  3. RPM 包的构建 - SPEC 基础知识

    spec 文件 制作 rpm 软件包并不是一件复杂的工作,其中的关键在于编写软件包的 spec 描述文件. 要想制作一个 rpm 软件包就必须写一个软件包描述文件 spec.这个文件中包含了软件包的诸 ...

  4. rpm包制作(待实验)

    作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...

  5. mysql自动化安装

    MySQL安装一般使用RPM或者源码安装的方式.RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整.源码安装的优点是可以自定义安装 ...

  6. 如何在RedHat6(7) or CentOS6(7)上制作无依赖的PostgreSQL数据库的RPM包

    本文解决了源代码安装都需要先检查系统上是否安装了应用程序所依赖的软件包的烦恼,对源代码开发者也有一定的帮助.可以在该基础上进行适当的修改,以满足自己的要求. RedHat5 or CentOS5已经提 ...

  7. RPM包制作过程(一)

    本机环境:centos7,64位 1. 首先安装工具,rpmbuild可能在rpmdevtools里已经包含 #yum install rpm-devel.x86_64 #yum install rp ...

  8. Mark Text - 下一代所见即所得的Markdown编辑器

    Mark Text 所输及所见,摒弃了众多 markdown 编辑器左边写作右边预览的写作方式,巧妙的将编辑和预览融为一体.snabbdom 作为 Mark Text 的渲染引擎,保证了极速渲染编辑页 ...

  9. mysql日常运维

    一.Linux内核和发行版本 uname -a cat /etc/issue  二.glibc的版本   /lib/libc.so.6    ---没有man函数据的动态链接库   三.MySQL的版 ...

随机推荐

  1. Markdown 中的目录自动生成功能 TOC

    目录 Markdown 中的目录自动生成功能 TOC 1. 标题一 1.1 标题二 1.标题二 2. 标题一 2.1 标题二 2.2 标题二 Markdown 中的目录自动生成功能 TOC 1. 标题 ...

  2. Linux 之 NTP 服务 服务器

    我们选择第三台机器( mysql02 )为 NTF 服务器,其他机器和这台机器进行同步. 1. 检查 ntp 服务是否已经安装[root@mysql02 ~]# sudo rpm -qa | grep ...

  3. mysql 创建用户自定义函数(转可运行)

    set global log_bin_trust_function_creators = 1; -- 开启bin_log 复制 函数创建DROP FUNCTION IF EXISTS hello; - ...

  4. Java基础数据类型二进制转换

    前言: 本文主要介绍java基础类型的二进制转换和二进制的基本概念. 二进制: 1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1. 2,在计算机当中其它进制的算法基本基于2进制,因为计算机 ...

  5. 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...

  6. java代码关于匿名内部类和接口的方法使用

    总结:主要是多个按钮实现监听时,能够响应不同的事件 以上步骤我们可以用多种方法实现.但人们通常用二种方法.第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件:第二种方法是使用多个内 ...

  7. linux 动态静态库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.  1  静态库和动态库的区别1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a( ...

  8. 软件部需求,内容采集,显示内容图文列表,MongoDB数据导入导出JSON

    全局变量 由于多个html页面,需要引用同一个变量.这个时候,需要定义一个全局变量!如何定义呢? 默认包含了mui的html文件都导入mui.js文件.那么将变量写在mui.js中,就可以实现所有页面 ...

  9. MySql主从复制原理和环境配置搭建

    主从复制原理 实质就是通过二进制的sql文件实现主从复制 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlo ...

  10. angular结合echarts创建图表

    原理: 利用angularjs中的指令(directive)将echarts封装. 步骤: 1.封装函数: app.directive('line', function() { return { re ...