【问题标题】:How to write makefile.am's in subdirectories?如何在子目录中写入 makefile.am?
【发布时间】:2013-09-13 06:34:25
【问题描述】:

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

Sample--
        src
        test
        inc

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

【问题讨论】:

    标签: makefile autotools


    【解决方案1】:

    我从来没有接受过单独的标题目录的想法。除此之外,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 目录中,我们可以在SOURCES 主目录中简单地列出file_1.hfile_2.h 等。

    由于-I$(srcdir) 已提供automatically,因此您无需将此选项添加到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
    

    【讨论】:

    • 我以同样的方式尝试过,但给出了这个错误“没有规则可以将目标设为‘全部’。停止。”在我试图创建一个静态库的目录中。
    • 假设我想将一个库添加到另一个库(假设 libfoo 库需要其他目录中的另一个源文件)。我该怎么做?这是正确的做法吗? libfoo_la_LIBADD = $(top_srcdir)/src/another.la
    • foo_test_LDADD = $(top_builddir)/src/foo.la 这样我们就可以将静态库添加到我们的程序中。但是它们是如何自动创建的或者我们手动创建的,有什么方法可以在需要时自动完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多