【问题标题】:Automake, special flags for testsAutomake,用于测试的特殊标志
【发布时间】:2020-05-25 22:16:42
【问题描述】:

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

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

我也遇到过类似的情况,我意识到如果在 test_helper 之前编译了 foobar 可执行文件,那么 -DTESTING 的定义就不会得到尊重。

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

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

感谢您的帮助。

【问题讨论】:

    标签: c automake


    【解决方案1】:

    哦,我找到了解决办法。

    引用 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.ofoo-bar.ofoo-main.o 都将使用 -some -flags 编译。 (如果您想知道这些对象文件的名称,请参阅第 27.7 节 [重命名的对象],第 148 页。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多