根据程序源构建测试

时间:2014-05-18 16:25:02

标签: autotools autoconf automake libtool

我想为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&{39}中Makefile.am放置一个便利库{1}}。我是否正确地解决了这个问题?

1 个答案:

答案 0 :(得分:1)

你是正确的,但我也建议你选择几种不同的选择。

首先,我建议您使用non-recursive automake进行调查,这样您只需要有一个Makefile.am来保持最新状态,并减少autotools的讨厌因素

特别是,在单独的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文件的步骤,然后链接器将其解压缩,同时仍然共享已编译的源(只要您不使用per-目标CFLAGS)。

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