常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这里我们是以其软件包的格式来划分的,这两类系统分别提供了自己的软件包管理系统和相应的工具。类RedHat系统中软件包的后缀是rpm;类Debian系统中软件包的后缀是deb。另一方面,类RedHat系统提供了同名的rpm命令来安装、卸载、升级rpm软件包;类Debian系统同样提供了dpkg命令来对后缀是deb的软件包进行安装、卸载和升级等操作。
   rpm的全称是Redhat Package Manager,常见的使用rpm软件包的系统主要有Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等。使用deb软件包后缀的类Debian系统最常见的有Debian、Ubuntu、Finnix等。

rpmbuild制作rpm包

 

 

 

 

从软件运行的结构来说,一个软件主要可以分为三个部分:可执行程序、配置文件和动态库。当然还有可能会有相关文档、手册、供二次开发用的头文件以及一些示例程序等等。其他部分都是可选的,只有可执行文件是必须的。

rpmbuild默认工作路径的确定,通常由在/usr/lib/rpm/macros这个文件里的一个叫做%_topdir的宏变量来定义。如果用户想更改这个目录名,rpm官方并不推荐直接更改这个目录,而是在用户家目录下建立一个名为.rpmmacros的隐藏文件(注意前面的点不能少,这是Linux下隐藏文件的常识),然后在里面重新定义%_topdir,指向一个新的目录名。这样就可以满足某些“高级”用户的差异化需求了。通常情况下.rpmmacros文件里一般只有一行内容

1 %_topdir    $HOME/rpmbuild

 

echo '%_topdir %(echo $HOME)/path/to/dir' > .rpmmacros

rpmdev-setuptree会在%_topdir自动生成目录结构

此外rpm -ivh name-version-release.src.rpm时,会在%_topdir的相关目录中安装包(其实就是拷贝),此过程需要%_topdir变量

rpmbuild制作rpm包

 

 

rpmbuild --showrc

rpmbuild制作rpm包

 

 rpmbuild --target x86_64 可指明目标平台架构

2. spec文件

rpmbuild制作rpm包

rpmbuild制作rpm包

 

 

 

 Name:                  myapp <===软件包的名字(后面会用到)
Version:               0.1.0 <===软件包的版本(后面会用到)
Release:               1%{?dist} <===发布序号
Summary:               my first rpm <===软件包的摘要信息
Group:                 <===软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
License:               GPL <===软件的授权方式
URL:                   <===这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类
Source0:               %{name}-%{version}.tar.gz <===源代码包的名称(默认时rpmbuid回到SOURCES目录中去找),这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。
BuildRoot:             %{_topdir}/BUILDROOT <=== 这是make install时使用的“虚拟”根目录,最终制作rpm安装包的文件就来自这里。
BuildRequires:         <=== 在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求编译myapp时,gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。还有其他依赖的话则以逗号分别继续写道后面。
Requires:              <=== 编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
%description           <=== 软件包的详细说明信息,但最多只能有80个英文字符

%{_tmppath}代表的路径为 /var/tmp

