Makefile.am,是一个文件也好,是一种技术也罢,其它文件里面写的东西很简单,但是你要按照规则去写,就像Makefile文件一样,所以不要觉得Makefile.am文件很神秘,它和Makefile文件一样,只不过是一种比Makefile文件抽象程序更高的编译规则文件。 你在使用的时候,只要指定想生成什么目录,它用什么源码生成,编译的时候依赖哪些库,要安装到什么目录等等,接下来的工作全部交给automake 和 autoconf (关于这两个怎么工作的,我前面博客里有简单的写),一般情况下,它的规则也是很简单的。
下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则。如我在前面说automake和autoconf用法时,写的那个Makefile.am文件就两句话:
bin_PROGRAMS = autotest // 指明编译的应用程序名称(可以安装)。 不可安装更换为:noinst_PROGRAMS = autotes
autotest_SOURCE = autotest.c // 指明编译的源文件。
基本格式
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
可用全局变量
这些全局变量,上面的所有编译项里面都可以用。
基本相对路径
在编写Makefile.am文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了,
标准安装路径
默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=的方法来覆盖。
其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。
定义一个新的安装路径文件目录
如果你想在安装目录下再建一个目录,这个时候,可以这样操作。
比如你想新建一个 test 目录。可定义testdir = $(prefix)/test, 然后test_DATA =test1 test2,则test1,test2会作为数据文件安装到$(prefix)/test目录下。
比如,我在我的实际工程的*目录的Makefile.am中,添加如下两行,
datadir = ${prefix}/data
data_DATA = package // 结果是 在我的安装目录下,出现一个data目录,目录下有一个文件package
编译库文件
如果你的程序目录下有一个lib目录,可以这样在该目录下写Makefile.am
noinst_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include // 包含文件,注意 -I的使用。
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h
最后两行的意思是将swap.h安装到${prefix}/include/swap目录下。举个实际应用的例子,我的一个库文件的头文件,名称叫做serverd.h,
serverdincludedir=$(includedir)/serverd
serverdinclude_HEADERS=$(top_srcdir)/serverd/serverd.h
这个也是放在*目录里的,这两行能够使得在安装目录下的include目录下建立一个serverd目录,然后把serverd.h放进去。
编译安装程序
有前面的一些基础,下面直接写这个
noinst_PROGRAMS=autotest
autotest_SOURCES=autotest.c
autotest_LDADD=$(top_srcdir)/src/.....A.o $(top_srcdir)/src/lib/libswap.a // 包含的库目录