### GNU AutoMake 相关知识点 #### 一、引言 GNU AutoMake 是一个用于创建符合 GNU 标准的 Makefile 的工具。它基于模板文件自动生成 Makefile,简化了项目构建过程。此手册适用于版本 1.14.1(2013 年 11 月 6 日发布),主要贡献者包括 David MacKenzie、Tom Tromey、Alexandre Duret-Lutz、Ralf Wildenhues 和 Stefano Lattarini。 #### 二、GNU Build System 介绍 ##### 2.1 GNU 构建系统简介 GNU 构建系统(也称为 Autotools)是一套工具集合,旨在帮助开发者编写跨平台的软件。这套工具包括 Autoconf、Automake 和 Libtool 等,它们共同为开发人员提供了一种标准化的方式来配置、编译和安装软件包。 - **Autoconf**:用于检测系统特性,并生成可配置的 `configure` 脚本。 - **Automake**:根据项目模板文件生成符合 GNU 规范的 Makefile。 - **Libtool**:处理库的构建,确保库在不同平台上的一致性。 ##### 2.2 使用场景 ###### 2.2.1 基本安装 使用 GNU 构建系统的项目通常遵循以下步骤进行安装: 1. 运行 `./configure` 以生成 Makefile。 2. 执行 `make` 来构建软件。 3. 使用 `make install` 安装软件到系统中。 这些步骤使得软件在不同的系统上具有高度一致性。 ###### 2.2.2 标准 Makefile 目标 - **all**:构建所有目标。 - **clean**:清除中间文件和目标文件。 - **distclean**:与 `clean` 类似,但还会清除由 `configure` 生成的文件。 - **maintainer-clean**:清理所有文件,包括自动生成的源代码文件。 - **install**:安装程序和数据文件。 - **uninstall**:卸载之前安装的文件。 这些目标简化了软件包的管理流程。 ###### 2.2.3 标准目录变量 - **srcdir**:包含源代码的目录。 - **builddir**:构建输出目录。 - **bindir**:可执行文件的安装目录。 - **libdir**:库文件的安装目录。 通过定义这些变量,可以确保软件包在不同环境中具有一致的行为。 ###### 2.2.4 标准配置变量 - **CC**:C 编译器路径。 - **CXX**:C++ 编译器路径。 - **CFLAGS** 和 **CPPFLAGS**:编译器标志。 - **LDFLAGS**:链接器标志。 这些变量允许用户根据需要定制编译和链接选项。 ###### 2.2.5 通过 `config.site` 文件覆盖默认设置 可以通过在项目目录下创建一个名为 `config.site` 的文件来覆盖默认的配置变量,例如: ```bash CFLAGS="-O3 -Wall" ``` 这允许开发人员为特定环境提供自定义的编译选项。 ###### 2.2.6 并行构建树(VPATH 构建) 并行构建树或 VPATH 构建允许在单独的构建目录中进行构建,而不会干扰源代码。这对于维护干净的工作区非常有用。 例如,在单独的目录中构建: ```bash mkdir build cd build ../configure make ``` 这种做法有助于避免在源代码目录中留下构建副产品。 ###### 2.2.7 两阶段安装 对于需要两个阶段安装的项目,例如先构建库再构建依赖于该库的应用程序,可以通过配置文件来实现这一过程。 例如,在 `configure.ac` 文件中定义: ```bash AC_CONFIG_FILES([Makefile]) AM_INIT_AUTOMAKE([foreign]) ``` 这样可以在不同的构建阶段中正确地处理依赖关系。 ###### 2.2.8 交叉编译 当需要为不同架构的系统构建软件时,可以使用交叉编译工具链。可以通过设置 `CROSS_COMPILE` 变量来指定所需的工具链。 例如: ```bash CROSS_COMPILE=/path/to/toolchain- ``` 这使得软件包能够在目标架构上运行。 ###### 2.2.9 在安装时重命名程序 在某些情况下,可能需要在安装过程中更改程序的名称。这可以通过修改 `configure` 脚本来实现。 例如,在 `configure.ac` 文件中: ```bash AC_PROGRAM_NAME([newname]) ``` 这将使生成的可执行文件被命名为 `newname`。 ###### 2.2.10 使用 DESTDIR 构建二进制包 为了在最终安装前测试安装过程,或者为了创建二进制包,可以使用 `DESTDIR` 变量将文件安装到临时位置。 例如: ```bash make DESTDIR=/tmp/stage install ``` 这将把文件安装到 `/tmp/stage` 目录中,而不是实际的安装位置。 ###### 2.2.11 准备分发 为了方便分发源代码,可以使用 `make dist` 或 `make distcheck` 来创建一个归档文件。 例如: ```bash make dist ``` 这将生成一个 `.tar.gz` 文件,其中包含了项目的源代码和配置文件。 ###### 2.2.12 自动依赖跟踪 Automake 支持自动检测源文件之间的依赖关系,从而确保每次构建都只重新编译必要的部分。 例如,在 `Makefile.am` 文件中: ```bash AUTOMAKE_OPTIONS = foreign ``` 这将启用依赖跟踪功能。 ###### 2.2.13 嵌套包 对于大型项目,可能需要将多个子项目合并成一个单一的构建过程。这可以通过嵌套包来实现。 例如,在主项目的 `Makefile.am` 文件中: ```bash SUBDIRS = subdir1 subdir2 ``` 每个子目录都将有自己的 `Makefile.am` 文件,并作为独立的构建单元。 #### 三、通用概念 ##### 3.1 一般操作 Automake 提供了一些基本命令,用于生成 Makefile 和处理其他构建任务。 - **automake**:生成 Makefile。 - **aclocal**:扫描 `configure.ac` 文件,生成 `aclocal.m4` 文件。 - **autoheader**:从 `configure.ac` 文件生成 `config.h.in` 文件。 - **autoconf**:从 `configure.ac` 和其他脚本生成 `configure` 脚本。 这些命令协同工作,形成了构建过程的基础。 ##### 3.2 严格性 Automake 支持不同级别的严格性,以适应各种开发需求。严格模式可以帮助发现潜在的构建问题。 - **--add-missing**:允许添加缺失的规则。 - **--strict**:提高严格性级别,检查更多的错误。 ##### 3.3 统一命名方案 为了保持一致性和可预测性,Automake 推荐使用统一的命名约定。例如,所有的规则文件都应命名为 `Makefile.am`,而生成的 Makefile 则命名为 `Makefile.in`。 ##### 3.4 避免命令行长度限制 由于操作系统对命令行长度有限制,Automake 提供了一些方法来处理这个问题,例如使用 `subdir-objects` 来分散对象文件的生成。 ##### 3.5 如何命名派生变量 Automake 使用特定的规则来命名派生变量,这有助于避免命名冲突。例如,如果有一个名为 `FOO` 的变量,那么相关的变量可能会被命名为 `FOO_FLAGS` 或 `FOO_DIR`。 ##### 3.6 保留给用户的变量 为了不干扰用户的环境变量,Automake 预留了一些特殊变量名,例如以 `_` 开头的变量名,供用户自行定义。 ##### 3.7 Automake 可能需要的程序 Automake 本身也需要一些辅助工具来完成其功能,包括但不限于 `m4`、`make` 和 `sed` 等。 #### 四、示例包 ##### 4.1 简单示例 下面是一个简单的示例,展示了如何使用 Automake 从头开始构建一个简单的项目。 1. 创建 `configure.ac` 文件。 2. 创建 `Makefile.am` 文件。 3. 运行 `autoreconf --install` 来生成 `configure` 脚本。 4. 运行 `./configure` 来生成 Makefile。 5. 运行 `make` 来构建项目。 6. 运行 `make install` 来安装项目。 这个过程演示了使用 Automake 构建一个简单项目的完整步骤。 ##### 4.2 构建 `true` 和 `false` 另一个简单的示例是构建两个命令行工具 `true` 和 `false`。这些工具虽然简单,但可以用来演示 Automake 的基本用法。 1. 在 `Makefile.am` 文件中定义相应的规则。 2. 使用 `automake` 和 `autoconf` 生成构建脚本。 3. 构建并安装这两个工具。 这个例子展示了如何使用 Automake 来构建简单的命令行工具。 #### 五、创建 `Makefile.in` 要创建 `Makefile.in` 文件,首先需要编写 `Makefile.am` 文件,然后使用 `automake` 命令生成 `Makefile.in`。 例如,在 `Makefile.am` 文件中: ```bash bin_PROGRAMS = hello hello_SOURCES = hello.c ``` 然后运行 `automake` 生成 `Makefile.in`: ```bash automake --add-missing ``` 这将基于 `Makefile.am` 文件生成 `Makefile.in`。 #### 六、扫描 `configure.ac` 文件 ##### 6.1 配置要求 `configure.ac` 文件是 Automake 和 Autoconf 的起点。它包含了一系列宏调用,用于生成 `configure` 脚本。这些宏可以检测系统特征,设置变量等。 例如: ```bash AC_INIT([package], [1.0]) AM_INIT_AUTOMAKE([foreign]) ``` 这些宏定义了项目的基本信息。 ##### 6.2 Automake 认识的其他内容 除了 `AC_INIT` 和 `AM_INIT_AUTOMAKE` 宏之外,`configure.ac` 文件还可以包含许多其他宏来控制构建过程。 - **AC_CONFIG_SRCDIR**:确定项目的源代码目录。 - **AC_CONFIG_HEADERS**:定义要生成的头文件。 - **AC_PROG_CC**:检测 C 编译器。 - **AM_PATH_TOOL**:检测工具的位置。 这些宏帮助 Automake 和 Autoconf 生成适当的 `configure` 脚本。 ##### 6.3 自动生成 `aclocal.m4` `aclocal` 是一个工具,用于扫描 `configure.ac` 文件,并生成 `aclocal.m4` 文件。这个文件包含了 Automake 和 Autoconf 需要的所有宏定义。 例如,运行: ```bash aclocal ``` 这将生成 `aclocal.m4` 文件。 ##### 6.3.1 `aclocal` 选项 `aclocal` 支持多种选项来定制其行为: - **-I dir**:添加宏搜索路径。 - **--include-dir=dir**:与 `-I` 相同。 - **--force**:强制覆盖现有的 `aclocal.m4` 文件。 这些选项使得 `aclocal` 更加灵活。 ##### 6.3.2 宏搜索路径 `aclocal` 可以从多个路径搜索宏定义,包括当前目录、`$prefix/share/aclocal` 等。 例如: ```bash aclocal -I /path/to/my/macros ``` 这将搜索 `/path/to/my/macros` 目录中的宏定义。 ##### 6.3.3 编写自己的 `aclocal` 宏 除了使用现有的宏定义外,还可以编写自己的宏来扩展 Automake 和 Autoconf 的功能。 例如,在 `my-macro.m4` 文件中定义一个新的宏: ```bash dnl my_macro([arg1], [arg2]) dnl Define your macro here. ``` 然后将其添加到 `aclocal` 的搜索路径中: ```bash aclocal -I /path/to/my-macro.m4 ``` 这将使新的宏可用。 ##### 6.3.4 处理宏定义 在 `configure.ac` 文件中,可以使用宏定义来控制构建过程。 例如: ```bash AC_DEFUN([MY_MACRO], [echo "Hello World"]) MY_MACRO ``` 这将在构建过程中打印出 “Hello World”。 GNU AutoMake 是一个强大的工具,用于自动化构建过程。通过了解其基本概念和用法,开发者可以轻松地构建和分发复杂的软件项目。
- 粉丝: 3
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Matlab设计-车辆检测(速度+平均速度+GUI+车流量+详细注释).zip
- Matlab设计-车牌出入库计费系统(可设管理员密码,车位记录,车牌查询,计费).zip
- Matlab设计-车标识别(GUI界面,模板匹配,解析).zip
- Matlab设计-车牌出入库识别(GUI界面,计时计费,停车位计算,倾斜矫正).zip
- Matlab设计-车牌识别(GUI界面,步骤丰富,详细解析).zip
- Matlab设计-车牌号码出入库管理(库外不放行,库内人和车一致才计费是创新点).zip
- Matlab设计-车牌识别(GUI界面详细解析).zip
- Matlab设计-车牌识别(含GUI版本).zip
- Matlab设计-车牌识别SVM方法,模板匹配太多人做了.zip
- Matlab设计-虫害监测(带识别率).zip
- Matlab设计-虫害检测[同时定位害虫和害虫种类识别,创新点].zip
- Matlab设计-虫害检测(Svm和颜色两方法,GUI界面).zip
- Matlab设计-答题卡识别系统(自动判分).zip
- Matlab设计-答题卡识别系统(GUI,总分计算).zip
- Matlab设计-答题卡识别[批量阅卷,GU界面,考生分数查询].zip
- Matlab设计-答题纸试卷识别(有别于答题卡,是客观分答题纸识别).zip