zoukankan      html  css  js  c++  java
  • 根据某个文件或文件夹自制rpm包

    官方文档资料:https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#.E5.85.B3.E4.BA.8E.E6.9C.AC.E6.8C.87.E5.8D.97

    首先安装打包软件
    # yum install rpmbuild  rpmdevtools -y

    生成打包路径
    1.使用rpmdev-setuptree ,会自动在用户家目录生成一个rpmbuild的文件夹,作为工作路径
    2.cd rpmbuild/SPECS路径,创建my.spec文件,仅仅需要以下内容
    ################my.spec##############
    Name: shepherd
    Version: 1.0
    Release: 1%{?dist}
    Summary: luckykris
    License: GPL
    Group: github

    Vendor:wjoyxt
    %description
    %prep     #打包前所要做的操作
    %files      #搜集你想打包的文件或文件夹,也是未来安装到的路径
    %defattr(-,root,root,-)      #你想打包的文件的默认权限
    /usr/local/bin/shepherd      #搜集你想打包的文件或文件夹,也是未来安装到的路径
    %doc
    %require      #包依赖 ,值得一提的是,你打包的所有文件中如果有可执行的二进制文件,安装的默认会用 ldd命令去查看 ,是否有not found的动态链接库,如果有的话,会报出依赖关系缺失异常,阻止你安装rpm包
    %pre      #安装包前所需要做的操作
    %post    #安装包后所要做的操作
    %changelog
    ###################################
    3.执行打包命令rpmbuild -bb shepherd.spec
    首次执行之后会报错:
    [root@dev-ansible-server SPECS]# rpmbuild -ba shepherd.spec
    Processing files: shepherd-1.0-2.x86_64
    error: File not found: /root/rpmbuild/BUILDROOT/shepherd-1.0-2.x86_64/usr/local/bin/shepherd
    RPM build errors:
        File not found: /root/rpmbuild/BUILDROOT/shepherd-1.0-2.x86_64/usr/local/bin/shepherd
    看到没有找到路径的报错,然后你需要手动建立这个路径
    mkdir -p /root/rpmbuild/BUILDROOT/shepherd-1.0-2.x86_64/usr/local/bin/


    4.报错之后,你需要做的就是把你编译好的自己的程序的路径,复制到步骤3中报错的路径中。
    也就是放在这个路径File not found: /root/rpmbuild/BUILDROOT/shepherd-1.0-2.x86_64/usr/local/bin/shepherd
    5.放到规定路径后再次执行,就会成功打成rpm包。rpm包会放在rpmbuild/RPMS/x86_64这个路径下。

    rpm -qpi *.rpm 查看rpm包的描述信息

    ------------------------------------------------------------------------------------------------------------------

    一. rpmbuild介绍
    顾名思义创建rpm包,它是用来指示转换的源码不定编译成二进制文件的包,在centos下默认目录为/usr/src/redhat
    二.目录
    /usr/src/redhat
    --BUILD         #编译之前,如解压包后存放的路径
    --BUILDROOT #编译后存放的路径
    --RPMS        #打包完成后rpm包存放的路径
    --SOURCES #源包所放置的路径
    --SPECS  #spec文档放置的路径
    --SPRMS  #源码rpm包放置的路径
    注:一般我们都把源码打包成tar.gz格式然后存放于SOURCES路径下,而在SPECS路径下编写spec文档,通过命令打包后,默认会把打包后的rpm包放在RPMS下,而源码包会被放置在SRPMS下
    三. rpmbuild相关命令
    基本格式:rpmbuild [options] [spec文档|tarball包|源码包]
    1.  从spec文档建立有以下选项:
    -bp  #只执行spec的%pre 段(解开源码包并打补丁,即只做准备)
    -bc  #执行spec的%pre和%build 段(准备并编译)
    -bi  #执行spec中%pre,%build与%install(准备,编译并安装)
    -bl  #检查spec中的%file段(查看文件是否齐全)
    -ba  #建立源码与二进制包(常用)
    -bb  #只建立二进制包(常用)
    -bs  #只建立源码包
    2.  从tarball包建立,与spec类似
    -tp #对应-bp
    -tc #对应-bc
    -ti #对应-bi
    -ta #对应-ba
    -tb #对应-bb
    -ts #对应-bs
    3.  从源码包建立
    --rebuild  #建立二进制包,通-bb
    --recompile  #同-bi
    4.  其他的一些选项
    --buildroot=DIRECTORY   #确定以root目录建立包
    --clean  #完成打包后清除BUILD下的文件目录
    --nobuild  #不进行%build的阶段
    --nodeps  #不检查建立包时的关联文件
    --nodirtokens
    --rmsource  #完成打包后清除SOURCES
    --rmspec #完成打包后清除SPEC
    --short-cricuit
    --target=CPU-VENDOR-OS #确定包的最终使用平台
    四.  spec文档的编写

    Name: 软件包的名称,后面可使用%{name}的方式引用,具体命令需跟源包一致
    Summary: 软件包的内容概要
    Version: 软件的实际版本号,具体命令需跟源包一致
    Release: 发布序列号,具体命令需跟源包一致
    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}引用
    BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
    %{_tmppath}/%{name}-%{version}-%{release}-root

    %{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
    该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
    后面可使用$RPM_BUILD_ROOT 方式引用。
    URL: 软件的主页
    Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd
    Disstribution: 发行版标识
    Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
    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: 打包者的信息
    �scription 软件的详细说明
    #spec脚本主体
    spec脚本的主体中也包括了很多关键字和描述,下面会一一列举。我会把一些特别需要留意的地方标注出来。
    %prep 预处理脚本
    %setup -n %{name}-%{version} 把源码包解压并放好
    注:可根据你的源码的名字格式,来确认解压后名字的格式,否则可能导致install的时候找不到对应的目录
    通常是从/usr/src/redhat/SOURCES里的包解压到/usr/src/redhat/BUILD/%{name}-%{version}中。
    一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
    %patch 打补丁
    通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:
    %patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
    %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

    ◎补充一下
    %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 将所有打补丁时产生的输出文件删除。

    %build 开始构建包
    在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:
    make %{?_smp_mflags} OPTIMIZE="%{optflags}"
    都是一些优化参数,定义在/usr/lib/rpm/marcros中

    %install 开始把软件安装到虚拟的根目录中
    在/usr/src/redhat/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/redhat/BUILD,其中,前面的才是%file需要的。

    %pre rpm安装前执行的脚本

    %post rpm安装后执行的脚本

    %preun rpm卸载前执行的脚本

    %postun rpm卸载后执行的脚本

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

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

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

    五. spec文档中常用的几个宏(变量)
    1. RPM_BUILD_DIR:    /usr/src/redhat/BUILD
    2. RPM_BUILD_ROOT:   /usr/src/redhat/BUILDROOT
    3. %{_sysconfdir}:   /etc
    4. %{_sbindir}:     /usr/sbin
    5. %{_bindir}:       /usr/bin
    6. %{_datadir}:      /usr/share
    7. %{_mandir}:       /usr/share/man
    8. %{_libdir}:       /usr/lib64
    9. %{_prefix}:       /usr
    10. %{_localstatedir}:   /usr/var

  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/5554004.html
Copyright © 2011-2022 走看看