文章参考来源:https://wiki.debian.org/Packaging/Intro?action=show&redirect=IntroDebianPackaging
中文参考资料:https://www.debian.org/doc/manuals/maint-guide/build.zh-cn.html
-
配置预制环境
- 使用apt-get install automake 将安装 autoconf{a} automake autotools-dev{a} 三个包。
- 使用apt-get install dh-make 将安装 debhelper dh-make html2text三个包。
- 使用apt-get install devscripts ,这个是使用debuild所需要的。
-
制作Deb包
-
创建helloworld.c
在当前目录下创建一个名为hello的子目录。进入文件夹并新建一个标准的Hello World的C代码hello.c
#include <stdio.h>
int main(int argc, char ** argv){
printf(“hello,world\n”);
return 0;
}
此时,文件夹下只有一个hello.c文件。
-
创建一个 Makefile.am 文件
automake根据configure.in中的宏并在perl的帮助下把Makefile.am转成Makefile.in文件。Makefile.am 文件定义所要产生的目标。我们要填写的 Makefile.am 内容为以下两句:
bin_PROGRAMS=beep // bin_PROGRAMS:定义要产生的可执行程序的文件名。
beep_SOURCES=hello.c // beep_SOURCES:定义“beep”这个可执行程序所需要的原始文件。如果“beep”这个程序是由多个原始文件产生的,必须把它所用到的所有原始文件都列出来,并以空白符隔开。假设“beep”还需要“hello.c”、“main.c”、“hello.h”3个文件,则定义beep_SOURCES= hello.c main.c hello.h。如果定义多个可执行文件,则对每个可执行程序都要定义相应的filename_SOURCES,其中filename为要生成的可执行程序的文件名。
所以,beep 可以替换为你想要生成的二进制可执行文件名(后面生成deb文件也是一样的名称),如果我最终我们生成的应用名为long.deb,上面两句就写成:
bin_PROGRAMS=long
long_SOURCES=hello.c
当前我们目录下只有:hello.c Makefile.am 两个文件
$: vim Makefile.am
$: ls
hello.c Makefile.am
执行autoscan
执行autoscan命令,会生成一个configure.scan文件,将configure.scan改名为configure.in
$ autoscan
$ ls
autoscan.log configure.scan hello.c Makefile.am
$ mv configure.scan configure.in
$ ls
autoscan.log configure.in hello.c Makefile.am
configure.in 文件的内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的Shell脚本。configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须以宏AC_INIT开头,以宏AC_OUTPUT结束。
修改configure.in文件
打开configure.in文件我们会看到自动生成的configure.in(scan)包括以下内容:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69]) // 此行是描述需要的工具兼容性,如我们使用的是autotools工具版本是2.69,这个自动生成不要修改!
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) // 此行是描述我们要生成的应用的信息,包括:应用名,版本号以及维护人邮箱(直译为反馈bug地址)。比如我们需要将此行修改成 AC_INIT([beep], [0.1], [reaper888@yeah.net])
//下面两行形容的是软件包的地址和名称,以便autotools开始工作
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
// 在这我们需要加入一行“ AM_INIT_AUTOMAKE ”,如果没有此行,在部分系统生成Makefile时会报错而且生成不了Makefile文件。
# Checks for programs.
AC_PROG_CC//这句高速autotools使用默认的编译器和binutils,当然你也可以传入类似于“ AC_PROG_CC([gcc gcc-4.7]) ”的参数,我们不传参,使用默认即可
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
// 下面不变
AC_CONFIG_FILES([Makefile])// 设置configure命令所要产生的文件。我们最终期望产生Makefile
AC_OUTPUT
所以,经过修改后,我们的configure.in文件是:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([beep], [0.1], [reaper888@yeah.net])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
执行autoheader和aclocal命令
$ automake
configure.in:8: required file `./install-sh’ not found
configure.in:8: `automake –add-missing’ can install `install-sh’
configure.in:8: required file `./missing’ not found
configure.in:8: `automake –add-missing’ can install `missing’
Makefile.am: required file `./INSTALL’ not found
Makefile.am: `automake –add-missing’ can install `INSTALL’
Makefile.am: required file `./NEWS’ not found
Makefile.am: required file `./README’ not found
Makefile.am: required file `./AUTHORS’ not found
Makefile.am: required file `./ChangeLog’ not found
Makefile.am: required file `./COPYING’ not found
Makefile.am: `automake –add-missing’ can install `COPYING’
所以,根据提示,我们缺少 NEWS、README、AUTHORS、ChangeLog和COPYING,而使用automake –add-missing会生成COPYING,所以在此之前我们需要手动添加这几个文件:
$ touch NEWS README AUTHORS ChangeLog
$ ls
aclocal.m4 autom4te.cache ChangeLog configure.in Makefile.am README
AUTHORS autoscan.log config.h.in hello.c NEWS
注:这是我在演示如何使用autotools,如果是你真得要发布软件,请仔细填写这几个文件,而不是使用touch生成一个空文件。
现在我们可以使用automake –add-missing:
$ automake –add-missing
configure.in:8: installing `./install-sh’
configure.in:8: installing `./missing’
Makefile.am: installing `./INSTALL’
Makefile.am: installing `./COPYING’ using GNU General Public License v3 file
Makefile.am: Consider adding the COPYING file to the version control system
Makefile.am: for your code, to avoid questions about which license your project uses.
$ ls
aclocal.m4 autom4te.cache ChangeLog configure.in hello.c install-sh Makefile.in NEWS
AUTHORS autoscan.log config.h.in COPYING INSTALL Makefile.am missing README
会发现,现在使用automake很顺利,而且生成了INSTALL、COPYING等文件。
使用autoconf
$ ls
aclocal.m4 autom4te.cache ChangeLog configure.in hello.c install-sh Makefile.in NEWS
AUTHORS autoscan.log config.h.in COPYING INSTALL Makefile.am missing README
$ autoconf
$ ls
aclocal.m4 autom4te.cache ChangeLog configure COPYING INSTALL Makefile.am missing README
AUTHORS autoscan.log config.h.in configure.in hello.c install-sh Makefile.in NEWS
所以,我们可以看到,使用autoconf命令生成了configure。
执行./configure和make
$:./configure
…(略)
$:make
..(略)
此时,在当前目录下有Makefile文件,我们可以做的工作有:
* make all:产生设定的目标,即生成所有的可执行文件。使用make也可以达到此目的。
* make clean:删除之前编译时生成的可执行文件及目标文件(形如*.o的中间文件)。
* make distclean:除了删除可执行文件和目标文件以外,把configure所产生的 Makefile文件也清除掉。通常在发布软件前执行该命令。
* make install:将使用make all或make命令产生的可执行文件以软件的形式安装到系统中。若使用bin_PROGRAMS宏,程序将会被安装到 /usr/local/bin下,否则安装到预定义的目录下。
* make dist:将程序和相关的文档包装为一个压缩文档以供发布。执行完该命令,在当前目录下会产生一个名为PACKAGE-VERSION.tar.gz的文件。PACKAGE 和 VERSION 这两个参数是来自configure.in文件中的AM_INIT_AUTOMAKE(PACKAGE,
VERSION)。如在上个例子中执行make dist命令,会产生名为“hello-1.0.tar.gz”的文件。
* make distcheck:与make dist类似,但是加入了检查包装以后的压缩文件是否正常。
make dist提取源程序包
下面,我们做的可是高端大气上档次的工作 — 生成可发布的Debian应用包 — deb文件。(Debian系Linux专属哦)
首先,我们使用“ make dist ”命令,make dist将程序和相关的文档包装为一个压缩文档以供发布。从此,你将再也不想手动写Makefile!!
$ make dist
if test -d “beep-0.1”; then find “beep-0.1” -type d ! -perm -200 -exec chmod u+w {} ‘;’ && rm -rf “beep-0.1” || { sleep 5 && rm -rf “beep-0.1”; }; else :; fi
test -d “beep-0.1” || mkdir “beep-0.1”
test -n “” \
|| find “beep-0.1” -type d ! -perm -755 \
-exec chmod u+rwx,go+rx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec /bin/bash /tmp/hello/install-sh -c -m a+r {} {} \; \
|| chmod -R a+r “beep-0.1”
tardir=beep-0.1 && ${TAR-tar} chof – “$tardir” | GZIP=–best gzip -c >beep-0.1.tar.gz
if test -d “beep-0.1”; then find “beep-0.1” -type d ! -perm -200 -exec chmod u+w {} ‘;’ && rm -rf “beep-0.1” || { sleep 5 && rm -rf “beep-0.1”; }; else :; fi
$ ls
aclocal.m4 autoscan.log config.h config.status COPYING install-sh Makefile.in README
AUTHORS beep-0.1.tar.gz config.h.in configure hello.c Makefile missing stamp-h1
autom4te.cache ChangeLog config.log configure.in INSTALL Makefile.am NEWS
我们可以看到,目录里多了个beep-0.1.tar.gz文件。这就是我们后续工作的核心
切换新的工作目录:
$ mkdir ../hello_deb
$ cd ../hello_deb/
$ cp ../hello/beep-0.1.tar.gz ./
$ ls
beep-0.1.tar.gz
$ tar -xzf beep-0.1.tar.gz
$ ls
beep-0.1 beep-0.1.tar.gz
$ cd beep-0.1/
$ ls
aclocal.m4 ChangeLog configure COPYING install-sh Makefile.in NEWS
AUTHORS config.h.in configure.in INSTALL Makefile.am missing README
使用dh_make创建debian文件目录:
为了创建一个Debian包,我们首先要创建一个Debian控制文件,所以我们需要先配置dh_make,最基本的我们需要先配置如下两个选项(当然,还有其他更多的选项,现在我们就配置最简单的):
export DEBFULLNAME=”your name”
export DEBEMAIL=”a@b.com”
在此我们需要配置Debian包的维护人名称和邮箱,比如我就可以写:
export DEBFULLNAME=”example”
export DEBEMAIL=”example@example.com”
做好上述步骤后,我们可以使用”dh_make –single –copyright=gpl3 -f ../beep-0.1.tar.gz”,会提示一些确认信息,其中需要选择”single” (s)型包。
$ export DEBFULLNAME=”example”
$ export DEBEMAIL=”example”
$ dh_make –single –copyright=gpl3 -f ../beep-0.1.tar.gz
编辑debian/control文件
现在我们ls下当前目录,会发现当前目录下多了一个debian目录,我们cd进debian目录,打开control文件:
$ cd debian/
$ vim control
—– 下面是control内容
Source: beep // 程序包名
Section: unknown // 使用 unknown 或者misc 都可以,建议使用 misc
Priority: extra
Maintainer: Zhouyl <reaper888@yeah.net>
Build-Depends: debhelper (>= 8.0.0), autotools-dev
Standards-Version: 3.9.4
Homepage: <insert the upstream URL, if relevant> // 如果你的程序有官方网站,在此编辑上网站地址
#Vcs-Git: git://git.debian.org/collab-maint/beep.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/beep.git;a=summaryPackage: beep
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
使用debuild生成deb应用包
cd ..进入beep-0.1目录,使用debuild命令
$ cd ..
$ debuild
…(略)
$ ls
beep-0.1 beep_0.1-1.dsc beep_0.1-1_i386.changes beep_0.1.orig.tar.gz
beep_0.1-1.debian.tar.gz beep_0.1-1_i386.build beep_0.1-1_i386.deb beep-0.1.tar.gz