(GNU make)installcheck库

Zor*_*war 4 install makefile shared-libraries

installcheck构建库时如何实现make 目标?也就是说,我有一个check,创建一个测试程序,它链接到创建的库,通过一些脚本,以所谓的检查,如果库代码功能正常的目标,我希望执行相同的检查,但链接到库后,它有已安装;我该如何实现呢?

Zor*_*war 5

由于我的问题没有得到回答,并且我无法轻松地在试管上找到任何东西,并且因为我的方法至少有效(尽管可能有点难看),所以我将使用所使用的通用方法回答我自己的问题。

如果构建库的检查例程涉及将库链接到测试程序并查看该程序是否正常运行,则要安装检查库,我们只需要做相同的事情,而是将测试程序链接到已安装的库,而不是本地构建的库图书馆。

让我们将库称为alpha(因此我们将创建libalpha.so和/或libalpha.a)。假设alpha的源代码在src目录的alpha.cpp文件中,我们将照常创建src / Makefile.am

# src/Makefile.am

lib_LTLIBRARIES = libalpha.la
libalpha_la_SOURCES = alpha.cpp
include_HEADERS = alpha.h
Run Code Online (Sandbox Code Playgroud)

检查例程涉及创建链接到alpha的二进制betaBeta的源代码位于目录tests的beta.cpp文件中。自动制作文件tests / Makefile.am看起来像:

# tests/Makefile.am

check_PROGRAMS = beta
beta_SOURCES = beta.cpp
beta_CPPFLAGS = -I$(top_srcdir)/src
beta_LDADD = $(top_builddir)/src/libalpha.la
Run Code Online (Sandbox Code Playgroud)

我们将增加checkinstallcheck指标纳入测试/ Makefile.am为:

check-local:
    # recipe to run when 'make check' is called.

installcheck-local:
    # recipe to run when 'make installcheck' is called.
Run Code Online (Sandbox Code Playgroud)

checkinstallcheck目标冲突,因为兼用目标的防止其他目标正常执行(一个目标“污点”,为其他目标构建树); 为了使其他目标正常执行,我们需要删除beta及其目标文件,并根据其性质(目标installcheck是安装文件,check本地文件)重新编译并重新链接目标。

我们可以通过简单地运行make clean两个目标的配方来解决污染的构建树的问题。这显然会删除受污染的构建,但这样做是过分热烈的,因为我们不必在再次运行相同目标时进行重建。仅当我们运行另一个目标时,构建树才会被污染。

我们只能通过记住先前曾调用过两个目标中的哪一个来解决此复杂问题,我们可以通过创建/销毁中间文件来做到这一点(我们称之为taint)。在check每当文件目标污点污点存在,其解决了由清洗,重建和除去污点 ; 而installcheck当文件目标沾染污点不存在,它解决了通过清洗,改造和创造的污点

我们的目标将采取以下形式:

check-local:
      # First, check to see if the build tree is tainted and rebuild if so
    test ! -f taint || $(MAKE) $(AM_MAKEFLAGS) check_rebuild
      # Then, run our check tests
    check_script.sh --bin=./beta --scenario=1
    check_script.sh --bin=./beta --scenario=2
    ...

installcheck-local:
      # First, check to see if the build tree is tainted and rebuild if so
    test -f taint || $(MAKE) $(AM_MAKEFLAGS) installcheck_rebuild
      # Then, run our installcheck tests
    check_script.sh --bin=./beta --scenario=1
    check_script.sh --bin=./beta --scenario=2
    ...
Run Code Online (Sandbox Code Playgroud)

目标check_rebuild需要根据check运行方式进行重建,如下所示:

.PHONY: check_rebuild
check_rebuild:
    $(MAKE) $(AM_MAKEFLAGS) clean          # remove tainted build tree
    $(MAKE) $(AM_MAKEFLAGS) beta$(EXEEXT)  # rebuild beta
    rm -f taint                            # mark build tree as untainted
Run Code Online (Sandbox Code Playgroud)

目标installcheck_rebuild同样如下所示:

.PHONY: installcheck_rebuild
installcheck_rebuild:
    $(MAKE) $(AM_MAKEFLAGS) clean          # remove tainted build tree
    $(MAKE) $(AM_MAKEFLAGS) beta$(EXEEXT) \
      alpha_CPPFLAGS="-I$(DESTDIR)$(includedir)" \
      alpha_LDADD="$(DESTDIR)$(libdir)/libalpha.la" \
      alpha_DEPENDENCIES="$(DESTDIR)$(libdir)/libalpha.la"
    echo 1 > taint                         # mark build tree as untainted
Run Code Online (Sandbox Code Playgroud)

请注意重建测试installcheck_rebuild,现在需要automake的变量的覆盖,使它们指向安装库。

就是这样。这些目标check-localinstallcheck-localcheck_rebuildinstallcheck_rebuild在其上面的最终形式应该只在任何地方的文件放在测试/ Makefile.am除了任何其他命令在那里。