C语言 是否可以在_PROGRAMS变量中为所有程序设置特定的_CFLAGS, _LDADD等变量? &



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

我有一个单独的makefile,它包含在主makefile中。Am,专门用于测试,看起来类似于以下内容:

TESTS = %reldir%/foo
%reldir%/bar
# etc.

check_PROGRAMS = $(TESTS)
LDADD = $(top_builddir)/src/libmylib.la

TESTS中列出的每个测试都是一个链接到LDADD库的.c程序,但是这种链接仅对测试程序是必需的。类似地,我想让测试程序通过一些cflag,而不是库本身,比如-O0 -g --coverage之类的。

由于我的TESTS/check_PROGRAMS列表越来越长,我添加的测试越多,我宁愿避免使用每个程序tests_foo_CFLAGS = ...tests_foo_LDADD = ...分配,因为它们都将是相同的-库链接,添加调试符号,构建gcov,等等。

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

是否可以在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的标志变量排序规则。

最新更新