Tchaikov’s Journal

March 28, 2006

GNU Autotools 之旅

Filed under: GNU/Linux, Programming

突发奇想,希望把我的车辆检测工程改用 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
  • 回头再研究一下
  • 目前,我在 configure.ac 里加了两条 AC_ARG_ENABLE,让 configure 时可以选择 enable-cdc 还是 enable-ata,根据选择决定CFLAGS里是-DDECTEC=CDC还是ATA,但是缺少一个缺省值。同时也没有把这个 AC_ARG 传给 automake 判断。这是一个小小的缺憾。
  • 还有一点,main.c 的链接依赖于 libdataread.a。当它的依赖关系无法满足时,libdataread.a 无法自动编译。只能手动 cd 到 libdataread.a 所在的目录,再 make。不知道怎么样才能让 cdc 下的 Makefile 知道 lib 下面有它想要的东西。
  • 后记

    • 看来 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([
      *********
      * 不听话,
      * 叫你不听话!
      *********
      ])
  • 最后,我在 AC_OUTPUT 后面加了些 echo,显示用户选择的算法模块。很专业了,已经。嗯。
  • Get free blog up and running in minutes with Blogsome
    Theme designed by Jay of onefinejay.com