是否可以为 _PROGRAMS 变量中的所有程序设置特定的 _CFLAGS、_LDADD 等变量?

Is it possible to set specific _CFLAGS, _LDADD etc. variables for all programs in a _PROGRAMS variable?

我正在开发一个共享库,它附带测试套件,全部用 C 语言编写。

我有一个单独的 makefile,它包含在主 Makefile.am 中,专门用于测试,看起来类似于:

TESTS = %reldir%/foo\
    %reldir%/bar\
    # etc.
    
check_PROGRAMS = $(TESTS)
LDADD = $(top_builddir)/src/libmylib.la

TESTS 中列出的每个测试都是针对 LDADD 库 link 的 .c 程序,但是只有测试程序才需要这个 linkage。同样,有我想为测试程序传递的CFLAGS,而不是库本身,例如-O0 -g --coverage之类的。

由于我的 TESTS/check_PROGRAMS 列表随着我添加的测试越多而变得越长,我宁愿避免使用每个程序的 tests_foo_CFLAGS = ...tests_foo_LDADD = ... 作业,因为它们都将是相同的 - link 针对库,添加调试符号,为 gcov 构建,等等。

是否可以只为 TESTS 中的所有目标声明这些变量?

Is it possible to just declare these variables for all targets in TESTS?

并非如此。 Automake 提供了表示默认标志的带有标志的变量和表示目标特定标志的变量,但是没有内置的方法来指定适用于指定目标子集的标志。尽管如此,还是有一些方法可以使用可用的功能来至少接近您想要的。

一种方法是通过 SUBDIRS 和多个 Makefile.am 文件设置递归构建。通过这样的设置,您应该能够为每个 Makefile.am.

的每个类别设置单独的默认标志

但是从问题中代码片段的措辞和细节来看,我认为您正在使用 Automakeinclude 指令构建单个 makefile,并在该 makefile 中您想要表达适用于所有测试目标但不适用于任何其他目标的标志。这里有一些方法可以解决这个问题:

  1. 在一个普通的 make 变量中定义所有需要的标志,并将它们插入到特定于测试的变量中。示例:

    tests_cflags = -O0 -g --coverage
    # ...
    tests_foo_CFLAGS = $(tests_cflags)
    tests_bar_CFLAGS = $(tests_cflags)
    tests_baz_CFLAGS = $(tests_cflags)
    

    虽然这并不能克服每个测试目标对特定于目标的变量的需求,但它确实允许您在一个地方管理所有实际标志,而不是为每个测试单独管理。

  2. 翻转脚本。假设您有比其他编译目标更多的测试,设置默认标志来为测试服务,并在必要时用其他目标的目标特定标志覆盖它们。大多数 Automake 默认值是通过带有 AM_ 前缀的变量传递的(LDADD 是一个例外),所以它可能看起来像这样:

    LDADD = $(top_builddir)/src/libmylib.la
    AM_CFLAGS = -O0 -g --coverage
    # ...
    # no tests_foo_CFLAGS, etc.
    # ...
    libmylib_la_CFLAGS = ...
    

    请注意,如果您只想取消默认标志而不是用不同的标志替换它们,则目标特定变量的值(在本例中为 libmylib_la_CFLAGS)可以为空。

无论哪种方式,您可能都想熟悉 Automake's flag-variable ordering rules