我正在开发一个带有测试套件的共享库,全部用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
提供每个类别的单独默认标志。
但是从问题中代码片段的措辞和细节来看,我认为您正在使用Automake
的include
指令来构建单个makefile,并且在该makefile中,您希望表达适用于所有测试目标的标志,而不是任何其他目标。这里有一些方法:
-
在一个普通的
make
变量中定义所有需要的标志,并将它们插入到特定于测试的变量中。例子:tests_cflags = -O0 -g --coverage # ... tests_foo_CFLAGS = $(tests_cflags) tests_bar_CFLAGS = $(tests_cflags) tests_baz_CFLAGS = $(tests_cflags)
尽管这不能克服对每个测试目标特定变量的需要,但是它确实允许您在一个地方管理实际的标志,而不是为每个测试单独管理。
-
翻转脚本。假设您的测试数量比其他已编译的目标要多得多,那么可以设置默认标志来服务于测试,并在必要时为其他目标使用特定于目标的标志来覆盖它们。大多数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的标志变量排序规则。