【问题标题】:Build tests depending on program sources根据程序源构建测试
【发布时间】:2014-05-18 16:25:01
【问题描述】:

我想为foo 程序构建测试。我的根Makefile.am 看起来像:

SUBDIRS = src tests

来自src 的Makefile.am 包含:

bin_PROGRAMS = foo
foo_CXXFLAGS = # a lot of $(XXX_CFLAGS)
foo_LDADD = # a lot of $(XXX_LIBS)
foo_SOURCES = # a lot of source files

来自tests 的Makefile.am 包含:

check_PROGRAMS = footesta footestb
TESTS = footesta footestb
footesta_SOURCES = footesta.cpp
footestb_SOURCES = footestb.cpp

这些测试依赖于foo 符号,我考虑通过在顶部使用一些foo_LIBADD = libfoo.la 并将noinst_LTLIBRARIES = libfoo.la 放在Makefile.amsrc 中来创建一个便利库。我在解决这个问题的正确方法吗?

【问题讨论】:

  • 为什么,为什么,为什么是自动工具?想想孩子们!
  • @DanielKamilKozar - 因为他不想重新发明轮子,cmake 正在(缓慢地)重新发明?
  • 是的,你在正确的轨道上。

标签: autotools autoconf automake libtool


【解决方案1】:

你是在正确的方式,但我也建议你几个不同的选择。

首先,我建议你考虑使用non-recursive automake,这样你就只有一个可以保持更新,而不是三个Makefile.am,并减少了自动工具的讨厌因素。

特别是,在单独的Makefile.am 中使用便利库方法会使依赖项跟踪变得非常复杂,这意味着如果您正在更改(例如,头文件),您可能会或可能不会正确地重新运行测试。使用单个非递归 Makefile.am 时,依赖关系跟踪正确完成。

另一个选项,同样使用非递归构建系统,是用一组源声明变量,这样您就可以拥有

SELF_CONTAINED_SRCS = foo.h foo1.c foo2.c foo3.c
foo_SOURCES = $(SELF_CONTAINED_SRCS) main.c other.c

footest_SOURCES = footesta.c $(SELF_CONTAINED_SRCS)

这避免了运行存档器以生成.a 文件然后让链接器解压缩它的内部步骤,同时仍然共享已编译的源(只要您不使用每个目标CFLAGS )。

如果您计划使用每个目标 CFLAGS(假设您希望在 foo3.c 中有特定于测试的代码),那么您将无法在两个目标之间共享编译的目标文件,但那是使用变量扩展时也可以,而使用便利库则不行,这就是为什么这实际上是我的首选。

【讨论】:

  • 谢谢,我会使用非递归的方式,这样可以大大简化维护过程。
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多