automake-patches
[Top][All Lists]
Advanced

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

Re: [PATCH] {master} coverage: add tests on remake rules in more complex


From: Ralf Wildenhues
Subject: Re: [PATCH] {master} coverage: add tests on remake rules in more complex situations
Date: Sat, 9 Apr 2011 19:41:18 +0200
User-agent: Mutt/1.5.20 (2010-08-04)

Hello Stefano, Bruno,

nice collaboration work there, thank you!

I have a few nits, mostly really trivial.  Feel free to push after
addressing them.  --author?

* Stefano Lattarini wrote on Fri, Apr 08, 2011 at 12:54:27PM CEST:
> Subject: [PATCH] coverage: add tests on remake rules in more complex 
> situations
> 
> * tests/defs (using_gmake): New function.
> (for tool in $required): Use it when $tool is 'GNUmake'.
> * tests/remake-moved-m4-file.test: New test.
> * tests/remake-deleted-m4-file.test: Likewise.
> * tests/remake-renamed-m4-file.test: Likewise.
> * tests/remake-renamed-m4-macro-and-file.test: Likewise.
> * tests/remake-renamed-m4-macro.test: Likewise.
> * tests/remake-add-acsubst-gnulib.test: Likewise.
> * tests/remake-add-header-gnulib.test: Likewise.
> * tests/remake-remove-header-gnulib.test: Likewise.
> * tests/Makefile.am (TESTS): Update.

> --- a/tests/defs
> +++ b/tests/defs
> @@ -146,6 +146,38 @@ AUTOMAKE_fails ()
>    AUTOMAKE_run 1 ${1+"$@"}
>  }
>  
> +# using_gmake
> +# -----------
> +# Return success if $MAKE is GNU make, return failure otherwise.
> +# Caches the result for speed reasons.
> +using_gmake ()
> +{
> +  case $am__using_gmake in
> +    yes)
> +      return 0
> +      ;;
> +    no)
> +      return 1
> +      ;;

Would it be ok to merge the ;; to the previous line?  My laptop doesn't
have very many vertical lines, and the spacing doesn't add information
here.  Same below in this case statement.  Thanks.

> +    '') 
> +      # Use --version AND -v, because SGI Make doesn't fail on --version.
> +      # Also grep for GNU because newer versions of FreeBSD make do
> +      # not complain about `--version' (they seem to silently ignore it).
> +      if $MAKE --version -v | grep GNU; then
> +        am__using_gmake=yes
> +        return 0
> +      else
> +        am__using_gmake=no
> +        return 1
> +      fi
> +      ;;
> +    *)
> +      echo "invalid value for \$am__using_gmake: '$am__using_gmake'" >&2
> +      Exit 99
> +      ;;
> +  esac
> +}
> +
>  commented_sed_unindent_prog='
>    /^$/b                    # Nothing to do for empty lines.
>    x                        # Get x<indent> into pattern space.
> @@ -217,11 +249,8 @@ do
>        etags --version -o /dev/null || exit 77
>        ;;
>      GNUmake)
> -      # Use --version AND -v, because SGI Make doesn't fail on --version.
> -      # Also grep for GNU because newer versions of FreeBSD make do
> -      # not complain about `--version' (they seem to silently ignore it).
> -      echo "$me: running $MAKE --version -v | grep GNU"
> -      ( $MAKE --version -v | grep GNU ) || exit 77
> +      echo "$me: determine if $MAKE is GNU make"
> +      using_gmake || exit 77
>        ;;
>      gcc)
>        # When gcc is required, export `CC=gcc' so that ./configure

> --- /dev/null
> +++ b/tests/remake-deleted-m4-file.test

> +# Test remake rules when an m4 file gets removed and the macros it
> +# defined gets inlined into the caller.  Try with both an indirect

s/gets/get/

> +# call and a direct one.  This can be seen as testing the "deleted
> +# header file" issue w.r.t. aclocal.m4 dependencies.

add cross-ref to acloca22.test?

> +. ./defs || Exit 1
> +
> +cat >> configure.in <<'END'
> +FOO_MACRO
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I m4
> +.PHONY: test
> +test:
> +     test '$(the_answer)' = 42

-eq ?  More instances below.

