为啥要打包
我们平时用的每个命令都是一个可执行文件,他们可能在/usr/bin目录下,那他们是如何跑到系统能找到的路径下的呢?
没错,在make install
的时候他们会被拷贝到对应的位置。
但是绝大部分用户并不会去编译安装,往往我们需要一个包含可执行文件的安装包来安装软件。这就是为什么我们要打包。
怎么打包
不同的linux发行版往往有不同的打包规则(redhat的rpm,debian的deb),这边我们来简单讨论一下deb包如何打包。
准备工作
万事开头HelloWorld!首先我们准备一个HelloWorld和makefile:
1 | # cd hello-1.0.0/ |
制作deb包
- 初始化生成debian信息这里的
1
2
3
4
5
6
7
8
9
10
11
12
13# cd hello-1.0.0/
# dh_make -f ../hello-1.0.0.tar.gz
Type of package: (single, indep, library, python)
[s/i/l/p]?
Maintainer Name : unknown
Email-Address : gean@gean-PC
Date : Tue, 18 Aug 2020 14:52:57 +0800
Package Name : hello
Version : 1.0
License : blank
Package Type : single
Are the details correct? [Y/n/q]
Done. Please edit the files in the debian/ subdirectory now.[s/i/l/p]?
选s,意思是单个包,就是说最后只生成一个安装包。
做完这一步会生成一些文件:ex文件都是一些模板文件,可以删除。1
2
3# ls debian/
changelog control hello.cron.d.ex hello-docs.docs manpage.sgml.ex menu.ex postrm.ex prerm.ex README.source source
compat copyright hello.doc-base.EX manpage.1.ex manpage.xml.ex postinst.ex preinst.ex README.Debian rules watch.ex
这里主要讲3个文件: control和rules文件。 - control文件我这里只是一个HelloWorld所以不改也没事,最需要注意的是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# cat debian/control
Source: hello *//源代码包的名称*
Section: unknown *//发行版分类(admin为供系统管理员使用的程序,devel为开发工具,doc为文档,libs为库,此外还有很多)*
Priority: optional *//用户安装此软件包的优先级*
Maintainer: unknown <gean@gean-PC> *//维护者的姓名和电子邮件地址*
Build-Depends: debhelper (>= 11) *//编译此软件包需要的软件包*
Standards-Version: 4.1.3 *//此软件包所依据的 Debian Policy Manual 标准版本号*
Homepage: <insert the upstream URL, if relevant> *//上游项目首页的URL*
#Vcs-Browser: https://salsa.debian.org/debian/hello
#Vcs-Git: https://salsa.debian.org/debian/hello.git
Package: hello *//二进制软件包的名称*
Architecture: any *//可以编译本二进制包的平台,如x86,arm等*
Depends: ${shlibs:Depends}, ${misc:Depends} *//依赖的包*
Description: <insert up to 60 chars description> *//描述*
<insert long description, indented with spaces>Build-Depends
和Depends
,分别要写上编译时需要什么软件,和安装时需要什么软件,不好好写就会无法编译和安装。 - rules文件
rules文件,就像Makefile一样,有多个target来定义具体操作。debian/rules clean
实际执行的命令为:dh_testdir、dh_auto_clean、dh_cleandebian/rules build
实际执行的命令为:dh_testdir、dh_auto_configure、dh_auto_build、dh_auto_test
等等。
接下来我们看一下自动生成的rules文件里面有什么:你会发现大部分是注释,只有一个1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# cat debian/rules
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@
# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)dh $@
。
可以取消第4行的注释,以设置DH_VERBOSE
变量为1,于是dh
命令就会输出它将要使用的dh_*
命令。
你也可以在此添加一行export DH_OPTIONS=-v
,于是dh_*
命令同样也会输出它正在调用的命令。
这能帮助你理解在这个简单的rules文件背后发生了什么,以及帮助你进行调试。
这边我们的HelloWorld也不用改,如果要改的话,比如修改他本身的dh_auto_clean
:加上1
2
3override_dh_auto_clean:
dh_auto_clean
rm -f .qmake.cacheoverride_
,rm -f .qmake.cache就是新加的内容。 - 打包
直接执行debuild
命令就可以了。
验证
1 | # cd .. |
通过dpkg-deb -c
命令可以看到打出来的包包含了哪些文件,其中就有我们的./usr/bin/hello,当我们dpkg -i
安装的时候就会被拷贝到我们系统的/usr/bin/下。
执行效果:
1 | # hello |
为deb包打补丁
获取源码
1 | # ls |
修改代码
1 | # vim hello.c |
增加一行printf。
生成补丁
1 | # dpkg-source --commit |
这里因为资源格式为3.0 (quilt)
才支持# dpkg-source --commit
生成补丁,所以我们做以下修改
1 | # mkdir debian/source |
再次执行# dpkg-source --commit
1 | # dpkg-source --commit |
此处的debian/patches/series文件用来记录你要打的补丁,如果不想打add-printf.patch,直接把这一行删除即可。
打包
修改changelog
1 | # vim debian/changelog |
然后直接执行debuild
命令就可以了。
怎么分包
准备工作
1 | # cd hello-1.0.0/ |
制作deb包
1 | # cd hello-1.0.0/ |
.install文件记录的就是你打的安装包里应该包含什么文件。
这边我们就需要自己写两个.install文件,注意文件名要与此前control文件中的Package:
也就是包名一致。
里面每一行都是你需要包含的二进制文件,支持*
。
修改完后可以# debuild
直接编译。
验证
1 | # cd .. |
总结
这里只是简单讲HelloWorld的打包过程,有很多详细的可以参考Debian维护者手册