精华内容
下载资源
问答
  • UFS spec 文档

    2014-05-05 11:54:36
    免去JEDEC 注册的烦恼 UFS 是下一代移动设备的存储解决方案,和EMMC5x 进行竞争
  • linux spec文档解析

    千次阅读 2015-12-25 10:41:05
    本文着重讲SPEC文件,关于rpm、rpmbuild、patch部分,请参考前几篇文章

    编译目录组成介绍

    rpm-build 包和  /usr/src/redhat ,这些 rpm build 的程序是要靠 spec 文件的控制。它是配置指定安装到另外的机器上的,用来指示转换的源码补丁编译成二进制文件的包。默认编译操作是在下面的目录中,它是编译源码的相关动作操作的位置。
    如果不指定其它的地方,那么 rpm building 的地方是主要在 /usr/src/redhat 的目录,目录的架构如下,这就是为 rpm-build 提供的目录结构.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /usr/src/redhat/
    |-- BUILD
    |-- RPMS
    |   |-- i386
    |   `-- ...
    |-- SOURCES
    |   |-- foo-1.2.tar.gz
    |   |-- foo-1.2-add_feature.patch
    |   `-- foo-1.2-change_default.patch
    |-- SPECS
    |   `-- foo.spec
    `-- SRPMS

    文件的提取,编译都将在 BUILD 的目录,运行后结果的包会在 RPMS 和 RPMS 目录.

    RPM 的宏命令

    宏(Macros)是使用变量和功能来控制rpm和 rpmbuild 的自定义的行为,宏指令一般地定义在 spec 文件中。语法象 %define macro value .宏指定也可以事先在配置文件中调整。
    就是下面的文件。

    • 默认设置为 /usr/lib/rpm/macros or /etc/rpm/macros
    • 用户设置 ~/.rpmmacros

    在打包的过程中,spec files 和 rpmbuild 能使用RPM 的宏命令中的变量.
    此外,在 rpmbuild 时要不顾当前设置,可以在后面加上 –define=’macro value’ 选项,要显示当前的宏指令可以使用 rpm –eval %{macro} ,也可以rpm –showrc 来 dump 全部当前的宏指令和设置。

    你没有必要使用所有的宏指令,也能容易的管理 rpm 的 spec 文件。一个好的建议是,不要编译包使用 root 用户.你能创建一个 ${HOME}/.rpmmacro 文件,然后设置 %_topdir ,非 root 用户能就能不使用 /usr/src/redhat 架构的目录在系统上。另外还有一个好处,就是安装  SRPMs 时,会安装到 %_topdir 目录.宏指令象 %_rpmdir, %_specdir 可以更加细的控制 rpm 在编译过程中的目录.

    宏指令有时指定在使用命令时,%configure 宏运行源码在 .configure 脚本在运行源码给合适的你的机器架构信息。 %makeinstall 宏指令通过使用 GNU Automake 传送合适的选项。

    宏指令的目录是参考本地的相关信息, %_tmppath 是编译时的临时的目录,默认设置的是 /var/tmp. 其它的宏指令如 %_perfix 是设置目录象 %configure 宠中和 –prefix 的选项.默认是 /usr.这个 %_perfix 选项也会影响到其它使用这个目录的变量,如 %_bindir 它是设置的 %{_prefix}/bin 为默认的. 可以通过 /usr/lib/rpm/macros 查看其它更加多的例子.

    在运行时可以重新定义宏,用户自己可以设置rpm-build的非特权的目录%{_topdir}. 来指定任意目录.
     

    Spec 文件

    重点注意

    1. 版本: Name,Version,Release
    2. 其它软件有关的信息: Group,License,URL,Summary
    3. 先决条件: PreReq,Requires,BuildPreRep,Provides,Obsoletes,Conflicts
    4. 输入: Source[#],Patch[#]
    5. BuildRoot,BuildArch
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    %define name foo  # 名字
    %define version 1.2  #version
    Name: %{name}   #name 就是使用的上面的宏指令
    Version: %{version}  #version 也是使用的上面的宏指令
    Release: 3
    License: GPL
    Group: Applications/Productivity # 软件是哪个组的,更多信息查看 /usr/share/doc/rpm-version/GROUPS
    Source: ftp://www.foo.org/pub/people/elvis/%25%7Bname%7D-%25%7Bversion%7D.tar.gz
    Patch0: foo-1.2-change_default.patch
    Patch1: foo-1.2-add_feature.patch
    PreReq: unzip   # 安装前需要什么
    Requires: pam  # 安装后需要什么
    BuildPreReq: gcc >= 2.96#打包前需要什么
    BuildRoot: %{_tmppath}/%{name}-root # 准备源码文件的 chroot 的目录
    Summary: A fictionalopensourcepackage forthe offering.  #摘要
    %description             #描述

    注意,spec 文件很多信息都是取自宏指令,如果没有明确指定,就会继承 /usr/lib/rpm/macros 和其它相关宏指令的文件.

     

    Spec 文件之 %prep
    %prep 这部分其它是由一些参数来组成一个 shell 脚本来从 SOURCES 中解压源码和应用补丁到 BUILD 目录中来准备下面的编译。
    和 %prep 相关的宏指令
    %setup
    %patch
    例:

    1
    2
    3
    4
    5
    %prep
    %setup -q   #提取源码到 BUILD 目录; -q 指不显示输出(quietly)
    %patch0 -p1  # 应用 patch0
    %patch1 -p1 -b .orig   # 应用 Patch1 但是存下源文件成 .oring 的后缀
    unzip foo_data.zip  # 接下来解压 zip 文件

     
    Spec 文件之 %build
    %build 是编译和准备软件,运行象一个 shell 脚本,它运行在上下文目录指定的源码目录。在编译过程中,调用脚本 .config 在本地的目录(%configure 中配置的).
    和 %build 相关的宏
    %configure  # 可以通过运行 rpm -eval %configure 来看它的设置
    例:

    1
    2
    3
    %build
    %configure--enable-shared
    CFLAGS=-O2 make

     
    Spec 文件之 %install
    %install 是用来做 rpm 安装所有需要的文件。这些打包的文件会复制到前面的讲的 BuildRoot 中的目录树中。通常这个目录是使用的 /var/tmp 中。
    $RPM_BUILD_ROOT 参数来设置 BuildRoot.
    主要不能使用真实目录来设置的主要原因是,在编译的过程中有可能会有文件替换到你系统中的文件引起系统和软件问题.对其它的文件路径象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用预先定义的宏来指定的. 默认都是跑在这个 RPM_BUILD_ROOT 目录下的。
    例:

    1
    2
    3
    4
    %install
    rm -rf $RPM_BUILD_ROOT  # 默认的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-root
    make DESTDIR=$RPM_BUILD_ROOTinstall  # 指定安装文件的路径
    install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8

    install 的使用

     (1)install [选项]... 来源 目的地
    (2)install [选项]... 来源... 目录
    (3)install -d [选项]... 目录...
    在前两种格式中,会将复制至或将多个文件复制至已存在的,同时设定权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。

    Spec 文件之 %clean
    %clean 是用来清理 build 后的临时文件,主要是怕这些旧的文件影响以后编译。主要是要删除 $RPM_BUILD_ROOT 和运行 make clean 。
    例:

    1
    2
    3
    %clean
    rm -rf $RPM_BUILD_ROOT
    make clean

     

     Spec 文件之 Scriptlets
    这些选项可以让你动态的使用 shell 脚本来控制安装和删除,
    %pre,%post  是用脚本运行在包安装后,注意没法交互
    %preun,%postun  用脚本运行在包删除时
    rpm -q –scripts packagename # 可以看到脚本的信息

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    %pre
    groupadd -g 201 foo
    useradd -g foo -s /bin/false -d /var/foo -M foo
    %post
    /sbin/ldconfig
    chkconfig --add food
    %preun
    if [ $1 = 0 ]
    then
         service food stop > /dev/null 2>&1
         chkconfig --del food
    fi
    %postun
    if [ $1 = 0 ]
    then
         userdel foo
         groupdel foo
    else
         /sbin/ldconfig
         service food condrestart > /dev/null 2>&1
    fi

    注意,在这个当中的 $1 的数字,如果是 1 是指是第一次安装,如果是 2 是指也许是升级。如果是 0 在 %postun , 是指被完全的删除

     

    Spec 文件之 %files
    %files 任何打包的文件,都需要在这个包的详细的文件列表中,如果是目录,包的所有者的全部目录都在中间,%dir 来指定空目录,可以用 %files -f /tmp/dyanmic_filelist 来指定一个文件列表。默认 %config 会替换掉配置,给原来的配置修改名字为 .rpmorig ,如果不想修改的话,就用%config(noreplace) 就会给新的配置文件名字命名为 .rpmnew.
    %defattr(mode,user,group)
        %attr(mode,user,group) filename
    %config  配置文件
    %doc 文档
    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    %files
    %defattr(-,root,root)
    %config /etc/foo.conf # 指定了才能在更新和删除时有用
    /usr/sbin/food
    /usr/bin/foo
    %doc README # 目录是在 /usr/share/doc/%{name}-%{version}
    %doc /usr/share/man/man8/food.8
    /usr/share/foo/
    %dir /var/lock/foo/ # 空的目录

     

     Spec 文件之 %changelog
    %changelog 是记录包的修改,比如加入一个新的补丁,修改配置,日志使用 data +"%a %b %d %Y",需要显示包的日志改变的信息可以使用 rpm-q –changelog.


    一、spec文档的作用

           随着RedHat   Linux的发展,其对rpm包的管理及其格式的规划也得到了推广和统一。现在在工作中应用的最多的就是rpm包。无论是你自己撰写spec文档和一些代码生成rpm,还是根据之前的.src.rpm包  打个patch生成rpm包,看懂spec文档是必须的。

    二、关键字

    Name:软件包的名称,后面引用的时候%{name}

    Version:软件包的版本号,后面引用时候 %{version}

    Release:序列号,后面引用时用%{release}

    Summary : 软件包的概述

    Group:软件分组,一般使用标准分组

    License:软件授权的方式,一般是GPL

    Source:源代码包,(可以有多个,Source1、Source2....),后面引用时可以用%{source1}、%{source2}

    BuildRoot:安装编译时使用的“虚拟目录”,后面可以使用$RPM_BUILD_ROOT

    Patch:补丁源码(可以有多个补丁Patch1、Patch2....),后面引用时,可以用%patch1 或 %{patch1}

    URL:软件的主页

    Vendor:发行商或打包组织的信息

    Disstribution:发行版标识

    Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能

    Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识

    Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值

    Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
          libpng-devel >= 1.0.20 zlib
    注意::“>=”号两边需用空格隔开,而不同软件名称也用空格分开
    还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定


    Provides: 指明本软件一些特定的功能,以便其他rpm识别

    Packager: 打包者的信息

    %description 软件的详细说明


    三、主体

    %prep   预处理

    %setup -n %{name} - %{version} 把源码包解压       // -n 用来指定解压到哪个文件,即将/SOURCE下的包解压到/BUILD/ %{name} - %{version

    %patch    打补丁(补丁一般都会存放在tar.gz,或SOURCE目录下)

    ◎补充一下

    引用
    %setup 不加任何选项,仅将软件包打开。
    %setup -n newdir 将软件包解压在newdir目录。
    %setup -c 解压缩之前先产生目录。
    %setup -b num 将第num个source文件解压缩。
    %setup -T 不使用default的解压缩操作。
    %setup -T -b 0 将第0个源代码文件解压缩。
    %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
    %patch 最简单的补丁方式,自动指定patch level。
    %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
    %patch -s 不显示打补丁时的信息。
    %patch -T 将所有打补丁时产生的输出文件删除。

    %configure 这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数
    另一种不标准的写法是,可参考源码中的参数自定义,例如:
    引用
    CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

    %build 开始构建包
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作,常见写法:
    引用
    make %{?_smp_mflags} OPTIMIZE="%{optflags}"

    都是一些优化参数,定义在/usr/lib/rpm/marcros中

    %install 开始把软件安装到虚拟的根目录中
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。常见内容有:
    %makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:
    引用
    make DESTDIR=$RPM_BUILD_ROOT install


    引用
    make prefix=$RPM_BUILD_ROOT install

    需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:
    引用
    install -d $RPM_BUILD_ROOT/
    cp -a * $RPM_BUILD_ROOT/

    %clean 清理临时文件
    通常内容为:
    引用
    [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
    rm -rf $RPM_BUILD_DIR/%{name}-%{version}

    ※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
    $RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。


    %pre
    rpm安装前执行的脚本

    %post rpm安装后执行的脚本

    %preun rpm卸载前执行的脚本

    %postun rpm卸载后执行的脚本

    %preun %postun 的区别是什么呢?
    前者在升级的时候会执行,后者在升级rpm包的时候不会执行

    %files 定义那些文件或目录会放入rpm中
    这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。如果描述为目录,表示目录中除%exclude外的所有文件。
    %defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

    %exclude 列出不想打包到rpm中的文件
    ※小心,如果%exclude指定的文件不存在,也会出错的。
    %changelog 变更日志

    四、范例

    下面一制作memcached的源码包为例,介绍编写spec脚本

     

    Summary:  Free & open source, high-performance,distributed memory object caching system

    Name:     memcached     #软件包的名称

    Version:    1.4.5         #软件的实际版本号

    Release:    1.139          #发布序列号,后面的139是与系统包区分开

    License:    GPL           #软件授权方式,通常就是GPL

    Group:    Applications

    Source:     memcached-1.4.5.tar.gz   #源代码包

    BuildRoot:  %{_tmppath}/%{name}-%{version}-root #这个是安装或编译时使用的“虚拟目录”

    BuildRequires: libevent,libevent-devel  #rpm包所依赖的软件包名称

    Url:          http://memcached.org/

     

    %description

    Memcached is an in-memory key-value store for smallchunks of arbitrary data (strings, objects) from results of database calls, APIcalls, or page rendering.

     

    %prep   #预处理脚本

    %setup –q     #提取源码到BUILD目录; -q指不显示输出(quietly

     

    %build   #开始构建包

    ./configure

    make

     

    %install

    rm -rf %{buildroot}  

    make DESTDIR=$RPM_BUILD_ROOT install     #将软件安装到虚拟目录中

     

    %files    #定义哪些些文件或目录会放入rpm

    %defattr(-, root, root, 0755)     #指定包装文件的属性

    /usr/local/            #利用rpm安装以后,安装文件的路径

    五、其他
    1、扩展
    虽然上面的范例很简陋,而且缺少%build部分,但实际上只要记住两点:
    a)就是%build和%install的过程中,都必须把编译和安装的文件定义到“虚拟根目录”中。
    引用
    %build
    make -f admin/Makefile.common cvs
    ./configure --prefix=%{_prefix} --enable-final --disable-debug \
    --with-extra-includes=%{_includedir}/freetype2 --includedir=%{_includedir}
    make
    %install
    rm -fr $RPM_BUILD_ROOT
    make DESTDIR=$RPM_BUILD_ROOT install
    cp -r $RPM_BUILD_ROOT%{_datadir}/apps/kolourpaint/icons/hicolor/* $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg/

    b)就是%file中必须明白,用的是相对目录

    引用
    %files
    %defattr(-,root,root)
    %{_bindir}
    %{_libdir}
    %{_datadir}
    %exclude %{_libdir}/debug

    如果把

    引用
    %files
    %defattr(-,root,root)
    %{_bindir}

    写成

    引用
    %files
    %defattr(-,root,root)
    /usr/bin

    则打包的会是根目录下的/usr/bin中所有的文件。
    2、一些rpm相关信息
    rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS
    各种宏定义: /usr/lib/rpm/macros
    已经安装的rpm包数据库: /var/lib/rpm
    如果要避免生成debuginfo包:这个是默认会生成的rpm包。则可以使用下面的命令:

    echo '%debug_package %{nil}' >> ~/.rpmmacros

    如果rpm包已经做好,但在安装的时候想修改默认路径,则可以:

    rpm -ivh --prefix=/opt/usr xxx.rpm

    又或者同时修改多个路径:

    rpm xxx.rpm --relocate=/usr=/opt/usr --relocate=/etc=/usr/etc

    3、制作补丁
    详细看参考:
    [原]使用diff同patch工具
    4、如何编写%file段
    由于必须在%file中包括所有套件中的文件,所以,我们需要清楚编译完的套件到底包括那些文件?
    常见的做法是,人工模拟一次编译的过程:

    ./configrue --prefix=/usr/local/xxx
    make
    make DESTDIR=/usr/local/xxx install

    make prefix=/usr/local/xxx install

    这样,整个套件的内容就会被放到/usr/local/xxx中,可根据情况编写%file和%exclude段。
    ※当然,这个只能对源码按GNU方式编写,并使用GNU autotool创建的包有效,若自定义Makefile则不能一概而论。
    5、关于rpm中的执行脚本
    如果正在制作的rpm包是准备作为放到系统安装光盘中的话,则需要考虑rpm中定义的脚本是否有问题。由于系统在安装的时候只是依赖于一个小环境进行,而该环境与实际安装完的环境有很大的区别,所以,大部分的脚本在该安装环境中都是无法生效,甚至会带来麻烦的。
    所以,对于这样的,需要放到安装光盘中的套件,不加入执行脚本是较佳的方法。
    另外,为提供操作中可参考的信息,rpm还提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中。

    引用
    0代表卸载、1代表安装、2代表升级

    可这样使用:

    引用
    %postun
    if [ "$1" = "0" ]; then
    /sbin/ldconfig
    fi

    ………………………………………………………………转载1…………….....................………………………………………
    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     #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
    - 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时也要用,如:


    *****************************************************转载2*****************************************************************

    rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS

    rpmrc配置文件:/usr/lib/rpm/rpmrc /etc/rpmrc   ~/.rpmrc
    各种宏定义: /usr/lib/rpm/macros /etc/rpm/macros  ~/.rpmmacros
    已经安装的rpm包数据库: /var/lib/rpm*

    临时文件:/var/tmp/rpm*

    可以通过命令rpm --showrc查看实现代码。另外直接通过rpm--eval "%{macro}"来查看具体对应路径。

    比如我们要查看%{_bindir}的路径,就可以使用命令rpm --eval"%{_bindir}"来查看。

    用以下命令将spec文件取出。
      $rpm -qlp *.src.rpm
      $rpm2cpio *.src.rpm|cpio -ivh *.spec
      首先执行rpm-qlp查询得知该套件中有几个.spec文件再执行rpm2cpio将rpm文件转换成cpio文件格式并将转换结果输出给cpio程序把sourcerpm套件中的sepc文件解压取出。

    SPEC脚本引用定义部分

    �fine userpath /var/www/html/demo

    Name:

    软件包的名称,后面可使用%{name}的方式引用
    Summary:

    软件包的内容概要
    Version:

    软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用
    Release:

    发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

    Copyright:

    软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,PublicDomain(公共域),Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。
    Group:

    软件分组,建议使用标准分组,软件包所属类别,具体类别有:

      Amusements/Games (娱乐/游戏)
      Amusements/Graphics(娱乐/图形)
      Applications/Archiving (应用/文档)
      Applications/Communications(应用/通讯)
      Applications/Databases (应用/数据库)
      Applications/Editors (应用/编辑器)
      Applications/Emulators (应用/仿真器)
      Applications/Engineering (应用/工程)
      Applications/File (应用/文件)
      Applications/Internet (应用/因特网)
      Applications/Multimedia(应用/多媒体)
      Applications/Productivity (应用/产品)
      Applications/Publishing(应用/印刷)
      Applications/System(应用/系统)
      Applications/Text (应用/文本)
      Development/Debuggers (开发/调试器)
      Development/Languages (开发/语言)
      Development/Libraries (开发/函数库)
      Development/System (开发/系统)
      Development/Tools (开发/工具)
      Documentation (文档)
      System Environment/Base(系统环境/基础)
      System Environment/Daemons (系统环境/守护)
      System Environment/Kernel (系统环境/内核)
      System Environment/Libraries (系统环境/函数库)
      System Environment/Shells (系统环境/接口)
      User Interface/Desktops(用户界面/桌面)
      User Interface/X (用户界面/X窗口)
      User Interface/X Hardware Support (用户界面/X硬件支持)

    License:

    软件授权方式,通常就是GPL
    Source:

    源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用。

    NoSource:0 #第一个源码不包含在包中


    Patch:

    补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用,

    补丁 ID 规则
    0-9 Makefile、configure 等的补丁
    10-39 指定功能或包含他的文件的补丁
    40-59 配置文件的补丁
    60-79 字体或字符补丁
    80-99 通过 xgettexize 得到的目录情况的补丁
    100- 其他补丁
    NoPatch:0 #第一个补丁文件不包含在包中
    BuildRoot:

    这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-root
    %{_tmppath}/%{name}-%{version}-%{release}-root

    %{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u}-n}
    该参数非常重要,后面可使用$RPM_BUILD_ROOT 方式引用。因为在生成rpm的过程中,执行makeinstall时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。

    ※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
    $RPM_BUILD_ROOT是指定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。

    URL:

    软件的主页
    Vendor:

    软件开发者名字,发行商或打包组织的信息,例如RedFlagCo,Ltd
    Distribution:

    发行版标识

    例如Red Hat Linux

    ExcludeArch: sparcs390  #rpm包不能在该系统结构下创建,如果是这个环境,将报错。

    ExclusiveArch: i386 ia64#rpm包只能在给定的系统结构下创建

    ExcludeOS:windows       #rpm包不能在该操作系统下创建

    ExclusiveOS:linux      #rpm包只能在给定的操作系统下创建

    (

    %ifarch sparc s390 判断处理器的结构

    %ifnoarch i386 alpha 与上边相反

    %ifos linux       测试操作系统

    %ifnos linux      与上边相反

    )

    Icon:

    file.xpm or file.gif#存储在rpm包中的icon文件


    Prefix:

    %{_prefix}这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
    %{_sysconfdir}这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识

    Prefix: /usr#定义一个relocatable的包,当安装或更新包时,#所有在/usr目录下的包都可以映射到其他目录,当定义Prefix时,所有%files标志的文件都要在Prefix 定义的目录下


    BuildArch:

    指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值

    Obsoletes:

    过时的,废弃的。

    Obsoletes:anaconda-images<= 10

    Provides:

    指明本软件提供一些特定的功能,以便其他rpm识别

    例如:

    Provides: mail-reader
    Requires:

    该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,

    ※“>=”号两边需用空格隔开,而不同软件名称也用空格分开

    例如:该包需要 libpng-devel版本至少为1.0.20,以及zlib
    Requires: libpng-devel >= 1.0.20 zlib

    Requires: bzip2 = %{version},bzip2-libs = %{version}

    Requires:perl(Carp)>=3.2 需要perl模块Carp
    PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
    PreReq: capability>=version     #capability包必须先安装

    Conflicts:bash>=2.0             #该包和所有不小于2.0的bash包有冲突

    以上三者是在安装RPM包时要满足.

    BuildRequires:

    BuildRequires: zlib-devel

    BuildPreReq:

     

    BuildConflicts:

    这三个选项的依赖性关系在构建RPM包时就要满足

    Autoreq:

    rpm_build时会为包里的二进制文件找出对应的共享库(.so)依赖,打成RPM包后可能在安装时提示缺少依赖并退出,要避免执行find-requires找共享库依赖,可以加上禁用自动依赖Autoreq:no  或者设为0

    Autoprov:

    rpm_build时会为包里的二进制文件找出对应的共享库(.so)依赖,打成RPM包后可能在安装时提示缺少依赖并退出,要避免执行find-provides找共享库依赖,可以加上禁用自动依赖Autoprov:no  或者设为0

    AutoReqProv:no

    rpm_build时会为包里的二进制文件找出对应的共享库(.so)依赖,打成RPM包后可能在安装时提示缺少依赖并退出,要避免执行find-provides与find-requires找共享库依赖,可以加上禁用自动依赖

    Autoprov:no   或者设为0 或者为flase相当于同时设定上边两个的值Autoreq:和Autoprov:

    上边3个会因为顺序的不同而导致结果会有所不同,一般以最后一个为准。

    %triggerin -- package <version

    执行脚本或者命令

    #当package包安装或更新时,或本包安装更新且package已经安装时,运行script

    当其所在软件包与指定软件包仅有一方安装时,安装另一方将触发此程序执行。

    %triggerun -- package

    执行脚本或者命令

    #当package包删除时,或本包删除且package已经安装时,运行script

    当其所在软件包与指定软件包都已安装时,卸载任一方将触发此程序执行。

    例如:

    %triggerun -- anaconda <8.0-1

    ./script

    %triggerpostun -- package

    #当package删除时运行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...

    -p  解释程序

    --  触发条件

    -n  子包的触发条件等

    Packager:

    打包者的信息,姓名以及邮箱等,处于同一行。
    �scription

    软件的详细说明

    上边是关于RPM包信息的一些描述。

    spec脚本主体

    %package

    #定义一个子包

    %package -n sub_package_name#定义一个子包,名字为sub_package_name

    当定义一个子包时,必须至少包含Summary:,Group:,�scription选项,任何没有指定的选项将用父包的选项,如版本等,如:

    %package server

    Requires: xinetd

    Group: System Environment/Daemons

    Summary:The server program for thetelnet remote login protocol

    �scription server

    Telnet is a popular protocol forlogging into remote systems

    如果在%package时用-n选项,那么在�scription时也要用,如:

    �scription -n my-telnet-server

     

    如果在%package时用-n选项,那么在%files时也要用,如:

    %files -nmy-telnet-server,也可以定义安装或卸载脚本,像定义%files和�scription 一样

    %package devel

    Summary: Header files and libraries fordeveloping apps which will use bzip2.

    Group: Development/Libraries

    Requires: bzip2 = %{version},bzip2-libs = %{version}

    �scription devel

    Header files and a static library ofbzip2 functions, for developing apps

    which will use the library.

     

    %package libs

    Summary: Libraries for applicationsusing bzip2

    Group: System Environment/Libraries

    �scription libs

    Libraries for applications using thebzip2 compression format.

     


    %prep

    预处理脚本,这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。
    %preun

    rpm卸载前执行的脚本
    %setup

    把源码包解压并放好
    通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。

    %setup -q %{name}-%{version}
    一般用%setup-q就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。

    %setup 不加任何选项,仅将软件包打开。

    %setup -q 在安静模式下且最少输出

    %setup -D #在解压之前禁止删除目录

    %setup -a number #在改变目录后,仅解压给定数字的源码,如-a0 for source0
    %setup -n newdir 将软件包解压到newdir目录。
    %setup -c 解压缩之前先产生目录。
    %setup -b num 包含多个源文件时,将第num个source文件解压缩。
    %setup -T 不使用default的解压缩操作。
    %setup -T -b 0 将第0个源代码文件SOURCE0解压缩。
    %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。

    %patch
    通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。

    一般参数为:
    %patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
    %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件
    %patch 最简单的补丁方式,自动指定patch level。
    %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
    %patch -s 不显示打补丁时的信息。
    %patch -T 将所有打补丁时产生的输出文件删除。

    %patch #打补丁0

    %patch1 #打补丁1

    %patch2 #打补丁2

    %patch -P 2 #打补丁2

    在%build之前,%prep部分将准备好编译工作,解开源码包,并将相应的补丁打进去。
    %build

    开始编译源码构建包,相当于configure以及make部分

    所要执行的命令为生成软件包服务,如

    %configure这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置,可以用rpm –eval'%configure'命令查看该宏
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行操作,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数。
    另一种不标准的写法是,可参考源码中的参数自定义,例如:

    引用

    CFLAGS="$RPM_OPT_FLAGS"CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

    make 命令
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:

    make %{?_smp_mflags}OPTIMIZE="%{optflags}"
    都是一些优化参数,定义在/usr/lib/rpm/marcros中

    %check
    %install

    开始把软件安装到虚拟的根目录中,本段是安装段,其中的命令在安装软件包时将执行,如makeinstall命令、cp、mv、install、ln。
    在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行makeinstall的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
    %makeinstall 这不是关键字,而是rpm定义的标准宏命令,相当于执行make install命令那一步。

    也可以使用非标准写法:

    make DESTDIR=$RPM_BUILD_ROOTinstall

    make prefix=$RPM_BUILD_ROOT install

    make INSTROOT=$RPM_BUILD_ROOTinstall
    需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:

    rm -rf ${RPM_BUILD_ROOT}

    mkdir -p$RPM_BUILD_ROOT/{%{_bindir},%{_mandir}/man1,%{_libdir},%{_includedir}}

    install -m 755 bzlib.h$RPM_BUILD_ROOT/%{_includedir}

    install -m 644 bzip2.1 bzdiff.1bzgrep.1 bzmore.1 $RPM_BUILD_ROOT/%{_mandir}/man1/

    install -d $RPM_BUILD_ROOT/
    cp -a * $RPM_BUILD_ROOT/

    ln -s file/magic ${RPM_BUILD_ROOT}%{_datadir}/magic

    %find_lang %{name}

    %files -f %{name}.lang

    第一句生成一个名为%{name}.lang的文件,内容是所有的%{name}.mo,第二句意思是一个一个列举.mo文件很麻烦,-f参数是将其后边接的文件合并到%files的文件列表。

    %clean

    清除编译和安装时生成的临时文件
    通常内容为:

    [ "$RPM_BUILD_ROOT" != "/" ]&& rm -rf "$RPM_BUILD_ROOT"
    rm -rf $RPM_BUILD_DIR/%{name}-%{version}
    %post

    rpm安装后执行的脚本
    %post libs -p /sbin/ldconfig

    libs包时执行这部分动作
    %postun

    rpm卸载后执行的脚本
    %postun libs  -p /sbin/ldconfig

     

    rpm还提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中。

    引用

    0代表卸载、1代表安装、2代表升级


    可这样使用:

    引用

    %postun
    if [ "$1" = "0" ]; then
    /sbin/ldconfig
    fi

    %verifyscript #软件包校验脚本程序开始执行

    %files

    �fattr (-,root,root)

    本段是文件段,用于定义构成软件包的文件列表,那些文件或目录会放入rpm中,分为三类-说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。

    这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。

    ※特别需要注意的是:%install部分使用的是绝对路径,而%file部分使用则是相对路径,虽然其描述的是同一个地方。千万不要写错。
    %files  -f %{name}.lang tui

    file1 #文件中也可以包含通配符,如*

    file2

    directory #所有文件都放在directory目录下

    %dir /etc/xtoolwait#仅是一个空目录/etc/xtoolwait打进包里

    %doc 表示这是文档文件,因此如安装时使用--excludedocs将不安装该文件,

    %doc /usr/X11R6/man/man1/xtoolwait.*#安装该文档

    %doc README NEWS#安装这些文档到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者

    %docdir#定义说明文档的目录,例如/root,在这一语句后,所有以/root开头的行都被定义为说明文件。

    %config /etc/yp.conf#标志该文件是一个配置文件,升级过程中,RPM会有如下动作。

    %config(missisgok) /etc/yp.conf此配置文件可以丢失,即使丢失了,RPM在卸载软件包时也不认为这是一个错误,并不报错。一般用于那些软件包安装后建立的符号链接文件,如

    /etc/rc.d/rc5.d/S55named文件,此类文件在软件包卸载后可能需要删除,所以丢失了也不要紧。

    %config(noreplace) /etc/yp.conf

    #该配置文件不会覆盖已存在文件(RPM包中文件会以.rpmnew存在于系统,卸载时系统中的该配置文件会以.rpmsave保存下来,如果没有这个选项,安装时RPM包中文件会以.rpmorig存在于系统)

    覆盖已存在文件(没被修改),创建新的文件加上扩展后缀.rpmnew(被修改)

    %{_bindir}/*

    %config /etc/aa.conf

    %ghost /etc/yp.conf#该文件不应该包含在包中,一般是日志文件,其文件属性很重要,但是文件内容不重要,用了这个选项后,仅将其文件属性加入包中。

    %attr(mode, user, group) filename#控制文件的权限如%attr(0644,root,root) /etc/yp.conf

    如果你不想指定值,可以用-

    %config %attr(-,root,root) filename#设定文件类型和权限

    �fattr(-,root,root)#设置文件的默认权限,-表示默认值,对文本文件是0644,可执行文件是0755

    %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:认证符号连接

     

    如果描述为目录,表示目录中出%exclude外的所有文件。

    %files
    �fattr(-,root,root)

    %doc
    %{_bindir}/*
    %{_libdir}/liba*
    %{_datadir}/file

    %{_infodir}/*

    %{_mandir}/man[15]/*

    %{_includedir}
    %exclude %{_libdir}/debug

    (%exclude列出不想打包到rpm中的文件。※小心,如果%exclude指定的文件不存在,也会出错的。)
    如果把

    %files
    �fattr(-,root,root)
    %{_bindir}
    写成

    %files
    �fattr(-,root,root)
    /usr/bin
    则打包的会是根目录下的/usr/bin中所有的文件。

    %files libs

    �fattr(-,root,root)

    %{_libdir}/*so.*

    %files devel

    �fattr(-,root,root)

    %{_includedir}/*

     

    由于必须在%file中包括所有套件中的文件,所以,我们需要清楚编译完的套件到底包括那些文件,常见的做法是,人工模拟一次编译的过程:

    ./configrue--prefix=/usr/local/xxx
    make
    make DESTDIR=/usr/local/xxx install

    make prefix=/usr/local/xxx install
    这样,整个套件的内容就会被放到/usr/local/xxx中,可根据情况编写%file和%exclude段
    ※当然,这个只能对源码按GNU方式编写,并使用GNUautotool创建的包有效,若自定义Makefile则不能一概而论。
    %changelog

    变更日志,本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:

    第一行是:* 星期月日 年 修改人电子信箱。

    其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。

    * Mon Mar 31 1997 Erik Troan<ewt@redhat.com>

     

    - Fixed problems caused by 64 bittime_t.



    展开全文
  • Spec Markdown 是一个基于markdown 的文档编写工具,安装简单,可以让我们编写出专业的文档 参考项目 https://github.com/rongfengliang/spec-md-demo 安装 全局 npm install -g spec-md 本地...

    Spec Markdown 是一个基于markdown 的文档编写工具,安装简单,可以让我们编写出专业的文档

    参考项目 https://github.com/rongfengliang/spec-md-demo

    安装

    • 全局
    npm install -g spec-md
    • 本地项目依赖
    npm install --save-dev spec-md

    项目使用

    因为个人原因,比较喜欢使用yarn,所以项目基于yarn 初始化

    • 初始化
    yarn init -y
    • 配置构建&&依赖
    yarn add spec-md --dev
    package.json
    {
    "name": "first",
    "version": "1.0.0",
    "main": "index.js",
    "license": "MIT",
    "dependencies": {
    "spec-md": "^0.6.0"
    },
    "scripts": {
    "b": "spec-md ./md/*.md > ./out/index.html",
    "live":"live-server --open=./out"
    },
    "devDependencies": {
    "live-server": "^1.2.0"
    }
    }
    md/userlogin.md

    构建&&运行

    • 构建
    yarn b
    • 访问
    yarn live
    • 效果

    参考资料

    http://leebyron.com/spec-md/
    https://github.com/rongfengliang/spec-md-demo

     
     
     
     
    展开全文
  • runspec的使用 runspec [options] [list of benchmarks to run] 常用选项:(尽量使用长选项) ...更像详细的内容可以看官方文档:http://www.spec.org/cpu2006/Docs/runspec.html#section1

    runspec的使用

    runspec [options] [list of benchmarks to run]

    常用选项:(尽量使用长选项)
    --action| -a:指定runspec的操作,有很多
        validate| run:默认操作,build,run,检查,并输出报告
        runsetup| setup:将可执行文件,复制到指定的目录
        build:创建(编译)
        buildsetup:指定build的目录,但是不编译
        confgpp:尝试输出config-file的报告,应该是用来看格式是否合适
        onlyrun:只执行,但是不确保答案正确
        clean:删除以当前用户命名的run和build目录的文件(类似于这样的nnn.benchmark\run and nnn.benchmark\build)
        clobber:删除所有指定benchmark集的可执行文件
        trash | realclean:对所有用户执行clean
        scrub :删除所有用户的build和run目录及文件
        
    --config | -c | --conf :指定config-file的名字

    --copies number| -C number:指定执行的副本数,和--rate一起用
    --rate| -R:spec-rate和--copies一起使用,可能是为了测试同时执行多个程序的情况
    --maxcompares N| --max_active_compares N:默认情况和--copies指定的数量一样。指定并行的程序数量,在多cpu时有用,但是不能超过--cpoies指定的数量

    --comment "text":在log中添加注释

    --define SYMBOL[=VALUE] | --define SYMBOL:VALUE :进行宏定义(SYMBOL将会在config-file中使用)

    --delay secs:指定benchmarks之间的延迟,不计入runtime中

    --deletework | -d:删除run目录并重新填充,如果你怀疑,run目录被破坏的话,你可以执行它

    --extension name[,name...] | --ext name[,name...] | -e name[,name...] :添加扩展并执行(由程序作者提供)

    --fake| --dryrun | --dry-runS:获取action执行的命令列表,像这样使用,--fake --action build

    --fakereport| --action=report | --reportonly:处理配置文件并输出report(像执行过一样,结果要么是0,要么是格式化的)

    --fakereportable| --mockup:处理配置文件并输出report(像"reportable" run 执行过一样)

    --[no]feedback:默认是 --feedback,进行多遍的编译(需要定义PASSn_xFLAGS,当config-file中有feedback=0才有用),--nofeedback是指定一遍编译

    --flagsurl URL[,URL...] | -F URL:指定flag-file的位置

    --[no]graph_auto | -[no]graphauto | --nograph_auto(默认值):是否指定绘制图形最高、最低点,便于观察结果
    --graph_max N | --graphmax:默认足够大,设置图的最高点
     --graph_min N | --graphmin N:默认为0,设置图的最低点

    --help| -h | -?:输出帮助文档

    --http_proxy proxy[:port]:用来进行版本检查的网络接口(在config-file中添加),默认不启用

    --http_timeout N:指定通过http匹配文件时的延迟,默认为30 seconds

    --ignore_errors| -I | --ignoreerror:不管错误继续运行,而默认情况是在第一个错误的地方停止

    --info_wrap_columns N |--infowrap N:控制非注释文本的行缩进,默认值为50

    --iterations number| -n number:指定benchmark执行的次数,默认三次

    --[no]keeptmp | --nokeeptmp:没有no,将保留编译的临时文件,默认不保留(nokeeptmp)

    --machine name[,name...] | --mach name[,name...] | -m name[,name...]:默认为空,需要在多种平台上运行时才指定(在config-file中写出)
        
    --make_no_clobber | -M:默认为clobber,在重新编译的时候不删除已经存在的对象文件,只用来产生问题报告

    --notes_wrap_columns N | --noteswrap:默认值为0,控制注释的行缩进

    --output_format format| -o format:指定输出报告的格式,默认为txt和html(详细参见http://www.spec.org/cpu2006/docs/runspec.html#out)

    --parallel_setup| --parallel-setup processes:默认值为1,并行执行的run-directory的数量,最大为--cpoies指定的数量

    --parallel_setup_type <fork|submit|none>:
        none :不做并行设置
        fork | --parallel_setup_prefork :用fork()创建一个setup进程,并将其绑定到一个处理器上
        submit:默认不启用,分离多个runspec请求,并且使用submit变量(config-file中)进行处理

    --parallel_test processes| --parallel-test processes:默认值为1或者--copies指定的执行程序数量。
        reportable-run的test和train的工作是并行的,并使用SPECrate变量(可以设置为1来禁止)
        SPECspeed是默认禁止运行的,可以设置它大于1来启动
        (并没有明白)

    --preenv:启用config-file中的preENV,应该使用来打印一些环境变量的
    --nopreenv:不启用config-file中的preENV

    --rawformat rawfiles|-R rawfile:
        默认不启用,不运行程序,而是调用已有结果生成报告
        --action将被忽略

    --rebuild| -D:删除已经编译好的文件,并且重新编译

    --reportable | -s | --strict | --noloose:必须明确int fp all其中之一,强制了一些选项,比如一定是执行3次(test,train,ref各一次,应该是这样)
    --loose| --noreportable| -l | --nostrict:为了查看是否能编译过并执行,但是不想生成报告(config-file还没完善)

    --review, --noreview:默认为noreview,格式化结果并输出,能打印更多的详细信息

    --setprocgroup, --nosetprocgroup:默认为set,将所有进行放入一个进程组中,便于使用ctrl-c终止运行

    --size size[,size...] | -i size | --input size:
        选择输入数据的大小,有test,train和ref三种
        test:常用来进行debug一些编译选项
        test和train:用来确保程序有正确的结果
        ref:运行ref形式三次,来进行测试

    --speed:默认不启用,进行一次SPECspeed的运行,不管config-file的设置

    --table, --notable:默认为--table,结果中包含一个run的列表

    --test:在specperl上执行多种perl的测试

    --train_with WORKLOAD:默认为train,用反馈指导编译,是必要的编译选项,最好在config-file中指明

    --tune tuning| --tuning tuning | -T tuning:用来测试不同的cpu运行状况
        有三个选择,base,peak(峰值)和all,默认为base
        reportable-run时,必须选择base或者all
        
    --undef SYMBOL:移除某个宏定义

    --make_bundle name | --make-bundle name:默认为空,将二进制、config和其他支持文件一起打包在一起
        例子:http://www.spec.org/cpu2006/docs/runspec.html#make_bundle
    --unpack_bundle name:默认为none,解压之前制作好的包(bundle),不执行
    --use_bundle name:默认为none,使用之前制作好的包(bundle),执行

    --update|--update_flags | --flagupdate | --flagsupdate | --newflags | --getflags:
        默认不检查,检查benchmark的flag-file的更新

    --username name| -U name:默认和当前进程一样,指定user的name

    --verbose n | --debug n | -v n:设置信息级别,默认为5,范围1-99

    --version:打印版本信息

    运行级别:
    setup for test
    base test, peak test
    setup for train
    base train, peak train
    setup for ref
    base ref1, base ref2, base ref3
    peak ref1, peak ref2, peak ref3

    例子:
    1.执行459,465两个测试集,不报告
        runspec --config jason_july09d.cfg --noreportable 459.GemsFDTD 465.tonto

    2.执行除了471,473,483之外的整数测试集,不报告
        runspec --noreportable -config kathy_sep14c.cfg int ^471.omnetpp ^473.astar ^483.xalancbmk

    3.执行一次483(--iterations 1 --loose 两个选项一起使用)
        runspec --config golden --iterations 1 --loose 483.xalancbmk

    4.清空浮点测试集的run和build目录
        runspec --action clean --config may12a fp

    5.指定int测试集有四个执行副本
    runspec --config tony_may12a --rate 4 int
    runspec --config tony_may12a --rate --copies 4 int

    6.版本确认的端口问题
    For example, a failure of this form:

    $ runspec --rawformat --output_format txt \
       --flagsurl http://portlandcyclers.net/evan.xml  CFP2006.007.ref.rsf
    ...
    Retrieving flags file (http://portlandcyclers.net/evan.xml)...

    ERROR: Specified flags URL (http://portlandcyclers.net/evan.xml) could not be retrieved.
           The error returned was: 500 Can't connect to portlandcyclers.net:80
           (Bad hostname 'portlandcyclers.net')

    improves when a proxy is provided:

    $ runspec --rawformat --output_format txt \
       --flagsurl http://portlandcyclers.net/evan.xml  \
       --http_proxy=http://webcache.tom.spokewrenchdad.com:8080 CFP2006.007.ref.rsf

    7.利用rawformat选项和已有结果生成报告
    runspec --rawformat --output_format html,ps $SPEC/result/CPU2006.324.ref.rsf

    8.使用之前创建好的包
    runspec --use_bundle /Volumes/CPU2006/cpu2006/mumble.cpu2006bundle.xz


    更像详细的内容可以看官方文档:http://www.spec.org/cpu2006/Docs/runspec.html#section1

    展开全文
  • F12/CTRL+shift+i查看页面 swagger访问不到,页面也报404 这个情况:检查以下swagger的配置工具类config/ Swagger2.java //对外暴露服务的包,以controller的方式暴露,所以就是controller的包. ...

    在这里插入图片描述

    F12/CTRL+shift+i查看页面

    在这里插入图片描述

    swagger访问不到,页面也报404

    这个情况:检查以下swagger的配置工具类config/ Swagger2.java

    //对外暴露服务的包,以controller的方式暴露,所以就是controller的包.

     .apis(RequestHandlerSelectors.basePackage("cn.itsource.hrm.web.controller"))
    

    我是把包名controller写错了,导致swagger访问不到,页面也报404

    展开全文
  • 随之对应的就是研发人员的ESP(engineer spec)文档,,该文档就是对PRD进行功能理解说明,,形成和产品经理的统一意见, 然后就可以开工了。 原则在开发初期需要形成概要和详细设计文档, 作为研发对架构,设计思想的...
  • spec文件

    千次阅读 2019-09-29 13:43:47
    spec文件 spec文件是配置规范文件,是RPM软件包编译过程的核心,它说明了软件包如何被配置、打那些补丁、安装哪些文件、安装到哪里、安装过程需要哪些系统级别活动。 参数说明 相关链接: ...
  • MQTT_spec_3.1.1

    2018-08-13 11:06:28
    MQTT spec 3.1.1 物联网协议文档,根据这个文档进行产品开发
  • podspec转podspec.json

    千次阅读 2016-03-26 15:26:44
    podspec转podspec.json
  • SPECCPU2006 Spec2006 使用说明

    千次阅读 2019-07-14 21:53:00
    Spec2006使用说明 五 10 十月 2014 Bypenglee ...SPEC CPU 2006 benchmark是SPEC新一代的行业标准化的CPU测试基准套件。重点测试系统的处理器,内存子系统和编译器。这个基准测试套件包括的SPEC...
  • CPU SPEC 2006

    热门讨论 2009-11-11 10:00:20
    CPU SPEC 2006 说明,全英文记录,保证你双收
  • PCIE SPEC 4.0 规格书

    热门讨论 2016-12-06 14:14:48
    PCIE SPEC 4.0 规格书
  • rpmbuild SPEC语法

    千次阅读 2015-11-13 11:39:14
    1.The RPM system assumes five RPM directories BUILD:rpmbuild编译软件的目录 ...SPEC:存放spec文件的目录 SRPMS:rpmbuild创建的source RPM所存放的目录 2.rpm内建的宏在文件/usr/lib/rpm/
  • CocoaPods spec-> spec.json

    千次阅读 2016-05-30 11:05:41
    使用 CocoaPods 用的 library 時,要把 podspec 轉成 .podspec.json 格式 pod ipc spec 找了找發現 pod 有這個功能可以用 > ipc , inter-process communication ,加上 spec 之後,就可以轉換成 JSON ...
  • Atom飞行手册翻译: 3.8 编写spec

    万次阅读 2015-08-06 14:33:00
    编写 spec我们已经通过一些例子查看并编写了一些spec,现在是更进一步查看spec框架本身的时候了。确切地说,你在Atom中如何编写测试呢?Atom使用Jasmine作为spec框架。任何新的功能都要拥有specs来防止回归。创建新...
  • spec脚本

    千次阅读 2012-01-30 15:10:32
    一、编写spec脚本   rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。  实际过程中,...
  • spec是配置cocoapods中最大的坑 其中遇到了太多的问题 特别是lint验证的时候。 幸好,官方提供了解决方案文档 https://guides.cocoapods.org/syntax/podspec.html#specification 依照这个文档我们可以很轻松的...
  • spec1

    2010-05-04 13:51:00
    本文分为两部分,第一部分阐述了 rpm 工具的功能以及 rpmbuild 工具,详细的介绍了 spec文件的书写规则以及关键部分,第二部分对一个典型的 spec 文件做了详细的分析。为了方便朋友们查看,我找了中文的rpmbuild 的...
  • spec 官方文档介绍 PyInstaller要做的第一件事是建立一个spec(规范)文件 myscript.spec。该文件存储在–specpath=目录中,默认情况下为当前目录。 规范文件告诉PyInstaller如何处理脚本。它对脚本名称和您提供给...
  • SPEC文件详解

    万次阅读 2016-04-11 16:49:15
    1 spec文件 1.1 spec文件的语法 TagName: value 比如 Version: 2.1.0 tag名大小写不敏感。 1.2 宏 spec支持定义宏,要定义宏,使用: %define testMacro 2 这里定义了一个宏,名称为...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含...
  • spec文件知识整理

    千次阅读 2018-11-08 17:17:19
    rpmbuild目录下各个文件的用途: ...spec文件一般包含以下部分: ==================================文件头==================================================== Name: hellorpm #名字为源码tar.gz 包的名字...
  • RPM构建 - SPEC文件参数解析

    万次阅读 2016-11-11 18:04:12
    通常,供Linux使用的源代码包还提供一个名为 { 软件名称 }.spec 的文件,即spec文件。如果提供spec文件,则该源代码还可以直接编译成RPM包。spec文件只是一个具有特殊语法的文本文件。spec文件中包含了软件包的诸多...
  • SPEC携手Cloud孕育性能新基准

    千次阅读 2016-10-30 16:14:40
    SPEC 2016亚洲峰会已经成功拉下了帷幕,本次...随着云计算的兴起,SPEC组织在一次次尝试开发新的测试基准,为用户在产品选型上提供专业的指导和建议,并在该盛会上发布了SPEC Cloud IaaS 2016第一个云计算测试基准。
  • onvif2.5 core spec

    2015-03-23 22:33:34
    这个spec的目标是为不同网络下的产品提供协同工作的机制。本spec描述了网络模型、接口、数据结构和数据交换方式。本 spec尽量采用已有的相关标准,同时必要会定义新的内容。 这是onvif的core spec,通过如下几方面...
  • rpmbuild SPEC文件的语法

    千次阅读 2018-05-23 11:19:26
    1.The RPM system assumes five RPM directoriesBUILD:rpmbuild编译软件的目录RPMS:rpmbuild创建的binary RPM所存放的目录SOURCES:存放源代码的目录SPEC:存放spec文件的目录SRPMS:rpmbuild创建的source RPM所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,355
精华内容 18,942
关键字:

产品spec文档