> +END
> +
> +macro_value='the_answer=42; AC_SUBST([the_answer])'
> +
> +mkdir m4
> +
> +cat > m4/foo.m4 <<'END'
> +AC_DEFUN([FOO_MACRO], [BAR_MACRO])
> +END
> +
> +cat > m4/bar.m4 <<END
> +AC_DEFUN([BAR_MACRO], [$macro_value])
> +END
> +
> +$ACLOCAL -I m4
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE test
> +
> +$sleep
> +
> +sed -e "s|BAR_MACRO|$macro_value|" m4/foo.m4 > t
> +mv -f t m4/foo.m4
> +rm -f m4/bar.m4
> +
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +
> +$sleep
> +
> +sed -e "s|FOO_MACRO|$macro_value|" configure.in > t
> +mv -f t configure.in
> +rm -f m4/foo.m4
> +
> +using_gmake || $MAKE Makefile
> +$MAKE test

> --- /dev/null
> +++ b/tests/remake-gnulib-add-acsubst.test

> +# Test remake rules when a new AC_SUBST'd variable is added, and C header
> +# files are involved.
> +# This test overlaps with others, and is not strictly necessary per se,
> +# but it exercises a real use case (from gnulib, see:
> +#  <http://lists.gnu.org/archive/html/bug-gnulib/2011-04/msg00005.html>
> +# for more info), so keep it anyway.

You could s/,.*// in the last line if you like (more instances below),
as that part is not needed any more once the test is applied.  ;-)

> +. ./defs || Exit 1
> +
> +cat >> configure.in <<'END'
> +AC_PROG_CC
> +MY_MACROS
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I m4
> +noinst_PROGRAMS = foo
> +foo_SOURCES = foo.c
> +BUILT_SOURCES = foo.h
> +edit_h = sed -e 's|address@hidden@|@foovar@|g'
> +foo.h: foo.in.h
> +     $(edit_h) < $(srcdir)/foo.in.h > address@hidden
> +     cat address@hidden;: for debugging
> +     mv -f address@hidden $@
> +EXTRA_DIST = foo.in.h
> +MOSTLYCLEANFILES = foo.h foo.h-t
> +END
> +
> +mkdir m4
> +
> +cat > m4/foo.m4 <<'END'
> +AC_DEFUN([MY_MACROS], [
> +     FOO_MACRO
> +dnl: ZAP_MACRO
> +])
> +END
> +
> +cat > m4/bar.m4 <<'END'
> +AC_DEFUN([FOO_MACRO], [
> +     foovar=42; AC_SUBST([foovar])
> +dnl: barvar=47; AC_SUBST([barvar])
> +])
> +END
> +
> +cat > foo.in.h <<'END'
> +#define foo @foovar@
> +END
> +
> +cat > foo.c <<'END'
> +#include "foo.h"
> +int main (void) { return 0; }
> +typedef int checkfoo[1 - 2 * (foo != 42)];
> +END
> +
> +$ACLOCAL -I m4
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE
> +
> +: AC_SUBST @barvar@ and add it to foo.h.
> +
> +$sleep
> +
> +sed -e 's/^dnl:/   /' m4/bar.m4 > t
> +mv -f t m4/bar.m4
> +cat m4/bar.m4
> +
> +cat >> foo.in.h <<'END'
> +#define bar @barvar@
> +END
> +
> +cat >> foo.c <<'END'
> +typedef int checkbar[1 - 2 * (bar != 47)];
> +END
> +
> +cat >> Makefile.am <<'END'
> +edit_h += -e 's|address@hidden@|@barvar@|g'
> +END
> +
> +using_gmake || $MAKE Makefile
> +$MAKE
> +
> +: AC_SUBST @zapvar@ and add it to foo.h.
> +# Do it in a slightly different way from how it was done for @address@hidden
> +
> +$sleep
> +
> +cat >> Makefile.am <<'END'
> +edit_h += -e 's|address@hidden@|$(zapvar)|g'
> +END
> +
> +cat >> foo.c <<'END'
> +typedef int checkzap[1 - 2 * (zap != 163)];
> +END
> +
> +sed -e 's/^dnl://' m4/foo.m4 > t
> +mv -f t m4/foo.m4
> +cat m4/foo.m4
> +
> +cat >> foo.in.h <<'END'
> +#define zap @zapvar@
> +END
> +
> +cat >> m4/bar.m4 <<'END'
> +AC_DEFUN([ZAP_MACRO], [zapvar=163; AC_SUBST([zapvar])])
> +END
> +
> +using_gmake || $MAKE Makefile
> +$MAKE
> +
> +$MAKE distcheck

> --- /dev/null
> +++ b/tests/remake-gnulib-add-header.test

