[✔️]AutoMake入门指南

112 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情

AutoMake是什么

如果你知道CMake,那么就非常好理解AutoMake,无论是CMake还是还是AutoMake,他们的最终目的都是为了方便程序进行跨平台编译。

CMake的产生晚于AutoMake,在设计理念和思路上都有差异,从个人的使用体验上来说,CMake更加现代化。

AutoMake的几个核心文件的关系

graph LR
 Makefile.am:定义的变量 --autoreconf --> A[Makefile.in] -->B[configure]-->Makefile-->make
 configure.ac:定义的变量--autoreconf-->A
  • autoreconf读取Makefile.amconfigure.ac产生Makefile.in
  • 生成的configure脚本,读取Makefile.in产生Makefile,编译可配置变量可以通过./configure --help查看
  • 执行make命令,进行程序的编译

以上就是使用AutoMake时,大概发生的一个流程逻辑,AutoMake目的就是让程序员只写一个规则:.am文件、ac文件,就能生成适合各种配置、平台的Makfiles。

一个最简单的程序:Hello Automake

我在Github上编写了一个HelloWorld,从仓库中可以看到对于一个Automake程序,有效的文件有:

  • Makefile.am
  • configure.ac

通用的编译过程为:

autoreconf --install
./configure
make

AutoMake语法

这里仅仅是记录了自己所了解到的语法,并没有深究具体的含义

关键字解释
SUBDIRS指定需要递归automake的子文件夹,即存在Makefile.am的子文件夹
xxx_SOURCES程序的源代码
xxx_PROGRAMS程序的名字

举个例子:

SUBDIRS = lib include doc tests m4 $(EXAMPLES_DIR)

很明显,源码就在lib、include等,AutoMake会自动去递归检索这些目录,重新遍历Makefile.am

更多的语法就不再展开了,毕竟相对CMake来说,AutoMake已经是非常古老的轮子了,只有非常老旧的项目在使用,大部分的项目慢慢都选择了CMake。

如何跨平台编译

需要在对应的平台上执行通用的编译过程,AutoMake会根据运行环境,生成不同的Makefile。