SPEC文件各阶段:

  • %prep
    源代码的解压和打补丁,最常见的指令
    %setup -q

    位于SOURCES目录下的源码包必须为name-version.tar.gz格式,会自动进行后续阶段的目录切换和设置

  • %build
    一般执行configure和make,常见指令
    %configure
    make %{?_smp_mflags}

    软件安装时路径默认设置(configure的默认设置):

  1. --build=x86_64-redhat-linux-gnu
  2. --host=x86_64-redhat-linux-gnu
  3. --program-prefix=
  4. --prefix=/usr
  5. --exec-prefix=/usr
  6. --bindir=/usr/bin
  7. --sbindir=/usr/sbin
  8. --sysconfdir=/etc
  9. --datadir=/usr/share
  10. --includedir=/usr/include   二次开发的头文件
  11. --libdir=/usr/lib64   库文件路径,32和64系统是不同的
  12. --libexecdir=/usr/libexec
  13. --localstatedir=/var
  14. --sharestatedir=/var/lib
  15. --mandir=/usr/share/man
  16. --infodir=/usr/share/info

  %configure是个宏常量,会自动设置上面的默认路径,可接受额外参数,可不使用%configure的宏,自定义configure的配置参数,同样可给make传递额外参数

  • %install
    这个阶段执行make install操作,会在%_buildrootdir中建好目录结构,将需要打包到rpm中的文件从%_builddir复制到%_buildrootdir对应目录中,常见指令
    1 rm -rf $RPM_BUILD_ROOT
    2 make install DESTDIR=$RPM_BUILD_ROOT

    $RPM_BUILD_ROOT即是buildroot变量,可写成%{buildroot},需小写.如果有额外的配置文件,启动脚本,可手动用copy,install拷贝到%{buildroot}目录中.

  • %clean
    编译完成后的清理工作,对%{buildroot}目录清空,make clean等
  • %files
    说明%{buildroot}目录下的哪些文件和目录打包到rpm中
    1 %files
    2 %defattr(-,root,root,-)
    3 %doc
    4 
    5 %defattr(文件权限,用户名,组名,目录权限)

    如果没有定制特殊权限,则使用默认%defattr(-,root,root,-)设置缺省权限
    %files
    %{_bindir}/*
    %{_libdir}/*
    %config(noreplace) %{_sysconfdir}/*.conf
    打包文件列表可以宏常量开头,也可以/开头,无区别,都表示从%{buildroot}中复制到rpm中,相对路径,表示复制的文件位于%{_builddir}目录,适用于在%install阶段没有复制到%{buildroot}目录中的文件,i.g. README,LICENSE
    不想将%{buildroot}中的文件或目录打包,则使用%exclude file_name.
    %{buildroot}所有文件都要显式指明是否打包到rpm中.
    %doc宏,所有跟在这个宏后面的文件都来自%{_builddir}目录,安装rpm时,此宏所指的的文件都会安装到/usr/share/doc/name-version/中

  • %changelog
    记录日志变更
    * date +"%a %b %d %Y" author mailbox version
    - something that has changed

     

  • %package
    定义子包
    %package -n openstack-dashboard
    Summary:    Openstack web user interface reference implementation
    Group:      Applications/System
    
    Requires:   httpd
    
    %description doc
    Documentation for the Django Horizon application for talking with Openstack

     

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硬件支持)

 

practice

一.libmad-0.15.1b.tar.gz
http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz

  1. cd ~
  2. mkdir -pv rpmbuild/{BUILD,SOURCES,RPMS,SRPMS,SPECS}
  3. cd rpmbuild && rpmdev-newspec -o SPECS/libmad.spec
    rpmbuild制作rpm包

     

  4. libmad.spec
     1 Name:           libmad
     2 Version:        0.15.1b
     3 Release:        1%{?dist}
     4 Summary:        MP3 Codec
     5 
     6 Epoch:        1
     7 Provides:    libmad
     8 Packager:    occurence
     9 Vendor:        occurence
    10 Group:        System Environment/Base
    11 License:        GPL
    12 Distribution:    instrumentation
    13 URL:            http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz
    14 BuildRoot:    %{_topdir}/BUILDROOT
    15 Source0:        %{name}-%{version}.tar.gz
    16 Source1:    mere_doc
    17 
    18 BuildRequires:  gcc,gcc-c++
    19 Requires:       gcc,gcc-c++
    20 #Conflicts:
    21 BuildArch:    x86_64
    22 
    23 %description
    24 libmad mp3 codec
    25 
    26 %package        devel
    27 Summary:        Development files for %{name}
    28 Group:        Development/Libraries
    29 Requires:       %{name}%{?_isa} = %{version}-%{release}
    30 
    31 %description    devel
    32 The %{name}-devel package contains libraries and header files for
    33 developing applications that use %{name}.
    34 
    35 
    36 %prep
    37 %setup -q
    38 install -pm 777 %{SOURCE1} .
    39 
    40 
    41 %build
    42 sed -i '/-fforce/d' configure
    43 sed -i '/-fforce-mem/d' configure
    44 %configure --enable-shared
    45 make %{?_smp_mflags}
    46 
    47 
    48 %install
    49 rm -rf $RPM_BUILD_ROOT
    50 make install DESTDIR=$RPM_BUILD_ROOT
    51 #%make_install
    52 #find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
    53 
    54 %clean
    55 #rm -rf $RPM_BUILD_ROOT
    56 
    57 %post -p /sbin/ldconfig
    58 
    59 %postun -p /sbin/ldconfig
    60 
    61 
    62 %files
    63 %defattr(-,root,root,-)
    64 %doc
    65 %{_libdir}/
    66 %{_includedir}/*
    67 
    68 %files devel
    69 %doc mere_doc
    70 %{_includedir}/*
    71 %{_libdir}/*.so
    72 
    73 
    74 %changelog
    75 * Fri Jun 05 2020  margin <margin@margin.margin.com> 0.15.1b
    76 - Initail version
    View Code

相关文章:

  • 2022-02-24
  • 2019-09-18
  • 2021-12-14
  • 2021-08-08
猜你喜欢
  • 2022-03-03
  • 2021-11-24
  • 2022-12-23
  • 2021-07-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案