spec文件写作规范
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 一样
spec文件写作规范的更多相关文章
- RPM 打包技术与典型 SPEC 文件分析
一 .rpm 介绍 1. 概述 RPM全称是 Red Hat Package Manager(Red Hat包管理器).几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装.更新和卸载软件. ...
- 以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写
一.rpmbuild命令的安装 yum install rpm-build 二.用法 rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz 三.目录概述 rp ...
- 【转】Application.mk 文件语法规范
原文网址:http://blog.sina.com.cn/s/blog_4c451e0e0100s6q4.html Application.mk file syntax specification A ...
- RPM安装包-Spec文件參数具体解释与演示样例分析
spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件. 1.Spec文件參数 spec文件包括建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个 ...
- 使用spec文件语法创建一个rpm
How to create an RPM package/zh-hk < How to create an RPM package 此页面包含 Packaging:ScriptletSnippe ...
- spec 文件详解
转自http://blog.sina.com.cn/s/blog_43b39e250100nnu4.html rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS ...
- css样式文件命名规范
样式文件命名规范 主要 master.css, style.css, main.css 布局 layout.css 专栏 columns.css 文字 font.css 打印 print.css 主题 ...
- Android资源文件命名规范
在复杂Android应用的开发中,资源文件的规范命名非常重要,能帮助设计人员和开发人员减小沟通成本.资源的名字尽量力求准确,可以适当长一些,但换回的价值是值得的. 关于WCC的Android开发,资源 ...
- git的忽略文件语法规范
忽略文件语法规范 空行或是以 # 开头的行即注释行将被忽略. 可以在前面添加正斜杠 / 忽略当前路径文件,但不包括子目录的同名文件. 可以在后面添加正斜杠 / 来忽略文件夹. 可以使用 ! 来否定忽略 ...
随机推荐
- pandas 常用清洗数据(一)
数据源获取: https://www.kaggle.com/datasets 1. Look at the some basic stats for the ‘imdb_score’ column: ...
- spring 代理注解 <aop:aspectj-autoproxy />
spring默认使用jdk的代理方式,使用jdk的代理方式我们知道,代理的类需要实现一个接口,若果没有就会报,java.lang.NoSuchMethodException: com.sun.prox ...
- linux系统修改系统时间与时区
有装过Linux系统的人,可能都会有这样的经历,就是该机器安装windows系统时,时间正确,但是安装了linux系统后,尽管时区选择正确,也会发现系统时间不对.这是由于安装系统时采用了UTC,那么什 ...
- ezmorph将一种对象转换成另外一种对象
EZMorph支持原始数据类型(Primitive),对象(Object),多维数组转换与DynaBeans的转换.兼容JDK1.3.1,整个类库大小只有76K左右. 在Java EE开发常用的str ...
- modal template
<div class="modal fade" id="tmp_order_modal" tabindex="-1" role=&qu ...
- thymeleaf 在js中获取message信息或获取后台属性
<script th:inline="javascript"> /*<![CDATA[*/ [[#{message1}]] [[${abc}]] /*]]> ...
- Django2.1在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
解决办法: a=models.ForeignKey('BookInfo',on_delete=models.CASCADE,) 即在外键值的后面加上 on_delete=models.CASCADE ...
- 2019年华南理工大学程序设计竞赛(春季赛)-H-Parco_Love_GCD
题目链接:https://ac.nowcoder.com/acm/contest/625/H 题意:给定n个数(<=1e9)的序列,其中n<=5e5,求该序列所有子序列的对应的gcd对1e ...
- hdu 5023 线段树+位运算
主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...
- CodeForces - 55D(数位dp,离散化)
题目来源:http://codeforces.com/problemset/problem/55/D Volodya is an odd boy and his taste is strange as ...