Debian编译工具详解

2024-11-09 2

在 Debian 中,有多种编译工具可用于帮助开发人员编译和构建他们的程序。其中包括 make、Autotools和 Meson,这些编译工具在 Debian 中得到良好的支持,并且可通过软件包管理器进行安装和使用。本篇教程将详细介绍Debian编译工具。

编译工具软件包列表:

软件包流行度大小文档
makeV:152, I:5561592通过 make-doc 包提供“info make”
autoconfV:31, I:2322025由 autoconf-doc 包提供“info autoconf”
automakeV:31, I:2311837由 automake1.10-doc 包提供“info automake”
libtoolV:26, I:2151213由 libtool-doc 包提供”info libtool”
cmakeV:16, I:11536695cmake(1) 跨平台、开源的编译系统
ninja-buildV:6, I:40428ninja(1) 接近 Make 精髓的小编译系统
mesonV:3, I:223741meson(1) 在 ninja 之上的高生产力的构建系统
xutils-devV:0, I:91484imake(1),xmkmf(1) 等。

一、make

Make 是一个维护程序组的工具。一旦执行 make(1),make 会读取规则文件 Makefile,自从上次目标文件被修改后,如果目标文件依赖的相关文件发生了改变,那么就会更新目标文件,或者目标文件不存在,那么这些文件更新可能会同时发生。

规则文件的语法如下所示:

target: [ prerequisites ... ]
[TAB] command1
[TAB] -command2 # ignore errors
[TAB] @command3 # suppress echoing

“[TAB]”表示制表符,它用于在shell脚本中进行代码块的缩进。在变量替换之后,shell会逐行解释执行脚本。如果一行代码太长,可以使用行尾的反斜杠(”)来表示继续到下一行。为了在shell脚本中获取环境变量的值,可以使用两个连续的美元符号($$)。

目标跟相关文件也可以通过隐式规则给出,例如,如下所示:

%.o: %.c header.h

在这里,目标包含了 “%” 字符 (只是它们中确切的某一个)。”%” 字符能够匹配实际的目标文件中任意一个非空的子串。相关文件同样使用 “%” 来表明它们是怎样与目标文件建立联系的。

自动变量的列表:

自动变量
$@当前目标
$<首个相关文件
$?所有较新的相关文件
$^所有相关文件
$*目标模式中,$* 指代匹配符 “%” 匹配的部分

变量扩展的列表:

变量扩展说明
foo1 := bar一次性扩展
foo2 = bar递归扩展
foo3 += bar增加

运行 “make -p -f/dev/null” 命令来查看内部自动化的规则。

二、Autotools

Autotools 是一套工具集,旨在帮助开发者将源代码软件包移植到多种类 Unix 系统上。它根据“configure.ac”文件生成一个 shell 脚本“configure”。这个“configure”脚本用于自动检测系统特性和依赖关系,以便从“Makefile.in”模板生成适合当前系统的“Makefile”。Automake 则是根据“Makefile.am”文件生成“Makefile.in”的工具。它简化了“Makefile”的创建过程,使之更符合GNU编码标准。

Libtool是一个shell脚本工具,用于在编译共享库时自动处理与软件移植性相关的问题,确保库的正确链接和安装。

1、编译并安装程序

当安装编译好的程序的时候,注意不要覆盖系统文件。

Debian 不会在 “/usr/local” 或 “/opt” 目录下创建文件。如果想要源码编译程序,把它安装到 “/usr/local/” 目录下,因为这并不会影响到 Debian。

$ cd src
$ ./configure --prefix=/usr/local
$ make # this compiles program
$ sudo make install # this installs the files in the system

2、卸载程序

如果有源码并且它使用 autoconf(1)/automake(1),如果能记得是怎样配置它的话,执行如下的命令来卸载程序。

$ ./configure all-of-the-options-you-gave-it
$ sudo make uninstall

或者,如果十分确信安装进程把文件都放在了 “/usr/local/” 下并且这里没什么重要的东西,可以通过如下的命令来清除它所有的内容。

# find /usr/local -type f -print0 | xargs -0 rm -f

如果不确定文件被安装到了哪里,可以考虑使用 checkinstall 软件包中的 checkinstall(8),它将会提供一个清晰的卸载路径。现在,它支持创建带有 “-D” 选项的 Debian 软件包。

三、Meson

随着软件开发的不断演进,构建系统也在不断进步。自90年代起,Autotools作为一套可移植构建架构,在Make的基础上成为了事实上的标准,但它的处理速度相对较慢。

CMake于2000年推出,显著地提升了构建速度,尽管它仍然基于本质上较慢的Make系统。不过,现在CMake可以使用Ninja作为其后端构建工具。

Ninja在2012年发布,目标是取代Make,以进一步加快构建速度。它的设计允许其他上层构建系统生成输入文件。

Meson于2013年推出,是一个较新且流行的构建系统,它不仅速度快,而且属于上层构建系统,默认使用Ninja作为后端工具,从而充分利用了Ninja的速度优势。