MSYS下automake使用,以及configure.in和Makefile.am的修改
automake使用:
1)运行autoscan命令,产生configure.scan文件;
2)将configure.scan 文件重命名为configure.in,并修改configure.in文件;
3)运行aclocal命令,产生aclocal.m4文件;
4)运行autoconf命令,产生configure文件;
5)新建Makefile.am文件,新建NEWS、 README、 ChangeLog 、AUTHORS文件;
6)修改Makefile.am,并运行automake -a命令;(也可automake –add-missing)
7)运行./confiugre脚本。
8)至此,Makefile已生产,然后执行make编译即可。
其中configure.in和Makefile.am需要手动修改。
configure.in
原理:Autoconf 是用来产生 'configure' 档的工具。'configure' 是一个 shell script,它可以自动设定原始程序以符合各
种不同平台上 Unix 系统的特性,并且根据系统叁数及环境产生合适的 Makefile 档或是C 的标头档 (header file),让原始
程序可以很方便地在这些不同的平台上被编译出来。Autoconf 会读取 configure.in 档然後产生 'configure' 这个 shell
script。
configure.in 档的内容是一连串 GNU m4 的巨集,这些巨集经过autoconf 处理後会变成检查系统特徵的 shell script。
configure.in 内巨集的顺序并没有特别的规定,但是每一个 configure.in 档必须在所有巨集前加入 AC_INIT 巨集,然後在
所有巨集的最後面加上 AC_OUTPUT 巨集。我们可先用 autoscan 扫描原始档以产生一个 configure.scan 档,再对
configure.scan 做些修改成 configure.in 档。
示例:
AC_INIT(src/hello.c)
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(GnomeHello, 0.1)
AM_MAINTAINER_MODE
AM_ACLOCAL_INCLUDE(macros)
GNOME_INIT
AC_PROG_CC
AC_ISC_POSIX
AC_HEADER_STDC
AC_ARG_PROGRAM
AM_PROG_LIBTOOL
GNOME_COMPILE_WARNINGS
ALL_LINGUAS="da de es fr gl nl no pl ru sv fi uk"
AM_GNU_GETTEXT
AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LDFLAGS)
AC_OUTPUT([
Makefile
macros/Makefile
src/Makefile
intl/Makefile
po/Makefile.in
pixmaps/Makefile
doc/Makefile
doc/C/Makefile
doc/es/Makefile
])
dnl 后面的字不会被处理,可视为注解。
AC_INIT(FILE) 用来检查原始码所在的路径,autoscan 会自动产生
AM_INIT_AUTOMAKE(PACKAGE,VERSION) 是使用 Automake 所必备的巨集,PACKAGE 是我们所要产生软体套件的名称,VERSION
是版本编号。
AM_MAINTAINER_MODE([enable]) 是否可以重新编译。关闭缺省时仅供程序维护者使用的makefile目标,并修改以使configure能理解 --enable-maintainer-mode选项。--enable-maintainer-mode将maintaineronly目标重新打 开。仅供维护者使用的makefile目标允许最终用户清除自动生成的文件, 比如configure,这意味着要修复编译故障,必须安装有autoconf和automake软件。注意, 因为autogen.sh脚本主要是给开发人员用的,autogen.sh会自动传递一个--enable- maintainer-mode选项给configure。
AM_MAINTAINER_MODE allows you to choose whether the so called "rebuild rules" should be enabled or disabled. With AM_MAINTAINER_MODE([enable]), they are enabled by default, otherwise they are disabled by default. In the latter case, if you have AM_MAINTAINER_MODE in configure.ac, and run ‘./configure && make’, then make will *never* attempt to rebuild configure, Makefile.ins, Lex or Yacc outputs, etc. I.e., this disables build rules for files that are usually distributed and that users should normally not have to update.
AM_ACLOCAL_INCLUDE 制定一个附加目录。
AC_PROG_CC 检查系统可用的 C 编译器,如果原始程序是用 C 写的就需要这个巨集。
AC_PROG_CXX 制定C++编译器。
AC_ISC_POSIX 添加一些在某些平台上实现POSIX兼容需要的标志。
AC_HEADER_STDC 检查当前平台上是否有标准的ANSI头文件,如果有,则定义STDC_HEADERS。
AC_ARG_PROGRAM 添加一些选项到configure中,让用户能够修改安装程序的名称(如果在用户系统上碰巧有一个与要安装的程序名称相同的程序,这是很有用的)。
AM_PROG_LIBTOOL 是由automake用来设置libtool的用途的。只在计划编译共享库或动态可加载模块时才需要设置这个值。
ALL_LINGUAS=“es”不是一个宏,只是一句shell代码。它包含一个由空格分隔的语言种类缩写表,对应于po子目录下的.po文件。.po文件包含翻译成其他语言的文本,所以ALL_LINGUAS应该列出程序已经被翻译成的所有语言。
AC_SUBST 输出一个变量到由configure生成的文件中。
AC_CHECK_LIB(lib, function[, action_if_found[, action_if_not_found[, other_libs]]]) 对库文件进行检查。检查lib库
中是否存在制定的函数,当测试成功时,执行shell命令action_if_found,或者当action_if_found为空时在输出变量LIBS中添
加-llib。action_if_not_found把-lother_libs选项传给link命令。
如:AC_CHECK_LIB([pthread], [pthread_rwlock_init]):测试pthread库中是否存在pthread_rwlock_init函数。
AC_OUTPUT(FILE) 设定 configure 所要产生的档案,如果是 Makefile 的话,configure 便会把它检查出来的结果带入
Makefile.in 档然後产生合适的 Makefile。
实际上,我们使用 Automake 时,还须要一些其它的巨集,这些额外的巨集我们用 aclocal 来帮我们产生。执行 aclocal 会
产生 aclocal.m4 档,如果没有特别的用途,我们可以不必修改它,用 aclocal 所产生的巨集会告诉 Automake 怎麽做。
参考
http://developer.gnome.org/doc/GGAD/z69.html
http://www.ibm.com/developerworks/cn/linux/l-makefile/
http://oss.org.cn/ossdocs/gnu/linux1/makefile.html
http://socol.javaeye.com/blog/518863
http://blog.csdn.net/HNArke/archive/2010/06/25/5694723.aspx
Makefile.am
automake处理Makefile.am,生成一个符合标准的Makefile.in文件。
一般情况是在最上层目录下写一个Makefile.am,然后在每一个子目录下分别写一个Makefile.am文件。automake会从最 上层开始递归处理各个Makefile.am,然后生成一个Makefile.in。
可执行文件:
bin_PROGRAMS=foo
foo_SOURCES=xxx.c
foo_LDADD=
foo_LDFLAGS=
foo_DEPENDENCIES=
静态库:
lib_LIBRARIES=libfoo.a
foo_a_SOURCES=
foo_a_LDADD=
foo_a_LIBADD=
foo_a_LDFLAGS=
头文件:
include_HEADERS=foo.h
数据文件:
data_DATA=data1 data2
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
可用的全局变量
INCLUDES 链接时所需要的头文件
LDADD 链接时所需要的库文件
LDFLAGS 链接时所需要的库文件选项标志
EXTRA_LIST 源程序和一些默认的文件将自动打入.tar.gz包,其他文件若要进入.tar.gz包可以用这种办法,比如配置文件,数据文件等。
SUBDIRS 在处理本目录之前要递归哪些子目录
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
$(top_srcdir) 工程最顶层目录,用于引用源程序
$(top_builddir) 定义了生成目标文件上最上层的目录,用于引用.o等编译出来的目标文件
http://oss.org.cn/ossdocs/gnu/linux1/makefile.html