在 Debian 中,有多种编译工具可用于帮助开发人员编译和构建他们的程序。其中包括 make、Autotools和 Meson,这些编译工具在 Debian 中得到良好的支持,并且可通过软件包管理器进行安装和使用。本篇教程将详细介绍Debian编译工具。
编译工具软件包列表:
软件包 | 流行度 | 大小 | 文档 |
make | V:152, I:556 | 1592 | 通过 make-doc 包提供“info make” |
autoconf | V:31, I:232 | 2025 | 由 autoconf-doc 包提供“info autoconf” |
automake | V:31, I:231 | 1837 | 由 automake1.10-doc 包提供“info automake” |
libtool | V:26, I:215 | 1213 | 由 libtool-doc 包提供”info libtool” |
cmake | V:16, I:115 | 36695 | cmake(1) 跨平台、开源的编译系统 |
ninja-build | V:6, I:40 | 428 | ninja(1) 接近 Make 精髓的小编译系统 |
meson | V:3, I:22 | 3741 | meson(1) 在 ninja 之上的高生产力的构建系统 |
xutils-dev | V:0, I:9 | 1484 | imake(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的速度优势。