是否可以为 _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
.
的每个类别设置单独的默认标志
但是从问题中代码片段的措辞和细节来看,我认为您正在使用 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's flag-variable ordering rules。
我正在开发一个共享库,它附带测试套件,全部用 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
.
但是从问题中代码片段的措辞和细节来看,我认为您正在使用 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's flag-variable ordering rules。