c - 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 提供的文件应该在单元测试的上下文中重新编译,以便单元测试和二进制文件不使用相同的编译对象?
谢谢你的帮助。
解决方案
哦,我找到了解决办法。
引用 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 页。)
推荐阅读
- php - 用于 levelRange 的 Log4php 单独输出不起作用
- javascript - 在 JavaScript 中使用 for 循环的基于条件的迭代
- python-3.x - Celery 动态定义工作流程
- scala - 基于火花结构化流中的多个条件从另一列更新列值
- sql - 将 Access 查询的结果保存到 SQL Server
- django - 尽管安装了 heroku 中没有名为 PIL 的模块
- ios - 将 UIView 更新为与另一个 UIView 相同的高度
- apache-zookeeper - 使用 zookeeper 广播事件
- java - Reg-ex 匹配 statsD 格式
- javascript - 如何使 eventListener 仅侦听该特定元素?