bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] valgrind-tests: Better option handling.


From: Simon Josefsson
Subject: [PATCH] valgrind-tests: Better option handling.
Date: Fri, 14 May 2021 14:27:54 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Hi.  I have pushed the attached patch.  It should be completely
backwards compatible, or there is a bug, so please test this.  It adds
two new variables to allow both developers and users to influence the
valgrind options used.  You may want to re-read the manual, I updated it
to assume people use the parallel automake test harness today.

Developers may want to use 'LOG_COMPILER=$(LOG_VALGRIND)' instead of
'LOG_COMPILER=$(VALGRIND)' in your Makefile.am, to make it easier for
end-users to modify the options passed to valgrind.  The old style still
works fine, and in the same way as before.  The reason for the change is
to enable end-users to be able to change VALGRINDFLAGS during a 'make
check' phase if they want.

/Simon
From e0a1ea5e1d20918f6850a2ab8cb86c691cd8b46c Mon Sep 17 00:00:00 2001
From: Simon Josefsson <simon@josefsson.org>
Date: Fri, 14 May 2021 14:17:20 +0200
Subject: [PATCH] valgrind-tests: Better option handling.

* m4/valgrind-tests.m4: Support new variables VALGRINDFLAGS and
DEFAULT_VALGRINDFLAGS.
* doc/valgrind-tests.texi (Running self-tests under valgrind): Improve.
---
 ChangeLog               |   8 +++
 doc/valgrind-tests.texi | 105 +++++++++++++++++++++++++++++++++++-----
 m4/valgrind-tests.m4    |  67 +++++++++++++++++--------
 3 files changed, 148 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4716f78a8..daeb44ab4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2021-05-14  Simon Josefsson  <simon@josefsson.org>
+
+       valgrind-tests: Better option handling.
+       * m4/valgrind-tests.m4: Support new variables VALGRINDFLAGS and
+       DEFAULT_VALGRINDFLAGS.
+       * doc/valgrind-tests.texi (Running self-tests under valgrind):
+       Improve.
+
 2021-05-14  Markus Mützel  <markus.muetzel@gmx.de>  (tiny change)
 
        windows-spawn: Don't assume that UNICODE is not defined.
diff --git a/doc/valgrind-tests.texi b/doc/valgrind-tests.texi
index fef910edf..9f3b30968 100644
--- a/doc/valgrind-tests.texi
+++ b/doc/valgrind-tests.texi
@@ -11,6 +11,7 @@ at the discretion of the developer.
 
 @menu
 * Using valgrind automatically::
+* Valgrind options::
 * Using valgrind manually::
 * Valgrind and shell scripts::
 @end menu
@@ -19,19 +20,93 @@ at the discretion of the developer.
 @subsection Using valgrind without developer intervention
 
 The @code{valgrind-tests} module searches for Valgrind at configure time
-and declares the @code{VALGRIND} automake variable for use with automake's
-@code{TESTS_ENVIRONMENT}.
+and declares the @code{LOG_VALGRIND} automake variable for use with
+automake's @code{LOG_COMPILER}.
 
 After importing the @code{valgrind-tests} module to your project, you
 use it by adding the following to the @code{Makefile.am} that runs the
 self-tests:
 
 @smallexample
-TESTS_ENVIRONMENT = $(VALGRIND)
+LOG_COMPILER = $(LOG_VALGRIND)
 @end smallexample
 
 This will run all self-checks under valgrind.
 
