GNU Autotools 之旅
突发奇想,希望把我的车辆检测工程改用 autotools 改造一把。关于 GNU autotools,在网上搜一下,就能找到大把的资料。
我主要看了 使用 GNU autotools 改造一个软件项目,GNU Autoconf, Automake and Libtool,和Using Automake and Autoconf with C++。我是跟着第一篇文章作的,但却是最后一篇解决了我的一个疑问。
而且,Using Automake and Autoconf with C++的风格我相当喜欢。我的项目目录结构是这样的:
wsn
src
main.c
ata
ata.h
ata.c
fsm.h
fsm.c
fsm-init.c
fsm-noninit.c
config.h
cdc
cdc.h
cdc.c
lib
loop.h
loop.c
dataread.h
dataread.c
data
下面是几个问题,和它的解决办法(如果有的话):
- lib 下面是一些工具函数,负责读文件,和实现数据结构。我把它们单独出来。在 Makefile.am 里指定把它编译成了一个临时的静态库,libdataread.a。这样就可以比较清爽地分目录编译了。
- 现在我实现了两种算法,一个叫 ata,另一个唤作 cdc。名字取得不错吧。呵呵。main.c 要么用 ata,要么用 cdc。两者只能用一个。但是我在 src 目录里的 Makefile.am 的 SUBDIRS 却只能指定一个。要不怎么条件指定编译谁啊?就像:
- if define(cdc)
SUBDIRS = cdc $(SUBDIRS)
else
SUBDIRS =ata $(SUBDIRS)
endif - 回头再研究一下
—
- 看来 manual 是四海一家的解决方案啊。其实是 info 啦,GNU 的 info 比起 manual 来要详细很多。automake-1.9info->6.1 Recursing subdirectories 解释了 automake 的遍历目录树的方式。
现在,我把 src/Makefile.am 中的 SUBDIRS = cdc lib 改成 SUBDIRS = cdc lib 就可以了。 - 后来,又碰到了两个比较 trivial 的小错误:
- 在 configure.ac 里对变量赋值等号两边不能有空格。习惯在C语言里加空格的习惯在这里要改过来。
- AC_MSG_ERROR 里如果是有比较长的警告信息的话最好用方括弧包起来,有转义字符的话,还必须加斜杠,就像这样:
AC_MSG_ERROR(\"No Mesa/OpenGL utility \(GLU\) library appears to be installed\")
或者这样:AC_MSG_ERROR([ ********* * 不听话, * 叫你不听话! ********* ])
