当前位置:   article > 正文

rpm包与deb包的制作过程_c++怎么打包成rpm

c++怎么打包成rpm

制作RPM包

第一步:

BUILD目录:tar.gz包的解压后存放的位置,并在此目录进行编译安装

SPECS目录:存放SPEC文件(important

RPMS目录:存放制作好的rpm

SOURCES目录:存放源代码

SRPMS目录:存放编译好的二进制rpm

BUILDROOT目录:在BUILD目录中执行完make install之后生成的目录

mkdri -p ~/rpmbuild/{BUILD.BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

 

第二步:

打包源代码,工具等等。。。

tar czf  xxx.tar.gz xxx

 

第三步:

写spec文件

由于这是一个自动化编译和打包脚本,所以写成了一个函数

重点黄色的部分

build_rpm()

{

mkdir -p ~/rpmbuild/{BUILD.BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

cp ${DIAG_ROOT}/cel_diag-${PROJ_NAME}.v${VERSION}.${REVISION}.${MINVER}.tar.gz ~/rpmbuild/SOURCES

 

version=${VERSION}.${REVISION}.${MINVER}

   

cat <<EOF > ~/rpmbuild/SPECS/diag.spec

Name:           cel_diag-${PROJ_NAME}

Version:      ${version}

Release:      1%{?dist}

Summary:          Auto build RPM test

 

Group:               Development/Tools

License:      GPL

URL:                http://www.xxx.com

Source0:     %{name}.v%{version}.tar.gz

 

BuildRequires:  gcc,make  

Requires:           gcc

 

%description

Auto build RPM test

 

%prep

%setup -c

 

%install

cd ${PROJ_NAME}

mkdir -p  \${RPM_BUILD_ROOT}/usr/local/diag/

pwd

ls

chmod 777 * -R

cp ./* \${RPM_BUILD_ROOT}/usr/local/diag/ -rf

 

%files

/usr/local/diag/*

 

%clean

EOF

chmod 0755 ~/rpmbuild/SPECS/diag.spec

rpmbuild -ba ~/rpmbuild/SPECS/diag.spec

mv ~/rpmbuild/RPMS/x86_64/*.rpm ${DIAG_ROOT}/cel_diag-${PROJ_NAME}.v${version}.rpm

rm -rf ~/rpmbuild

}

 

第四步:

就是制作rpm包了

rpmbuild -bp 执行到%prep

rpmbuild -bc 执行到%build中的config

rpmbuild -bi 执行至%build中的install

rpmbuild -ba 编译后做成rpm包和src.rpm

rpmbuild -bs 仅制作src.rpm

rpmbuild -bb 仅制作rpm

 第五步

安装rpm

rpm –ivh xxx.rpm

查询是否安装了

rpm  -qi xxx

卸载安装包

rpm  -e xxx

下面说一下关于SPEC文件:

Name 软件包名字

Version 软件包版本

Release 软件包修订号

Summary 软件包简单描述

Group 软件包所属组。必须是系统定义好的组

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

Vendor 软件包发型厂商

Packager 软件包打包者

URL 软件包的url

Source 定义打包所需的源码包,可以定义多个,后面使用%{SOURCE}调用

Patch 定义补丁文件,后面可以使用%{Patch}调用

BuildRoot 定义打包时的工作目录

BuildRequires 定义打包时依赖的软件包

Requires 定义安装时的依赖包,形式为Package name 或者 Package >= version

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

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

%package 定义一个子包

%description 详细描述信息

 

自定义打包参数;

%prep 预处理段,默认是解压源码包,可以自定义shell命令和调用RPM宏命令

%post rpm安装后执行的命令,可以自定义shell命令和调用RPM宏命令

%preun rpm卸载前执行的命令,可以自定义shell命令和调用RPM宏命令

%postun rpm卸载后执行的命令,可以自定义shell命令和调用RPM宏命令

%patch 打补丁阶段

%build 编译安装段,此段包含./configure和 make 安装阶段

%install 安装阶段,会把编译好的二进制文件安装到BUILDROOT为根的目录下

%files 文件段,定义软件打包时的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。其路径为相对路径

%changelog 定义软件包修改的日志

 

 

关于Group,特意去查了一下

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

 

%setup 的用法

%setup 不加任何选项,仅仅打开源码包

%setup -n newdir 将软件包解压至新目录(重命名解压的包),默认

%setup -c 解压缩之前先产生目录。

%setup -b num 将第num个source文件解压缩。

%setup -T 不使用default的解压缩操作。

%setup -T -b 0 将第0个源代码文件解压缩。

%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。

%setup -q 解压不输出信息

 

%Patch用法

先使用Patch{n}定义补丁包,然后使用%patch{n}或者%{patch{n}}来调用打补丁

补丁号命名规则

0-9 Makefile、configure 等的补丁

10-39 指定功能或包含他的文件的补丁

40-59 配置文件的补丁

60-79 字体或字符补丁

80-99 通过 xgettexize 得到的目录情况的补丁

100- 其他补丁

%patch 最简单的补丁方式,自动指定patch level。

%patch 0 使用第0个补丁文件,相当于%patch -p 0。

%patch -s 不显示打补丁时的信息。

%patch -T 将所有打补丁时产生的输出文件删除

%patch -b name 在打补丁之前,将源文件加入name,缺省为.org

 

%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

%attr(600,work,work) 指定特定的文件目录权限

fattr (-,root,root)

 

关于%install 和 %file注意的点

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

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

 

 

制作deb包

deb包本身有三部分组成:

数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;

安装信息及控制脚本包, 包含deb的安装说明,标识,脚本等,文件名为 control.tar.gz;

最后一个是deb文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可以看到。

  deb本身可以使用不同的压缩方式. tar格式并不是一种压缩格式,而是直接把分散的文件和目录集合在一起,并记录其权限等数据信息。之前提到过的 data.tar.XXX,这里 XXX 就是经过压缩后的后缀名. deb默认使用的压缩格式为gzip格式,所以最常见的就是 data.tar.gz。常有的压缩格式还有 bzip2 和 lzma,其中 lzma 压缩率最高,但压缩需要的 CPU 资源和时间都比较长

 

data.tar.gz包含的是实际安装的程序数据,而在安装过程中,该包里的数据会被直接解压到根目录(即 / ),因此在打包之前需要根据文件所在位置设置好相应的文件/目录树。

control.tar.gz则包含了一个 deb 安装的时候所需要的控制信息.

一般有 5 个文件:

  控制文件

  描述

  control

  用了记录软件标识,版本号,平台,依赖信息等数据

  preinst

  在解包data.tar.gz前运行的脚本

  postinst

  在解包数据后运行的脚本

  prerm

  卸载时,在删除文件之前运行的脚本

  postrm

  在删除文件之后运行的脚本

2  制作deb包

2.1   最基础的方式dpkg-deb

最基础的方式需要我们自己编写和创建脚本, 不使用其他辅助工具, 而只使用标准的dpkg-deb打包命令

我们以之前的微信电脑版的代码为例子, 为其创建一个deb安装包

首先我们为我们创建一个工作目录electronic-wechat

然后我们创建一个名为DEBIAN的目录, 用于存放控制信息

然后我们创建对应的二进制包安装安装完成后的路径信息放置在DEBIAN的同级目录下, 也就是说我们把当前的目录当成根目录, 制作完成后安装时, 当前目录下除DEBIAN目录的其他目录都会被默认安装到系统的/目录下

第一步:

setup_deb()

{

    mkdir -p ${DEB_DEST}/DEBIAN

cat <<EOF > ${DEB_DEST}/DEBIAN/control

Package: cel-tools

Version: ${VERSION}-${REVISION}

Maintainer: xxx

Section: admin

Priority: optional

Architecture: all

Depends: python (>= 2.7)

Description: Suite of tools and libraries for Celestica diagnostics.

EOF

 

cat <<EOF > ${DEB_DEST}/DEBIAN/preinst

#!/bin/sh

echo "preinst!"

EOF

chmod 0755 ${DEB_DEST}/DEBIAN/preinst

 

cat <<EOF > ${DEB_DEST}/DEBIAN/postinst

#!/bin/sh

echo "postinst test!"

EOF

chmod 0755 ${DEB_DEST}/DEBIAN/postinst

 

cat <<EOF > ${DEB_DEST}/DEBIAN/prerm

#!/bin/sh

echo "prerm test"

EOF

chmod 0755 ${DEB_DEST}/DEBIAN/prerm

 

cat <<EOF > ${DEB_DEST}/DEBIAN/postrm

#!/bin/sh

echo "postrm!"

EOF

chmod 0755 ${DEB_DEST}/DEBIAN/postrm

}

第二步:

Build_deb()

{

dpkg-deb -b ${DEB_DEST} cel_diag-${PROJ_NAME}.v${VERSION}.${REVISION}.${MINVER}.deb

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/173633
推荐阅读
相关标签
  

闽ICP备14008679号