+Replace @code{LOG_COMPILER} with @code{TESTS_ENVIRONMENT} if you are
+using the old serial test harness.
+
+If you desire a project-wide decision that valgrind is not enabled by
+default, but still allow users to enable it with
+@code{--enable-valgrind-tests} you may put the following in configure.ac
+before gl_INIT.
+
+@smallexample
+gl_VALGRIND_TESTS_DEFAULT_NO
+@end smallexample
+
+@node Valgrind options
+@subsection Valgrind options
+
+The @code{VALGRIND} variable holds the name of the valgrind binary and
+some options passed to valgrind.  You may provide additional options
+that are passed to valgrind using the @samp{VALGRINDFLAGS} variable, for
+example:
+
+@smallexample
+./configure 
VALGRINDFLAGS="--suppressions=/your/local/valgrind/suppressions/file.txt"
+@end smallexample
+
+Alternatively during build phase:
+
+@smallexample
+make check 
VALGRINDFLAGS="--suppressions=/your/local/valgrind/suppressions/file.txt"
+@end smallexample
+
+This is useful if you have a valgrind suppression files that are needed
+to avoid triggering errors for known errors, typically in system
+libraries.
+
+The @code{VALGRIND} variable include options that are useful when
+valgrind is run non-interactively through the test harness.  The default
+parameters are @code{-q} to silence the output,
+@code{--error-exitcode=1} to cause valgrind errors to be treated as
+fatal errors, and @code{--leak-check=full} to check for memory leaks.
+
+These options can be controlled through the @code{DEFAULT_VALGRINDFLAGS}
+variable.  For example, when configuring the package:
+
+@smallexample
+./configure DEFAULT_VALGRINDFLAGS="--quiet"
+@end smallexample
+
+Alternatively, during the build phase:
+
+@smallexample
+make check DEFAULT_VALGRINDFLAGS="--quiet"
+@end smallexample
+
+That would have the effect of removing @code{--error-exitcode=1} and
+@code{--leak-check=full} from the default options, thus causing any
+valgrind errors to be silently ignored, instead of causing fatal test
+failures.
+
+As a developer you may use the variables in @code{configure.ac} before
+calling @code{gl_INIT}, like this if your program has deeply-nested call
+chains:
+
+@smallexample
+gl_EARLY
+...
+VALGRINDFLAGS="$VALGRINDFLAGS --num-callers=42"
+...
+gl_INIT
+@end smallexample
+
+Note that any user-supplied @code{VALGRINDFLAGS} value is preserved,
+which is usually what you want.
+
+
 @node Using valgrind manually
 @subsection Using valgrind at the developer's discretion
 
@@ -58,24 +133,28 @@ There are two ways to avoid this:
 
 @itemize @bullet
 @item
-You can make use of the @code{build-aux/run-test} script from Gnulib.
-Add these lines to your @code{Makefile.am}:
+Using the Automake parallel-tests feature, you can use the following instead:
 
 @smallexample
-# This must be the last thing that gets added to TESTS_ENVIRONMENT.
-TESTS_ENVIRONMENT += $(SHELL) $(top_srcdir)/build-aux/run-test '$(VALGRIND)'
+TEST_EXTENSIONS = .pl .sh
+LOG_COMPILER = $(LOG_VALGRIND)
 @end smallexample
 
+Then valgrind will only be used for the non-.sh and non-.pl tests.
+
+For old automake, you will need @code{AUTOMAKE_OPTIONS = parallel-tests}
+to enable the parallel test harness.
+
 @item
-Using the Automake parallel-tests feature, you can use the following instead:
+You can make use of the @code{build-aux/run-test} script from Gnulib.
+Add these lines to your @code{Makefile.am}:
 
 @smallexample
-AUTOMAKE_OPTIONS = parallel-tests
-TEST_EXTENSIONS = .pl .sh
-LOG_COMPILER = $(VALGRIND)
+LOG_COMPILER += $(SHELL) $(top_srcdir)/build-aux/run-test '$(LOG_VALGRIND)'
 @end smallexample
 
-Then valgrind will only be used for the non-.sh and non-.pl tests.
+Replace @code{LOG_COMPILER} with @code{TESTS_ENVIRONMENT} if you use the
+old serial test harness.
 @end itemize
 
 However, with this measure in place, binaries invoked through scripts will
@@ -84,7 +163,7 @@ variables in the @code{TESTS_ENVIRONMENT} variable that are 
then used by the
 shell scripts.  For example, add the following:
 
 @smallexample
-TESTS_ENVIRONMENT = VALGRIND='$(VALGRIND)'
+TESTS_ENVIRONMENT = VALGRIND='$(LOG_VALGRIND)'
 @end smallexample
 
 And then modify the shell scripts to invoke the binary prefixed with
diff --git a/m4/valgrind-tests.m4 b/m4/valgrind-tests.m4
index 50d90e145..9fc9d5b37 100644
--- a/m4/valgrind-tests.m4
+++ b/m4/valgrind-tests.m4
@@ -1,4 +1,4 @@
-# valgrind-tests.m4 serial 6
+# valgrind-tests.m4 serial 7
 dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -8,18 +8,60 @@ dnl From Simon Josefsson
 
 # gl_VALGRIND_TESTS()
 # -------------------
