我有一个软件项目,该项目分为多个模块。它们分别编译并链接到库或可执行文件中。桌子上没有新内容:
$ cat src/Makefile.am
...
bin_PROGRAMS = foobar
foobar_SOURCES = foobar.c helper.c
...
单元测试验证单个文件的属性,例如特定功能的正确性。假设我要测试helper.c
的正确性,我不需要在单元测试中链接foobar.c
:
$ cat tests/Makefile.am
...
check_PROGRAMS = test_helper
test_helper_SOURCES = test_helper.c ../src/helper.c
...
我认为在编译单元测试时启用一组不同的标志是一种常见的做法。例如,可以决定引入特殊的一致性检查(可能计算量大),并且仅在将源代码编译为单元测试的一部分时才启用它们。
$ cat tests/Makefile.am
...
AM_CPPFLAGS = -DTESTING
check_PROGRAMS = test_helper
test_helper_SOURCES = test_helper.c ../src/helper.c
...
我有类似的情况,并且我意识到如果-DTESTING
可执行文件在foobar
之前编译,则test_helper
定义将不被接受。
这显然是由于Automake在构建单元测试时发现helper.o
已被编译的事实。这也意味着,首先编译单元测试可能会启用上述额外代码,并将其嵌入到foobar
可执行文件中。
是否有一种方法可以告诉Automake,应在单元测试的上下文中重新编译提供的文件,以使单元测试和二进制文件不使用同一编译对象?
感谢您的帮助。
哦,我找到了解决方法。
引用自动制作手册:
27.8每个对象标志仿真
我的一个源文件需要使用不同的标志进行编译。我该怎么办?
Automake支持按程序和按库编译标志(请参见第8.4节[程序和库变量],第65页,以及第27.6节[Flag Variables Ordering],第145页)。有了这个你可以定义适用于所有已编译文件的编译标志目标。例如在
bin_PROGRAMS = foo foo_SOURCES = foo.c foo.h bar.c bar.h main.c foo_CFLAGS = -some -flags
foo-foo.o
,foo-bar.o
和foo-main.o
将全部用-some -flags
编译。 (如果您想知道这些对象文件的名称,请参见第27.7节“重命名对象”,第148页。)