我想为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}}。我是否正确地解决了这个问题?
答案 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
中包含特定于测试的代码),那么您将无法在两个目标之间共享编译的目标文件,但在使用变量扩展时也是可能的,而便利库则不可能,这就是为什么它实际上是我的首选选择。