如何从源码的构建到最终 .deb
软件包制作?
在debian社区中,源码的维护属于upstream,打包.deb并上传属于sponsor,当然还有其他角色负责不同的任务。为了便于理解,姑且将叫upstream以后的部分叫下游。对于上游来说我们除了维护代码,还需要创建脚本来用于构建以及制作tar,然后下游使用tar进行编译与将工程的各个模块打包为.deb。
如何创建上游软件包?
在上游中,往往通过autotools工具链来创建configure以及Makefile.in。其中关键工具包括autoscan、automake、atuoconf,同时需要编写的文件包括Makefile.am、configure.ac/in。工具链协作流程如下:1编写每个模块所有的Makefile.am 2.使用autoscan生成模板configure.scan 3.编辑模板生成configure.ac/in用于构建configure,同时也指导Makefile.in的生成 4.使用aclocal生成.m4的中间文件5.使用autoconf生成configure、automake生成Makefile.in 。
显然这样挨个执行基本的步骤是繁琐的,autotools提供了autoreconf来加速这个过程,我们往往只需要在初始化autogen.sh脚本中执行,其中--install在第一次设置必须的选项,他会拷贝在atuotools必备的辅助文件
atuoreconf --install
这样看起来不需要知道这些基本步骤,直接傻瓜的使用这行命令就行了,但实际上了解基本步骤对于编写configure.ac和Makefile.am很有帮助,在上图中我们可以看到Makefile.in还收到configure.ac的知道,实际上我们可以使用configure.ac中AM_*的宏来传递一些对makefile的配置,现在让我来了解如何编写configure.ac以及Makefile.am。
configure.ac
我们要知道一点无论是configure.ac还是Makefile.am,其本质就是将特定宏展开为对应的脚本文件,比如在下面使用autoscan生成configure.ac模版:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) # 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_OUTPUT
以AC_PROG_CC为例如果将其展开为bash,就需要实现:1、检查 gcc
或 cc
是否存在:首先,它会检查系统中是否存在 C 编译器(如 gcc
或 cc
)。2、尝试编译一个简单程序:它会编译一个简单的测试程序,验证编译器是否能正常工作。3、设置编译器变量:如果编译器可用,它将设置 CC
变量为该编译器的路径。我们来看看第一个功能的脚本实现:
# 1. 检查是否存在 C 编译器 echo "checking for a C compiler..." if test -n "$CC"; then # 如果用户已经设置了 CC 环境变量 ec