> +# Test remake rules when a new C header "guarded" by AC_SUBST'd
> +# variables is added.
> +# This test overlaps with others, and is not strictly necessary per se,
> +# but it exercises a real use case (from gnulib, see:
> +#  <http://lists.gnu.org/archive/html/bug-gnulib/2011-04/msg00005.html>
> +# for more info), so please keep it anyway.
> +
> +. ./defs || Exit 1
> +
> +cat >> configure.in <<'END'
> +AC_CONFIG_HEADERS([config.h])
> +AC_PROG_CC
> +MY_MACROS
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I .
> +noinst_PROGRAMS = foo
> +foo_SOURCES = foo.c
> +BUILT_SOURCES = $(STDIO_H)
> +stdio.h: stdio.in.h
> +     cp $(srcdir)/stdio.in.h $@
> +MOSTLYCLEANFILES = stdio.h
> +EXTRA_DIST = stdio.in.h
> +check-local:
> +     ls -l . $(srcdir)
> +     if test -n '$(STDIO_H)'; then \
> +         test -f stdio.h || exit 1; \
> +     else \
> +         test ! -f stdio.h || exit 1; \
> +     fi
> +END
> +
> +cat > macros.m4 <<'END'
> +AC_DEFUN([MY_MACROS], [
> +  override_stdio=false
> +  if $override_stdio; then
> +    STDIO_H=stdio.h
> +    use_dummies=1
> +  else
> +    STDIO_H=
> +    use_dummies=0
> +  fi
> +  AC_SUBST([STDIO_H])
> +  AC_DEFINE_UNQUOTED([USE_DUMMIES], [$use_dummies],
> +    [Whether to use dummy types.])
> +])
> +END
> +
> +cat > stdio.in.h <<'END'
> +typedef struct dummyfile { void *p; } DUMMYFILE;
> +END
> +
> +cat > foo.c <<'END'
> +#include <config.h>
> +#include <stdio.h>
> +#if USE_DUMMIES
> +DUMMYFILE *f;
> +#else
> +FILE *f;
> +#endif
> +int main () { return 0; }
> +END
> +
> +$ACLOCAL -I .
> +$AUTOHEADER
> +$AUTOMAKE
> +$AUTOCONF
> +
> +./configure
> +
> +$MAKE
> +ls -l
> +test ! -f stdio.h
> +# Also try our build rules in a VPATH build.
> +$MAKE distcheck
> +
> +# No need to sleep here: "./configure" and "make distcheck" above
> +# have already slept enough.
> +
> +sed -e 's/^\( *override_stdio\)=.*$/\1=:/' macros.m4 > t
> +mv -f t macros.m4
> +
> +using_gmake || $MAKE Makefile
> +$MAKE
> +ls -l
> +test -f stdio.h
> +# Also try our build rules in a VPATH build.
> +$MAKE distcheck

> --- /dev/null
> +++ b/tests/remake-gnulib-remove-header.test

> +# Test remake rules when a C header "guarded" by AC_SUBST'd variables
> +# is not needed anymore, or when it's needed back.

s/back/again/

> +# This test requires some user-level machinery, overlaps with other tests,
> +# and is not strictly necessary per se, but it exercises a real, important
> +# use case (from gnulib, see:
> +#  <http://lists.gnu.org/archive/html/bug-gnulib/2011-04/msg00005.html>
> +# for more info), so please keep it anyway.
> +
> +. ./defs || Exit 1
> +
> +cat >> configure.in <<'END'
> +AC_CONFIG_HEADERS([config.h])
> +AC_PROG_CC
> +MY_MACROS
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I .
> +noinst_PROGRAMS = foo
> +foo_SOURCES = foo.c
> +BUILT_SOURCES = $(STDIO_H)
> +if REPLACE_STDIO_H
> +stdio.h: stdio.in.h $(top_builddir)/config.status
> +     cp $(srcdir)/stdio.in.h $@
> +else
> +stdio.h: $(top_builddir)/config.status
> +     rm -f $@
> +endif
> +MOSTLYCLEANFILES = stdio.h
> +END
> +
> +cat > macros.m4 <<'END'
> +AC_DEFUN([MY_MACROS], [
> +  override_stdio=:
> +  if $override_stdio; then
> +    STDIO_H=stdio.h
> +    use_dummies=1
> +  else
> +    STDIO_H=
> +    use_dummies=0
> +  fi
> +  AC_SUBST([STDIO_H])
> +  AC_DEFINE_UNQUOTED([USE_DUMMIES], [$use_dummies],
> +    [Whether to use dummy types.])
> +  AM_CONDITIONAL([REPLACE_STDIO_H], [test -n "$STDIO_H"])
> +])
> +END
> +
> +cat > stdio.in.h <<'END'
> +typedef struct dummyfile { void *p; } DUMMYFILE;
> +END
> +
> +cat > foo.c <<'END'
> +#include <config.h>
> +#include <stdio.h>
> +#if USE_DUMMIES
> +DUMMYFILE *f;
> +#else
> +FILE *f;
> +#endif
> +int main () { return 0; }
> +END
> +
> +$ACLOCAL -I .
> +$AUTOHEADER
> +$AUTOMAKE
> +$AUTOCONF
> +
> +for vpath in : false; do
> +
> +  if $vpath; then
> +    mkdir build
> +    cd build
> +    srcdir=..
> +  else
> +    srcdir=.
> +  fi
> +
> +  # Do not reject slow dependency extractors: we need dependency tracking.
> +  $srcdir/configure --enable-dependency-tracking

