Hi Vincent,

> valgrind-tests.texi says:
> 
> However, this means that binaries invoked through scripts will not be
> invoked under valgrind, which could be solved by adding the following:
> 
> @smallexample
> TESTS_ENVIRONMENT = VALGRIND='$(VALGRIND)'
> @end smallexample
> 
> And then modify the shell scripts to invoke the binary prefixed with
> @code{$VALGRIND}.
> 
> but the libtool scripts cannot be modified that way.

I think this advice was written for those packages that install programs and
where the tests are shell scripts.
For example, if we have a test script that contains the lines

  : ${HELLO=hello}
  ${HELLO} | tr -d '\r' >hello-test1.out

the advice is to modify it to:

  : ${HELLO=$VALGRIND hello}
  ${HELLO} | tr -d '\r' >hello-test1.out

What I do in gettext is slightly different: I leave the test code unchanged
and instead augment TESTS_ENVIRONMENT:

  TESTS_ENVIRONMENT = HELLO="$(VALGRIND) hello" EXEEXT='@EXEEXT@' ...

> ... do something to invoke
> 
>   libtool --mode=execute valgrind ...

Yes [1]. Here, if 'hello' is a libtool wrapper script, you can write

  : ${HELLO=$LTVALGRIND hello}

in the script, or

  TESTS_ENVIRONMENT = HELLO="$(LTVALGRIND) hello" 

in the Makefile, with

  LTVALGRIND = $(top_srcdir)/libtool --execute $(VALGRIND)

In packages that install libraries, and where the test programs are
simple executables, you can do two things:

  a) Add a trivial launcher script around every test program, like

     #!/bin/sh
     exec ./test-foo

     which by the previous explanations gets transformed into

     #!/bin/sh
     exec $(LTVALGRIND) ./test-foo

Or

  b) Create a script 'valgrind-if-not-script' and set

     TESTS_ENVIRONMENT = ... $(SHELL) $(srcdir)/valgrind-if-not-script

     The script valgrind-if-not-script can do this: It extracts the first
     non-option argument, which indicates the program to execute. If it's
     a shell script and not a libtool wrapper, it is executed directly.
     If it's a libtool wrapper, "$top_srcdir/libtool --execute valgrind"
     is prepended and the resulting command line is executed. If it's not
     a shell script, it's likely an executable, then prepend "valgrind"
     and execute the resulting command.

Bruno

[1] http://lists.gnu.org/archive/html/bug-libtool/2010-05/msg00017.html
-- 
In memoriam Eberhard Finckh <http://en.wikipedia.org/wiki/Eberhard_Finckh>

Reply via email to