2

我正在学习自动工具。我的顶级目录结构是这样的

Sample--
        src
        test
        inc

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

4

1 回答 1

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.hfile_2.hSOURCES

由于-I$(srcdir)自动提供,因此您无需将此选项添加到AM_CPPFLAGS,前提是标题包含在表单中<file_1.h>"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

注意使用top_builddir- 我们希望能够构建“树外”。

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

libfoo_includedir = $(includedir)/foo # in foo/Makefile.am

AM_CPPFLAGS = -I$(top_srcdir) # in test/Makefile.am
于 2013-09-13T07:53:00.843 回答