首页 > 解决方案 > Automake,用于测试的特殊标志

问题描述

我有一个分成模块的软件项目。它们单独编译并链接到库或可执行文件中。桌上没有什么新东西:

$ 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.

这显然是由于 Automakehelper.o在构建单元测试时发现已经编译的事实。这也意味着首先编译单元测试可能会启用上述额外代码,并将其嵌入到foobar可执行文件中。

有没有办法告诉 Automake 提供的文件应该在单元测试的上下文中重新编译,以便单元测试和二进制文件不使用相同的编译对象?

谢谢你的帮助。

标签: cautomake

解决方案


哦,我找到了解决办法。

引用 Automake 手册:

27.8 每对象标志模拟

我的一个源文件需要使用不同的标志进行编译。我该怎么办?

Automake 支持每个程序和每个库的编译标志(参见第 8.4 节 [程序和库变量],第 65 页和第 27.6 节 [标志变量排序],第 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 页。)


推荐阅读