0%

Linux Automake 4 一些示例包

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
2
$ aclocal
$ autoconf

接下来就要编写文件Makefile.am了,下面的内容说明我们要安装在bin目录,还指定了源码并且还有一个Texinfo文档。

1
2
3
4
bin_PROGRAMS = zardoz
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c

info_TEXINFOS = zardoz.texi

最后使用automake --add-missing就可以生成Makefile.in 了,赞。

4.2 一套源码编译两套可执行程序


OK来看第二个例子,这个例子展示了如何从相同的源码true.c通过不同的cpp参数生成两个程序 (truefalse) 。

1
2
3
4
5
6
7
8
9
bin_PROGRAMS = true false
false_SOURCES =
false_LDADD = false.o

true.o: true.c
$(COMPILE) -DEXIT_CODE=0 -c true.c

false.o: true.c
$(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c

注意例子里面没有 true_SOURCESAutomake会自动假定源码名为 true.c,编译为 true.o 并链接到
true,规则段true.o: true.c 会覆盖默认由 Automake 产生的,使用新的一些规则。

false_SOURCES 置为空,因为没有相应的源码,所以我们需要告诉 Automake 它是如何编译链接的。false_LDADD 给出了方案。

如果编译器不能同时支持 -c-o,上面的这个文件可能不会工作,此时我们就需要变通一下,使用下面的文件解决:

1
2
3
4
5
true.o: true.c false.o
$(COMPILE) -DEXIT_CODE=0 -c true.c

false.o: true.c
$(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o

上面是比较有技巧的处理方法,刚开始的操作,还是希望尽量简化,简单,易于理解,如下所示:

1
2
3
4
5
6
7
bin_PROGRAMS = false true

false_SOURCES = true.c
false_CPPFLAGS = -DEXIT_CODE=1

true_SOURCES = true.c
true_CPPFLAGS = -DEXIT_CODE=0
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道