如何编写makefile.am';子目录中有什么?

如何编写makefile.am';子目录中有什么?,makefile,autotools,Makefile,Autotools,我正在学习自动工具。我的顶级目录结构如下 Sample-- src test inc 这里src包含源文件,inc包含include文件,test包含测试套件的文件。假设我想编写一个测试套件,它需要src中的一些库,如何在automake中使用SUBDIRS选项来编写Makefile.am 我从来没有想过要为标题单独设置一个目录。除此之外,srcMakefile.am可以简单地使用am\u CPPFLAGS变量: AM_CPPFLAGS = -I

我正在学习自动工具。我的顶级目录结构如下

Sample--
        src
        test
        inc

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

我从来没有想过要为标题单独设置一个目录。除此之外,
src
Makefile.am
可以简单地使用
am\u 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
目录中,我们可以简单地在
SOURCES
主目录中列出
file_1.h
file_2.h

由于已经提供了
-I$(srcdir)
,因此只要标题包含在
“file\u 1.h”
格式中,就不需要将此选项添加到
AM\u CPPFLAGS

此外,将通过在
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\u builddir
——我们希望能够构建“树外”

<>最后,您可能想考虑用表单的标题构建库:<代码> <代码>。我认为这是一种更好的方法,因为主目录为库头提供了一种“名称空间”。e、 g

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

AM_CPPFLAGS = -I$(top_srcdir) # in test/Makefile.am

我以同样的方式尝试了它,但出现了以下错误:“No rule to make target`all'。Stop.”在目录下,我试图创建一个静态库。假设我想将一个库添加到另一个库中(假设libfoo库需要其他目录中的另一个源文件)。我该怎么做?。这是正确的做法吗?libfoo\u la\u LIBADD=$(top\u srcdir)/src/other.lafoo\u test\u LDADD=$(top\u builddir)/src/foo.la i通过这种方式,我们将静态库添加到程序中。但是它们是如何自动创建的,或者我们是如何手动创建的,有没有什么方法可以在需要时自动创建它们呢