您的当前位置:首页正文

使用autotools自动生成Makefile

2024-11-25 来源:个人技术集锦

autotools可以根据环境变量自动切换编译编译平台, 生成针对目标平台的软件或库。 它是在在Makefile的基础上进行了一些列的自动化构建。 开发者需要编辑的只有源代码的编译选项及依赖关系。

生成Makefile大致流程如下

安装autotools所有工具
sudo apt-get install autoconf automake libtool
编写源码及Makefile.am文件
// 我们以编译最简单的hello.c为例, 内容如下
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Hello, bobo.\n");
    return 0;
}

// Makefile.am 内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c

1. 使用autoscan工具生成configure.ac模板
# 旧版autotools工具使用的是configure.in文件, 后续版本先扫描configure.ac文件,再扫描configure.in模板
$ autoscan # 执行后无输出就是对的
# 执行后生成 autoscan.log 和 configure.scan 两个文件, 然后将configure.scan重命名为configure.ac
# 在 configure.ac 中添加一行宏定义 AM_INIT_AUTOMAKE() 
# AM_INIT_AUTOMAKE 是 automake 的一个宏,它用于初始化 automake 需要的变量和设置
# 添加后内容如下:
....
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE([foreign -Werror])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
....
快捷方式:快捷生成configure 直接跳至第6步
# autoreconf 会自动按顺序执行下面2, 3, 4, 5步骤生成configure及Makefile.in
$ autoreconf --install

# 执行后有如下输出:
configure.ac:11: installing './compile'
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
Makefile.am: installing './depcomp'

下面列出 autoreconf 执行的每一个步骤

2. 使用aclocal工具生成aclocal.m4文件
# 这一步依赖前一步得到的configure.ac文件
# 执行 aclocal 后生成 autom4te.cache 目录和aclocal.m4 文件
$ aclocal # 执行后无输出就是对的
3. 使用autoconf工具生成configure文件
# 这一步依赖前一步得到的aclocal.m4文件
$ autoconf # 执行后无输出就是对的
4. 使用autoheader工具生成 config.h.in 文件
# 这一步依赖第一步得到的 configure.ac 文件
$ autoheader # 执行后无输出就是对的
5. 编写Makefile.am后使用automake工具生成Makefile.in文件
automake --add-missing
# 执行后有如下输出:
configure.ac:11: installing './compile'
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
Makefile.am: installing './depcomp'
6. 运行configure文件, 生成Makefile
./configure
# 生成 Makefile
# 再执行 Make 即可得到最终编译好的程序
显示全文