This could still result in no dependency tracking, namely when there is
just no way.  You could add
  grep 'depmode=none' Makefile && Exit 77

> +  $MAKE
> +  ls -l
> +  test -f stdio.h
> +
> +  # Simulate that we don't need our custom stdio.h anymore.
> +
> +  $sleep
> +  sed -e 's/^\( *override_stdio\)=.*$/\1=false/' $srcdir/macros.m4 > t
> +  diff $srcdir/macros.m4 t && Exit 99 # sanity check
> +  mv -f t $srcdir/macros.m4
> +
> +  using_gmake || $MAKE Makefile
> +  $MAKE
> +  ls -l
> +  test ! -f stdio.h
> +
> +  # And now simulate that we want our custom stdio.h back.
> +
> +  $sleep
> +  sed -e 's/^\( *override_stdio\)=.*$/\1=:/' $srcdir/macros.m4 > t
> +  diff $srcdir/macros.m4 t && Exit 99 # sanity check
> +  mv -f t $srcdir/macros.m4
> +
> +  using_gmake || $MAKE Makefile
> +  $MAKE
> +  ls -l
> +  test -f stdio.h
> +
> +  $MAKE distclean
> +  cd $srcdir
> +
> +done

> --- /dev/null
> +++ b/tests/remake-moved-m4-file.test

> +# Test remake rules when an m4 files gets moved among different "include

s/an m4 files gets/m4 files get/

> +# dirs" (i.e. those passed to aclocal with `-I' option).
> +
> +. ./defs || Exit 1
> +
> +distdir=$me-1.0
> +
> +cat >> configure.in <<'END'
> +MY_MACRO
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I d1 -I d2 -I d3
> +.PHONY: test
> +test:
> +     test '$(the_answer)' = 42
> +END
> +
> +mkdir d1 d2 d3
> +
> +cat > d1/macros.m4 <<'END'
> +AC_DEFUN([MY_MACRO], [FOO])
> +END
> +
> +cat > d1/foo.m4 <<'END'
> +AC_DEFUN([FOO], [the_answer=42; AC_SUBST([the_answer])])
> +END
> +
> +$ACLOCAL -I d1
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE test
> +
> +# Move one file.
> +mv d1/foo.m4 d2/foo.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/d2/foo.m4
> +test ! -f $distdir/d1/foo.m4
> +test -f $distdir/d1/macros.m4
> +test ! -f $distdir/d2/macros.m4
> +
> +# Move both files at once.
> +mv d1/macros.m4 d3/macros.m4
> +mv d2/foo.m4 d3/foo.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/d3/foo.m4
> +test -f $distdir/d3/macros.m4
> +test ! -f $distdir/d1/foo.m4
> +test ! -f $distdir/d2/foo.m4
> +test ! -f $distdir/d1/macros.m4
> +test ! -f $distdir/d2/macros.m4

> --- /dev/null
> +++ b/tests/remake-renamed-m4-file.test

> +# Test remake rules when m4 files gets renamed.

s/gets/get/

> +. ./defs || Exit 1
> +
> +distdir=$me-1.0
> +
> +cat >> configure.in <<'END'
> +MY_MACRO
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I m4
> +.PHONY: test
> +test:
> +     test '$(the_answer)' = 42
> +END
> +
> +mkdir m4
> +
> +cat > m4/macros.m4 <<'END'
> +AC_DEFUN([MY_MACRO], [FOO])
> +END
> +
> +cat > m4/foo.m4 <<'END'
> +AC_DEFUN([FOO], [the_answer=42; AC_SUBST([the_answer])])
> +END
> +
> +$ACLOCAL -I m4
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE test
> +
> +# Rename one file at the time.
> +
> +mv m4/foo.m4 m4/bar.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/m4/bar.m4
> +test ! -f $distdir/m4/foo.m4
> +
> +mv m4/macros.m4 m4/defs.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/m4/defs.m4
> +test ! -f $distdir/m4/macros.m4
> +
> +# Rename both files at once.
> +
> +mv m4/bar.m4 m4/quux.m4
> +mv m4/defs.m4 acinclude.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/m4/quux.m4
> +test -f $distdir/acinclude.m4
> +test ! -f $distdir/m4/foo.m4
> +test ! -f $distdir/m4/bar.m4
> +test ! -f $distdir/m4/macros.m4
> +test ! -f $distdir/m4/defs.m4

