如何在子目录中编写makefile.am?

时间:2013-09-13 06:34:26

标签: makefile autotools

我正在学习autotools。我的顶级目录结构就像这样

Sample--
        src
        test
        inc

此处 src 包含源文件, inc 包含包含文件, test 包含测试套件的文件。假设我想编写一个测试套件,需要 src 中的一些库如何使用automake中的 SUBDIRS 选项编写Makefile.am?

1 个答案:

答案 0 :(得分:3)

我从未因为标题的单独目录而被出售。除此之外,src Makefile.am可以简单地使用AM_CPPFLAGS变量:

AM_CPPFLAGS = -I$(top_srcdir)/inc # and other preprocessor flags.
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = file_1.c file_2.c ... ../inc/file_1.h ../inc/file_2.h ...

理想情况下,如上所述,您还应在libfoo_la_SOURCES中包含标头,因为标头中的任何更改都需要重新编译源文件。通过将标题放在src目录中,我们只需在file_1.h主目录中列出file_2.hSOURCES等。

由于-I$(srcdir)已经提供automatically,您无需将此选项添加到AM_CPPFLAGS,前提是标题包含在<file_1.h>或{{ 1}}。

此外,将通过将以下内容添加到"file_1.h"

来安装标头
src/Makfile.am

最小的顶级libfoo_includedir = $(includedir) libfoo_include_HEADERS = file_1.h file_2.h ... 可能如下所示:

Makefile.am

这给我们留下了ACLOCAL_AMFLAGS = -I m4 --install # AC_CONFIG_MACRO_DIR([m4]) in configure.ac SUBDIRS = src tests # depth-first ordering of build.

test/Makefile.am

请注意AM_CPPFLAGS = -I$(top_srcdir)/src # or $(srcdir)/../src check_PROGRAMS = foo_test foo_test_SOURCES = foo_test.c foo_test_LDADD = $(top_builddir)/src/libfoo.la 的使用 - 我们希望能够构建'out-of-tree'。

最后,您可能需要考虑使用以下格式的标头构建库:top_builddir。我认为这是一种更好的方法,因为前导目录为库头提供了一种“名称空间”。如,

<foo/file_1.h>