CPACK生成deb安装包
Pack a Debain software package with CMake.
deb
是Unix
系统(其实主要是Ubuntu
)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。 由于 Unix 类系统对权限、所有者、组的严格要求,而 deb 格式安装包又经常会涉及到系统比较底层的操作,所以权限等的设置尤其重要。
本文讲解了如何使用CMake的CPack工具,项目repo:create-deb-package。
使用dpkg-deb生成deb安装包
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 安装的时候所需要的控制信息.
DEBIAN
目录下为控制脚本:
control
:用于记录软件标识,版本号,平台,依赖信息等数据;preinst
:在解包data.tar.gz
前运行的脚本,停止作用于待升级软件包的服务,直到软件包安装或升级完成;postinst
:在解包数据后运行的脚本,一般用来配置软件执行环境,必须以#!/bin/sh
为首行;prerm
:卸载时,在删除文件之前运行的脚本,该脚本负责停止与软件包相关联的daemon
服务;postrm
:在删除文件之后运行的脚本,负责修改软件包链接或文件关联,或删除由它创建的文件。
deb-control
dpkg-deb
打包的核心是 DEBIAN
目录下的control
脚本,关于这个脚本的详细说明可以参考官方文档:deb-control man page,以下是样例项目中的控制脚本:
control
文件必须是UTF-8编码格式,最后必须保留一行空行。
使用CPacke生成deb包
CPack是CMake 2.4.2 之后的一个内置工具,用于创建软件的二进制包和源代码包,因为CPack生成DEB
包所设置的参数基本与DEBIAN/control
几乎一致,猜测其在实现上依赖于dpkg-deb
,简单的理解是:CPack将生成一个用于构建deb包的control
控制脚本,并且将install
命令指定的安装树空间作为该deb包的安装信息进行打包。
在这个样例中只展示了如何将当前构建项目打包成一个deb包,实际CPack是支持将一个项目分装成多个包:使用cpack_add_component 和 cpack_add_component_group,并且在install时将安装的文件捆绑到不同的component上即可。
Last updated