现在的位置: 首页 > 综合 > 正文

Makefile.am

2012年09月09日 ⁄ 综合 ⁄ 共 2685字 ⁄ 字号 评论关闭

一般格式

文件类型 书写格式
可执行文件 bin_PROGRAMES = foo
foo_SOURCES = xxxx.c
foo_LDADD =
foo_LDFLAGS =
foo_DEPENDENCIES =
静态库 lib_LIBRARIES = libfoo.a
foo_a_SOURCES =
foo_a_LDADD =
foo_a_LIBADD =
foo_a_LDFALGS =
头文件 include_HEADERS = foo.h
数据文件 data_DATA = data1 data2

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

全局变量

Makefile.am还提供了一些全局变量供所有的目标体使用 :

变量 含义
INCLUDES 比如链接时所需要的头文件
LDADD 比如链接时所需要的库文件
LDFLAGS 比如链接时所需要的库文件选项标志
EXTRA_DIST 源程序和一些默认的文件将自动打入 .tar.gz 包,其他文件若要进入 .tar.gz 包可以使用这种方法,如配置文件,数据文件等。
SUBDIRS 处理本目录前要递归处理哪些子目录

automake 安装路径

automake设置了默认的安装路径:

标准安装路径

默认安装路径为 :
$(prefix) = /usr/local

可以通过 ./configure --prefix=<new_path> 的方法来覆盖。


其它的预定义目录还包括 :

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 来指明包 含的子目录:

SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core
CURRENTPATH=$(shell /bin/pwd)
INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include
export INCLUDES

由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含 了编译源文件时所用到的头文件,并导出。

我们将 lib 目录下的 swap.c 文件编译成 libswap.a 文件,被 apple/shell/apple.c 文件调用,那么lib目录下的 Makefile.am 如下所示:

noinst_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/includ

这里使用 noinst_LIBRARIES , 是因为如果只想编译,而不想安装到系统中,就 用 noinst_LIBRARIES 代替 bin_LIBRARIES ,对于可执行文件就用 noinst_PROGRAMS 代替 bin_PROGRAMS 。对于安装的情况,库将会安装到 $(prefix)/lib 目录下,可执行文件将会安装到 ${prefix}/bin 。如果想安装该
库,则 Makefile.am 示例如下:

bin_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

最后两行的意思是将 swap.h 安装到 ${prefix}/include/swap 目录下。

接下来,对于可执行文件类型的情况,我们将讨论如何写 Makefile.am . 对于编 译apple/core目录下的文件,我们写成的Makefile.am如下所示:

noinst_PROGRAMS=test
test_SOURCES=test.c
test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a
test_LDFLAGS=-D_GNU_SOURCE
DEFS+=-D_GNU_SOURCE
#LIBS=-lpthread

由于我们的 test.c 文件在链接时,需要 apple.o 和 libswap.a 文件,所以我 们需要在 test_LDADD 中包含这两个文件。对于 Linux 下的信号量/读写锁文件 进行编译,需要在编译选项中指明 -D_GNU_SOURCE 。所以在 test_LDFLAGS 中指 明。而 test_LDFLAGS 只是链接时的选项,编译时同样需要指明该选项,所以需 要
DEFS 来指明编译选项,由于 DEFS 已经有初始值,所以这里用 += 的形式指 明。从这里可以看出,Makefile.am 中的语法与 Makefile 的语法一致,也可以 采用条件表达式。如果你的程序还包含其他的库,除了用 AC_CHECK_LIB 宏来指 明外,还可以用LIBS来指明。

如果你只想编译某一个文件,那么 Makefile.am 如何写呢?这个文件也很简单, 写法跟可执行文件的差不多,如下例所示:

noinst_PROGRAMS=apple
apple_SOURCES=apple.c
DEFS+=-D_GNU_SOURCE

我们这里只是欺骗 automake ,假装要生成apple文件,让它为我们生成依赖关系 和执行命令。所以当你运行完 automake 命令后,然后修改 apple/shell/ 下的 Makefile.in 文件,直接将LINK语句删除,即:

clean-noinstPROGRAMS:
    -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)

apple$(EXEEXT): $(apple_OBJECTS) $(apple_DEPENDENCIES)
    @rm -f apple$(EXEEXT)

#$(LINK) $(apple_LDFLAGS) $(apple_OBJECTS) $(apple_LDADD) $(LIBS)

抱歉!评论已关闭.