automake autoconf 解说

来源:互联网 发布:简易cad软件 编辑:程序博客网 时间:2024/05/16 11:39

autoconf和automake的简单使用

1,运转起来
先看最简单的情况,让它运转起来,掌握基本步骤。
假设有源文件hello.h/c放在hello目录下。
第一步:
在hello目录下运行autoscan会生成configure.scan文件,同时打印错误提示"Can't find configure.ac"(原因不明,但不要紧)。
第二步:
将configure.scan改名为configure.in。并进行编辑,修改其中的
AC_INIT(hello, 1.0, you@example.com) 即程序名,版本,你的email
AC_OUTPUT(Makefile) 即configure运行后输出的东西有哪些,一般是每个文件夹下一个Makefile
AC_CHECK_LIB([pthread],[pthread_create],,[AC_MSG_ERROR([libpthread is missing])]) 如果你需要链接一些库则用这个进行检查且加入到LIBS变量中(后面细讲)
加入一行
AM_INIT_AUTOMAKE 有了这行才能使用automake生成Makefile.in
第三步:
运行aclocal生成需要的宏(macro,autoconf和automake其实都是在为一些宏赋值)
第四步:
运行autoconf生成configure
第五步:
为每个目录写Makefile.am(这例中只有一个)
内容如下:
AUTOMAKE_OPTIONS=foreigh
bin_PROGRAMS=hello
hello_SOURCES=xxxx xxxx表示所有于生成hello有关的源文件.h/.c这里是hello.h/c
第六步:
运行autoheader
第七步:
运行automake --add-missing --copy
完成。
现在可以./configure; make; make install; make xxx等

2,标准步骤
下图从autoconf手册中来。[]括起来的的是可能出现的文件,加*的是执行文件。
生成Makefile.in和configure等的过程:
your source files --> [autoscan*] --> [configure.scan] --> configure.ac

configure.ac --.
| .------> autoconf* -----> configure
[aclocal.m4] --+---+
| `-----> [autoheader*] --> [config.h.in]
[acsite.m4] ---'

Makefile.in -------------------------------> Makefile.in

生成Makefile以编译安装过程:

.-------------> [config.cache]
configure* ------------+-------------> config.log
|
[config.h.in] -. v .-> [config.h] -.
+--> config.status* -+ +--> make*
Makefile.in ---' `-> Makefile ---'


3,几个重要的宏
从前面可以看出重点有两个:修改configure.in和编辑Makefile.am
事实上,它们都是用一些宏来获取相关信息。重要的宏有:
configure.in中
AC_INIT([xxx],[yyy],[zzz],[aaa])可以有四个参数,前三个必须。第一个是软件包的名字,一个字符串(可以用空格,不需用引号);第二个是版本,如0.6;地三个是报告bug的email;地四个是make dist时创建的tar的名字。如果不填(前面的逗号也去掉)的话默认为xxx(但是会有变化,例如xxx为Myhello则创建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的目标,不一定要和包名相同。指定了这个之后,makeinstall会把该目标拷贝到prefix/bin目录下。很明显类似的有sbin_PROGRAMS,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=就行了。


3,三种一般需求
源代码的目录结构一般有三种: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/Makefile.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目录中的东西放到顶层目录就是了。但我想应该不是如此简单。

4,结论
可以看出autoconf和automake的基本原理是先由Makefile.am提供一个Makefile的框架,然后通过configure获取某些必要信息,如安装路径、编译器、包含的库等,并把这些信息赋给Makefile中的变量(例如LIBS、INCLUDES等)。
重要的是很多宏的赋值,甚至还可以定义自己的宏;具体可以参考autoconf的手册。
详细情况可以参考:
autoconf手册
英文版http://www.gnu.org/software/autoconf/manual/autoconf.html
中文版http://www.linuxforum.net/books/autoconf.html
automake手册
英文版http://sources.redhat.com/automake/automake.html
中文版http://www.linuxforum.net/books/automake.html
gnu编码标准
http://www.linuxforum.net/books/gcodestd.html

原创粉丝点击