`
zhanghw0917
  • 浏览: 185705 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spec文件写作规范

阅读更多
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: http://www.somesite.com    #公司或组织的主页
Packager: sam shen <sxc_1985921@126.com>    #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
Source3: ftp://ftp.somesite.you/pub/name.tar.gz    #用ftp或http命名源码包
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 一样
分享到:
评论

相关推荐

    RPM包rpmbuild SPEC文件深度说明

    ### RPM包rpmbuild SPEC文件深度说明 #### 一、SPEC文件概述 SPEC文件是RPM包构建过程中非常核心的一个组成部分,它定义了如何构建、安装以及管理软件包的详细规则。通过SPEC文件,我们可以控制整个RPM包的构建...

    spec文件详解

    ### Spec 文件详解 #### 一、引言 在Linux环境下,RPM (Red Hat Package Manager) 是一个广泛使用的软件包管理系统。它不仅用于管理软件包的安装与卸载,还能帮助用户更新现有软件包,检查软件包之间的依赖关系等...

    SPEC CPU 2006 .cfg配置文件

    SPEC CPU 2006 .cfg配置文件

    RPM打包和典型SPEC文件分析

    编写SPEC文件需要对软件的构建过程有充分的了解,同时也需要掌握RPM打包的规范和要求。 RPM打包过程主要分为两个部分:第一部分是编写SPEC文件,第二部分是通过rpmbuild命令根据SPEC文件构建出最终的RPM包。SPEC...

    storapp.spec文件详解

    如何使用spec文件

    RPM打包全过程SPEC详解

    创建SPEC文件通常以`.spec`为扩展名,用文本编辑器打开并按照RPM的规范编写。SPEC文件包含多个部分,如 `%define`(定义变量)、`%package`(定义子包)、`%description`(软件描述)、`%files`(指定安装文件)等。...

    ELF文件格式规范1.2

    ### ELF文件格式规范1.2知识点详解 #### 一、ELF文件格式概述 - **定义**:ELF(Executable and Linking Format)文件格式是一种用于操作系统中的可执行文件、目标代码、共享库以及核心转储的标准文件格式。它旨在...

    RPM打包技术与典型SPEC文件分析

    `SPEC`文件是一种文本文件,遵循特定的语法和结构,用于定义软件包的元数据、构建步骤以及安装时的行为。一个基本的`SPEC`文件通常包括以下部分: 1. ** `%define`**: 用于定义变量,这些变量可以在整个`SPEC`文件...

    spec, mustache 规范.zip

    spec, mustache 规范 https://github.com/mustache/spec 是 mustache的正式标准。 它定义了解析 mustache 模板语言( 或是它们的超集)的库的正常用法和边缘案例行为。规范是作为一系列YAML文件开发的,在 spe

    PICMGCOM0R20COMe规范/COMe2.0规范spec

    PICMGCOM0R20COMe规范/COMe2.0规范spec

    eMMC5.1Spec协议规范B51

    综上所述,eMMC5.1Spec协议规范为移动设备提供了高效、可靠的存储解决方案。通过了解其核心特性,开发者可以更好地设计和优化使用eMMC5.1的系统,以满足高性能、低功耗的需求。而《eMMC5.1Spec_JESD84-B51.pdf》文档...

    spec cpu 2006 riscv config配置文件

    spec cpu 2006 riscv config配置文件

    Atom-language-rpm-spec,基本RPM规范文件的Atom支持。对waveclaw/语言的贡献.zip

    Atom-language-rpm-spec是针对RPM规范文件在Atom文本编辑器中的一个扩展插件,它为用户提供了在Atom中编辑和理解RPM规格文件(spec files)的便利性。RPM,全称Red Hat Package Manager,是Linux系统下广泛使用的...

    SSI_EEB_SPEC

    SSI_EEB_SPEC是针对2011年推出的双插槽服务器和工作站所制定的SSI企业电子托盘规范的版本1.0.1。在IT行业中,服务器的设计和构建必须遵循一系列标准和规范,以确保硬件设备之间能够兼容且安全地进行电气连接。这份...

    ATA SPEC 300.pdf

    该标准旨在提供一系列规范和指南,确保货物在航空运输过程中的安全、有效和合规。 此文档包含以下关键知识点: 1. **产品许可协议**:使用《ATA SPEC 300》的标准文档前,用户必须同意并接受一份产品许可协议。...

    钻杆规范(API-SPEC-5D标准)中文版.pdf

    钻杆规范(API-SPEC-5D标准)中文版 钻杆规范(API-SPEC-5D标准)是美国石油学会标准,规定了钻杆的技术要求和试验方法。该标准适用于第1组和第3组钻杆,包括E级钻杆和高强度级钻杆(X95、G105和S135钢级)。 1. ...

    spec, WebAssembly规范,参考解释器和测试套件.zip

    spec, WebAssembly规范,参考解释器和测试套件 规范这个库包含WebAssembly草案规范( 为将来的 WebAssembly工作组添加种子。) 。参考实现和官方应用程序的源代码。这里规范的格式化版本可以在以下位置使用: ...

    pcie4.0spec

    PCI Express 4.0 规范总结 PCI Express 4.0 规范是一种高速串行计算机扩展总线规范,由PCI-SIG(PCI Special Interest Group)组织制定。该规范定义了PCI Express总线的物理层、链路层和事务层的协议和实现细节。 ...

Global site tag (gtag.js) - Google Analytics