You are on page 1of 2

3.

几个重要的宏
几个重要的宏从前面可以看出重点有两个:修改 configure.in 和编辑 Makefile.am 事实上,
它们都是用一些宏来获取相关信息。重要的宏有:
configure.in 中
AC_INIT([xxx],[yyy],[zzz],[aaa])
可以有四个参数,前三个必须。第一个是软件包的名字,一个字符串(可以用空格,不需用
引号);第二个是版本,如 0.6;地三个是报告 bug 的 email;地四个是 make dist 时创建的
tar 的名字。如果不填(前面的逗号也去掉)的话默认为 xxx(但是会有变化,例如 xxx 为 My
hello 则创建 my-hello.tar.gz)
AC_OUTPUT([xxx])
指出运行 configure 后输出那些文件,一般就是每个文件夹下的 Makefile,如:
AC_OUTPUT([Makefile, src/Makefile, doc/Makefile])
AC_CHECK_LIB([xxx],[yyy],[zzz],[aaa])
这个用来检查系统中是否安装了某个库。xxx 是库名去掉前面的 lib 后面的扩展名;yyy 是库
xxx 中的任一函数名;zzz 是当存在时做什么操作,建议留空([]也去掉),因为默认情况
就是把该库加入到 LIBS 变量中,即加入-lxxx,如果改了的话就不加了;aaa 是当不存在时
的操作,可以用 AC_MSG_ERROR([xxx is needed]),它将在运行 configure 时打印“xxx is
needed”并退出。
AM_INIT_AUTOMAKE(xxx, yyy)
可以不加参数(同时去掉括号),xxx 指包名(这里的包名不能有空格,就算用引号也不管用),
yyy 指版本号
Makefile.am 中
AUTOMAKE_OPTIONS=xxx
xxx 为 gnu , foreign , 和 gnits 。 指 用 什 么 风 格 的 工 程 , 如 果 是 gnu 则 必 须 要 自 己 写
AUTHOR , NEWS 等 文 件 ; 一 般 用 foreign , 在 automake 时 会 给 你 照 搬 一 套 默 认 的
AUTHOR,NEWS 等文件。
bin_PROGRAMS=xxx
指定最后生成的可执行文件的名字,即 Makefile 的目标,不一定要和包名相同。指定了这
个之后,make install 会把该目标拷贝到 prefix/bin 目录下。很明显类似的有 sbin_PROG
RAMS,lib_LIBRARIES, sysconf_DATA,man_MANS 等,这个在《GNU 编码标准》中有列表,
automake 做 了 一 些 扩 展 , 但 是 一 些 简 单 应 用 只 要 知 道 这 几 个 就 行 了 ; 例 如 指 定
man_MANS=hello.man.3 则 会 把 该 文 件 安 装 到 prefix/man 目 录 下 , 指 定 sysconf_DATA=
hello.conf 就会把配置文件放到 prefix/etc 目录下。xxx_SOURCES=yyy 这里指定所有与 xxx
有关的源文件。注意,不要把其他目录下的文件放进去。例如,如果 xxx 用到了../comm 目录
下的 debug.c,不要加到后面,这样会在本目录下产生 debug.o 文件。标准做法是把../comm
中的东西做成 libcomm.a,然后用 xxx_LDADD=.. /comm/libcomm.a 加入。
xxx_LDADD=path/libyyy.a
如果 xxx 用到了某个 lib,则用这个来指定。如果想指定全局 lib 则直接用 LDADD=就行了。

三种一般需求源代码的目录结构一般有三种:flat 型,即所有的文件都在一个目录下;deep
型,即顶层目录没有源文件,源文件分装在子目录如 src,doc,test 等;shallow 型,即顶
层目录中也有源文件,但大部分源文件在子目录中,例如 lib,include 等
第一种:前面已经提到。
第二种:目录结构如下:其中 src 中需要用到 comm 中的东西 test
|-- comm
| |-- debug.c
| `-- debug.h
|-- doc
| |-- test.conf
| `-- test.man.3
`-- src
|-- test.c
`-- test.h

 进入 test, 运行 autoscan 得到 configure.scan

 mv configure.scan configure.in, 不一样的改动是 AC_OUTPUT([Makefile comm/Makefile


src/Makefile doc/Makefile])
AC_PROG_RANLIB 因为用了 lib

 运行 aclocal
 运行 autoconf

 为每个需要 Makefile 的文件夹创建文件 Makefile.am。这里是 Makefile.am,comm/Make


file.am, src/Makefile.am,doc/Makefile.am 顶层的 Makefile.am 内容如下 SUBDIRS = doc comm
src test 这里注意把 comm 放在 src 前面 comm/Makefile.am 内容如下:
noinst_LIBRARIES=libcomm.a noinst 指的是该库不要 install 到 prefix/lib 目录下,因为只是
一个临时的 libcomm_a_lib=debug.h debug.c 注意命名 src/Makefile.am 内容如下:
bin_PROGRAMS=test
hello_SOURCES=test.h test.c
doc/Makefile.am 内容如下:
man_MANS=test.man.3
sysconf_DATA=test.conf
 autoheader

 automake --add-missing --copy


完成。
需要说明的是,如果还有一个目录 lib 里装的是一些用于做成 libtest.a 的文件,而且 libtest.a
还用到了 comm 中的东西,这时不能在 lib/Makefile.am 中使用 libtest_a_LIBADD=../comm/
libcomm.a。这样回到之 libtest.a 中有未解析符号,应该用 libtest_a_LIBADD=../comm/debug.o
(原因不明,但感觉不应该是这样的,这样太土了)

第三种:感觉于第二种没有什么区别——直接把 src 目录中的东西放到顶层目录就是了。但


我想应该不是如此简单。

You might also like