-# Check if valgrind is available, and set VALGRIND to it if available.
-AC_DEFUN([gl_VALGRIND_TESTS],
+# Check if valgrind is available.
+
+# Sets VALGRIND to command line (including options) to invoke valgrind
+# with, may be used directly in autoconf, makefiles or shell scripts.
+
+# Sets LOG_VALGRIND, suitable for use with LOG_COMPILER, that in a
+# makefile will expand to command line to invoke self-tests with,
+# i.e., LOG_VALGRIND = $(VALGRIND) $(DEFAULT_VALGRINDFLAGS)
+# $(VALGRINDFLAGS).
+
+# Whether to look for valgrind and set the variables can be influenced
+# by calling gl_VALGRIND_TESTS_DEFAULT_NO in configure.ac.
+# Regardless, the user can change the choice through the options
+# --enable-valgrind-tests or --disable-valgrind-tests.
+
+# You may modify the VALGRIND, DEFAULT_VALGRINDFLAGS and VALGRINDFLAGS
+# variables before calling this function to override defaults.  Either
+# as developer from configure.ac or user on the ./configure command
+# line.
+
+AC_DEFUN([gl_VALGRIND_TESTS_DEFAULT_NO],
+[
+  gl_valgrind_tests_default=no
+])
+
+AC_DEFUN_ONCE([gl_VALGRIND_TESTS],
 [
   AC_ARG_ENABLE([valgrind-tests],
     AS_HELP_STRING([--disable-valgrind-tests],
                    [don't try to run self tests under valgrind]),
-    [opt_valgrind_tests=$enableval], [opt_valgrind_tests=yes])
+    [opt_valgrind_tests=$enableval], 
[opt_valgrind_tests=${gl_valgrind_tests_default:-yes}])
 
   # Run self-tests under valgrind?
   if test "$opt_valgrind_tests" = "yes" && test "$cross_compiling" = no; then
     AC_CHECK_PROGS([VALGRIND], [valgrind])
 
+    AC_SUBST([DEFAULT_VALGRINDFLAGS])
+    if test -z "$DEFAULT_VALGRINDFLAGS"; then
+      DEFAULT_VALGRINDFLAGS="-q --error-exitcode=1 --leak-check=full"
+    fi
+    AC_ARG_VAR([VALGRINDFLAGS], [Additional flags for Valgrind])
+
+    if test -n "$VALGRIND"; then
+      AC_CACHE_CHECK([for valgrind options for tests],
+        [gl_cv_opt_valgrind_tests],
+        [AS_IF([$VALGRIND $DEFAULT_VALGRINDFLAGS $VALGRINDFLAGS true],
+               [gl_cv_opt_valgrind_tests="$DEFAULT_VALGRINDFLAGS 
$VALGRINDFLAGS"],
+               [gl_cv_opt_valgrind_tests=no])
+        ])
+      if test "$gl_cv_opt_valgrind_tests" != no; then
+        VALGRIND="$VALGRIND $gl_cv_opt_valgrind_tests"
+      fi
+    fi
+
     if test -n "$VALGRIND"; then
       dnl On Ubuntu 16.04, /usr/bin/valgrind works only on 64-bit executables
       dnl but fails on 32-bit executables (with exit code 1) and on x86_64-x32
@@ -28,7 +70,7 @@ AC_DEFUN([gl_VALGRIND_TESTS],
         [gl_cv_prog_valgrind_works],
         [AC_RUN_IFELSE(
            [AC_LANG_SOURCE([[int main () { return 0; }]])],
-           [$VALGRIND ./conftest$ac_exeext 2>/dev/null
+           [$VALGRIND $gl_cv_opt_valgrind_tests ./conftest$ac_exeext 
2>/dev/null
             if test $? = 0; then
               gl_cv_prog_valgrind_works=yes
             else
@@ -42,19 +84,6 @@ AC_DEFUN([gl_VALGRIND_TESTS],
       fi
     fi
 
-    if test -n "$VALGRIND"; then
-      AC_CACHE_CHECK([for valgrind options for tests],
-        [gl_cv_opt_valgrind_tests],
-        [gl_valgrind_opts='-q --error-exitcode=1 --leak-check=full'
-         if $VALGRIND $gl_valgrind_opts ls > /dev/null 2>&1; then
-           gl_cv_opt_valgrind_tests="$gl_valgrind_opts"
-         else
-           gl_cv_opt_valgrind_tests=no
-         fi
-        ])
-      if test "$gl_cv_opt_valgrind_tests" != no; then
-        VALGRIND="$VALGRIND $gl_cv_opt_valgrind_tests"
-      fi
-    fi
+   AC_SUBST([LOG_VALGRIND], ["\$(VALGRIND) \$(DEFAULT_VALGRINDFLAGS) 
\$(VALGRINDFLAGS)"])
   fi
 ])
-- 
2.20.1

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]