> --- /dev/null
> +++ b/tests/remake-renamed-m4-macro-and-file.test

> +# Test remake rules when an m4 file gets renamed and *simultaneously*
> +# an m4 macro in it gets renamed.  Kudos to Bruno Haible for thinking
> +# about this situation.
> +
> +. ./defs || Exit 1
> +
> +distdir=$me-1.0
> +
> +cat >> configure.in <<'END'
> +MY_MACRO
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I m4
> +.PHONY: test
> +test:
> +     test '$(the_answer)' = 42
> +END
> +
> +mkdir m4
> +
> +cat > m4/macros.m4 <<'END'
> +AC_DEFUN([MY_MACRO], [FOO_MACRO])
> +END
> +
> +cat > m4/foo.m4 <<'END'
> +AC_DEFUN([FOO_MACRO], [the_answer=42; AC_SUBST([the_answer])])
> +END
> +
> +$ACLOCAL -I m4
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE test
> +
> +# Rename only one file and one macro.
> +
> +$sleep
> +sed -e 's/FOO_MACRO/BAR_MACRO/' m4/foo.m4 > m4/bar.m4
> +rm -f m4/foo.m4
> +sed -e 's/FOO_MACRO/BAR_MACRO/' m4/macros.m4 > t
> +mv -f t m4/macros.m4
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/m4/bar.m4
> +test -f $distdir/m4/macros.m4
> +test ! -f $distdir/m4/foo.m4
> +
> +# Rename both at once.
> +
> +$sleep
> +sed -e 's/BAR_MACRO/QUUX_MACRO/' \
> +  m4/bar.m4 > m4/quux.m4
> +sed -e 's/BAR_MACRO/QUUX_MACRO/' -e 's/MY_MACRO/A_MACRO/' \
> +  m4/macros.m4 > m4/defs.m4
> +rm -f m4/macros.m4 m4/bar.m4
> +sed -e 's/BAR_MACRO/QUUX_MACRO/' -e 's/MY_MACRO/A_MACRO/' configure.in > t
> +mv -f t configure.in
> +using_gmake || $MAKE Makefile
> +$MAKE test
> +$MAKE distdir
> +ls -l $distdir $distdir/*
> +test -f $distdir/m4/quux.m4
> +test -f $distdir/m4/defs.m4
> +test ! -f $distdir/m4/bar.m4
> +test ! -f $distdir/m4/macros.m4

> --- /dev/null
> +++ b/tests/remake-renamed-m4-macro.test

> +# Test remake rules when the name of an m4 macro change.  Try both with
> +# and without indirection.
> +
> +. ./defs || Exit 1
> +
> +cat >> configure.in <<'END'
> +MY_MACRO
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am <<'END'
> +ACLOCAL_AMFLAGS = -I m4
> +.PHONY: test
> +test:
> +     test '$(the_answer)' = 42
> +END
> +
> +mkdir m4
> +
> +cat > m4/macros.m4 <<'END'
> +AC_DEFUN([MY_MACRO], [FOO_1])
> +END
> +
> +cat > m4/foo.m4 <<'END'
> +AC_DEFUN([FOO_1], [the_answer=42
> +                   AC_SUBST([the_answer])])
> +END
> +
> +$ACLOCAL -I m4
> +$AUTOCONF
> +$AUTOMAKE
> +
> +./configure
> +$MAKE test
> +
> +$sleep
> +
> +for x in macros foo; do
> +  sed -e 's/FOO_1/FOO_2/' m4/$x.m4 > t
> +  mv -f t m4/$x.m4
> +done
> +unset x

Why this unset?  It doesn't matter to keep it.  Same below.

> +using_gmake || $MAKE Makefile
> +$MAKE test
> +
> +$sleep
> +
> +for f in m4/macros.m4 configure.in; do
> +  sed -e 's/MY_MACRO/YOUR_MACRO/' $f > t
> +  mv -f t $f
> +done
> +unset f
> +
> +using_gmake || $MAKE Makefile
> +$MAKE test

Thanks again,
Ralf



reply via email to

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