GNU Automake 版本(version 1.16.1, 26 February 2018)
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, with no Front-Cover texts,
and with no Back-Cover Texts. A copy of the license is included in
the section entitled “GNU Free Documentation License.”
4 两个例子小程序
本章讲两个例子,一个是假定一个工程已经使用Autoconf来处理并手工编写 Makefile,现在切换到 Automake来处理;第二个例子是如何从同一套源码中使用不同的参数编译出两个程序。
4.1 简单小程序,几步就搞定
假定我们已经完成了一个软件zardoz,使用Autoconf提供一个可扩展的框架,不过 Makefile.in是专门另行准备的,现在为了完善这部分工作,我们转而使用Automake。.
第一步就是更新configure.ac,在AC_INIT之后添加AM_INIT_AUTOMAKE :
AC_INIT([zardoz], [1.0])
AM_INIT_AUTOMAKE
...
此时还需要重新生成 configure文件,在此之前需要告诉 autoconf如何找到新的使用宏。最简单的方法是使用aclocal生成 aclocal.m4
1 | $ aclocal |
接下来就要编写文件Makefile.am了,下面的内容说明我们要安装在bin目录,还指定了源码并且还有一个Texinfo文档。
1 | bin_PROGRAMS = zardoz |
最后使用automake --add-missing就可以生成Makefile.in 了,赞。
4.2 一套源码编译两套可执行程序
OK来看第二个例子,这个例子展示了如何从相同的源码true.c通过不同的cpp参数生成两个程序 (true 和 false) 。
1 | bin_PROGRAMS = true false |
注意例子里面没有 true_SOURCES,Automake会自动假定源码名为 true.c,编译为 true.o 并链接到true,规则段true.o: true.c 会覆盖默认由 Automake 产生的,使用新的一些规则。
false_SOURCES 置为空,因为没有相应的源码,所以我们需要告诉 Automake 它是如何编译链接的。false_LDADD 给出了方案。
如果编译器不能同时支持 -c和 -o,上面的这个文件可能不会工作,此时我们就需要变通一下,使用下面的文件解决:
1 | true.o: true.c false.o |
上面是比较有技巧的处理方法,刚开始的操作,还是希望尽量简化,简单,易于理解,如下所示:
1 | bin_PROGRAMS = false true |