2

我正在开发一个应该进行大量计算的库。它使用 GNU autotools 构建系统。有一个测试项目链接到这个库并运行各种测试程序。每个过程都会将结果与 MATLAB 中预先计算的值进行比较。

我发现测试过程既无聊又耗时。每次我需要在库和测试项目中做make,然后运行程序,看看发生了什么。sudo make installmake

check使用自动工具将目标添加到库的标准方法是什么?它应该满足这个要求:

  1. 用户应该能够make check看到结果,而无需安装库本身。可执行文件应链接到最近编译且尚未安装的共享对象。
  2. 运行make check也应该运行测试程序。(不仅编译它)。的结果make check取决于测试单元程序的返回值。如果测试单元失败,make 应该会显示错误。
  3. 如果用户决定不编译,make check则不应编译任何可执行文件。
4

1 回答 1

4

由于您已经在使用自动工具,因此您已经拥有了大部分基础架构。我不知道目录布局,但假设你有:SUBDIRS = soroush tests在顶级Makefile.am,或者,你可能SUBDIRS = testssoroush目录中。重要的是 libtool-managedlibsoroush.la在下降到tests目录之前存在。

前缀check_表示这些对象,在这种情况下PROGRAM,不应该在make check运行之前构建。所以在tests/Makefile.am=>check_PROGRAMS = t1 t2 t3

对于每个测试程序,您可以指定:t1_SOURCES = t1.cc等。作为一种快捷方式,如果每个测试只有一个源文件,您可以使用AM_DEFAULT_SOURCE_EXT = .cc,它会为您隐式生成源文件。至今:

AM_CPPFLAGS = -I$(srcdir)/.. $(OTHER_CPPFLAGS) # relative path to lib headers.

LDADD = ../soroush/libsoroush.la

check_PROGRAMS = t1 t2 t3
AM_DEFAULT_SOURCE_EXT = .cc

# or: t1_SOURCES = t1.cc, t1_LDADD = ../soroush/libsoroush.la, etc.

make check将构建但不执行这些程序。为此,您需要添加:

TESTS = $(check_PROGRAMS)

这种方法真正好的地方在于,如果构建为共享库,libtool 将使用卸载libsoroush的库来处理库搜索路径等。

通常,生成的t1程序只是一个设置环境变量的 shell 脚本,以便真正的二进制:.libs/t1可以执行。我只提到这一点,因为使用 libtool 的全部意义在于您无需担心它是如何完成的。


测试反馈更复杂,具体取决于您的要求。您可以一直使用并行测试工具,或者只是简单的通过/失败反馈。除非测试是主要瓶颈,或者项目很大,否则使用简单(或脚本)测试会更容易。

于 2013-06-21T11:43:46.447 回答