automake-patches
[Top][All Lists]
Advanced

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

Re: [PATCH] Modernize, improve and/or extend tests `colon*.test.


From: Stefano Lattarini
Subject: Re: [PATCH] Modernize, improve and/or extend tests `colon*.test.
Date: Fri, 18 Jun 2010 13:25:20 +0200
User-agent: KMail/1.12.1 (Linux/2.6.30-2-686; KDE/4.3.4; i686; ; )

At Thursday 17 June 2010, Ralf Wildenhues wrote:
> * Stefano Lattarini wrote on Sat, Jun 12, 2010 at 11:48:15PM CEST:
> > Another patch tweaking scripts in the testsuite.
> 
> Thanks, most of this is uncontroversial, but a couple of things I
>  don't understand:
> > --- a/tests/colon3.test
> > +++ b/tests/colon3.test
> > [CUT]
> > -
> > -# Makefile should depend on two.in.
> > -echo Grep2
> > -grep '^Makefile:.* \$(srcdir)/two.in' zardoz.in
> > -# Likewise three.in.
> > -echo Grep3
> > -grep '^Makefile:.* \$(srcdir)/three.in' zardoz.in
> > +$PERL -ne '
> > +  s/\bzardoz\.(in|am)\b/zrdz.$1/g;
> > +  print if /zardoz/;
> > +' <zardoz.in >out
> > +test ! -s out || { cat out; Exit 1; }
> 
> Your changes seem to have valued efficiency so far.  But calling
> perl is bound to be more expensive than a couple of greps.
Yes, but it's blazingly fast if compared with an aclocal/automake 
call.

In fact:

 $ time for i in 1 2 3 4; do sh ./colon3.test >/dev/null 2>&1; done
 real    0m9.366s
 user    0m6.656s
 sys     0m1.952s
 $ sed 's/^\$AUTOMAKE$/&; exit/' colon3.test >foo.test
 $ time for i in 1 2 3 4; do sh ./foo.test >/dev/null 2>&1; done
 real    0m8.975s
 user    0m6.660s
 sys     0m1.888s

And with colon3.test modified by the attached amended patch:

 $ time for i in 1 2 3 4; do sh ./colon3.test >/dev/null 2>&1; done
 real    0m9.302s
 user    0m6.656s
 sys     0m1.924s
 $ sed 's/^\$AUTOMAKE$/&; exit/' colon3.test >foo.test
 $ time for i in 1 2 3 4; do sh ./foo.test >/dev/null 2>&1; done
 real    0m8.831s
 user    0m6.608s
 sys     0m1.904s

> The change looks good to me, how come you went this way though?
> Just curious.
Because writing that perl script was waaay simpler than cooking up a 
sed script or a sed/grep pipeline doing the same thing portably.  
And even if that perl script isn't much efficient, it is very simple to
understand IMO.
Maybe you can think of a *simple* way to do that which doesn't involve 
perl?  Just curious (no pun intended :-)

> 
> > +# Makefile should depend on two.in and three.in.
> > +grep '^Makefile:.* \$(srcdir)/two\.in' zardoz.in
> > +grep '^Makefile:.* \$(srcdir)/three\.in' zardoz.in
> 
> FYI, such greps can break in the future, if the dependency lines
>  happen to be line-wrapped.  Yes, this has been there before.
Thanks for pointing this out.  I modified the test so that the perl 
script takes care of line wrapping too.

> 
> > --- a/tests/colon5.test
> > +++ b/tests/colon5.test
> > [CUT]
> >
> > +cat > Makefile.am <<'END'
> > +.PHONY: test
> > +test:
> > +   case ' $(DIST_COMMON) ' in \
> > +     *' $(srcdir)/Makefile.dep '*) exit 0;; \
> 
> Hmm.  The variable might just as validly list Makefile.dep, without
> preceding `$(srcdir)/'.  That is really necessary only if the file
>  is listed both as a prerequisite and as a target somewhere in the
>  makefile.
But why should we relax this test if it's working correctly?  After 
all, Automake is expected to have full control in the generation of 
the autotools-related rebuild rules, right?  And we can relax the test 
in the future if the necessity arises.
For the moment, I haven't changed this fragment.  Obviously, you are
free to amend it yourself if you still think it's too strict.

> > +
> > +sed '/@SET_MAKE@/d' <Makefile.in >Makefile.sed
> > +$MAKE -f Makefile.sed SHELL=$SHELL test
> 
> I see this idiom is used a couple of times in the testsuite.  How
>  come?
NOTE: the following is just my opinion...  Absolutely no warranty :-)
>  Because running ./configure is a bit more expensive than sed?
Yes, in part (and sometimes it is indeed *much* more expensive).  And 
also because, if one wants to run just a small subset of the Makefile's
rules, or to check just a small subset of its variables, he doesn't 
need all the prerequisites ./configure would look for (erroring out if 
it fails to find any of them).  For example, the older versions of
'ansi.test' seemed to use the "sed hack" to do this.

For the record, if I run the colon5.test in its present "sed hack"
form, I get:
  $ time for i in {1..10}; do ./colon5.test; done
  real    0m24.281s
  user    0m16.965s
  sys     0m4.604s
while if I modify it to run also autoconf and configure:
  $ time for i in {1..10}; do ./colon5.test; done
  real    0m39.141s
  user    0m23.913s
  sys     0m9.525s 

Regards,
    Stefano
From 34d0f933468b10233ba14819028bddea62d9743e Mon Sep 17 00:00:00 2001
From: Stefano Lattarini <address@hidden>
Date: Fri, 18 Jun 2010 12:12:54 +0200
Subject: [PATCH] Modernize, improve and/or extend tests `colon*.test.

* tests/colon.test: Rely on the `configure.in' stub created by
`./defs', rather than writing one from scratch.  Do not create
a useless dummy file.
* tests/colon4.test: Enable the `errexit' shell flag, and
related changes.  Also, rely on the `configure.in' stub created
by `./defs', rather than writing one from scratch.
* tests/colon7.test: Enable `errexit' shell flag, and related
changes.  Also, improve the generated `configure.in' file.
* tests/colon2.test: Likewise.  Also, add some new checks.
* tests/colon5.test: Improve the generated `configure.in' file.
Add new, much deeper checks.
* tests/colon6.test: Likewise.
* tests/colon3.test: Improve the generated `configure.in' file.
Prefer perl over pipelined grep.  Made stricter.  Other changes,
cosmetic and not.
---
 ChangeLog         |   19 +++++++++++++++++++
 tests/colon.test  |    8 +++-----
 tests/colon2.test |   26 ++++++++++++++++----------
 tests/colon3.test |   44 ++++++++++++++++++++++++--------------------
 tests/colon4.test |   16 +++++++++-------
 tests/colon5.test |   27 +++++++++++++++++++++------
 tests/colon6.test |   27 ++++++++++++++++++++++-----
 tests/colon7.test |   15 +++++++++------
 8 files changed, 123 insertions(+), 59 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c4e69a5..2e3a8d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2010-06-18  Stefano Lattarini  <address@hidden>
+
+       Modernize, improve and/or extend tests `colon*.test.
+       * tests/colon.test: Rely on the `configure.in' stub created by
+       `./defs', rather than writing one from scratch.  Do not create
+       a useless dummy file.
+       * tests/colon4.test: Enable the `errexit' shell flag, and
+       related changes.  Also, rely on the `configure.in' stub created
+       by `./defs', rather than writing one from scratch.
+       * tests/colon7.test: Enable `errexit' shell flag, and related
+       changes.  Also, improve the generated `configure.in' file.
+       * tests/colon2.test: Likewise.  Also, add some new checks.
+       * tests/colon5.test: Improve the generated `configure.in' file.
+       Add new, much deeper checks.
+       * tests/colon6.test: Likewise.
+       * tests/colon3.test: Improve the generated `configure.in' file.
+       Prefer perl over pipelined grep.  Made stricter.  Other changes,
+       cosmetic and not.
+
 2010-06-12  Ralf Wildenhues  <address@hidden>
 
        Remove a couple of unneeded conditionals from tests.
diff --git a/tests/colon.test b/tests/colon.test
index da7a9da..269e6b8 100755
--- a/tests/colon.test
+++ b/tests/colon.test
@@ -22,15 +22,13 @@
 
 set -e
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(Makefile foo.h:foo.hin)
+cat >> configure.in <<END
+AC_CONFIG_FILES([foo.h:foo.hin])
+AC_OUTPUT
 END
 
 : > Makefile.am
 : > foo.hin
-: > stamp-h.in
 
 $ACLOCAL
 $AUTOMAKE
diff --git a/tests/colon2.test b/tests/colon2.test
index ebb2bfe..a52dfa8 100755
--- a/tests/colon2.test
+++ b/tests/colon2.test
@@ -1,5 +1,6 @@
 #! /bin/sh
-# Copyright (C) 1996, 2000, 2001, 2002  Free Software Foundation, Inc.
+# Copyright (C) 1996, 2000, 2001, 2002, 2010 Free Software Foundation,
+# Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,18 +19,23 @@
 
 . ./defs || Exit 1
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(Makefile:zardoz.in)
+set -e
+
+cat > configure.in <<END
+AC_INIT([$me], [1.0])
+AM_INIT_AUTOMAKE
+AC_CONFIG_FILES([Makefile:zardoz.in])
+AC_OUTPUT
 END
 
-: > zardoz.am
+echo 'dummy:' > zardoz.am
 
-$ACLOCAL || Exit 1
-$AUTOMAKE || Exit 1
+$ACLOCAL
+$AUTOMAKE
 
 # We actually check several things here.
-test -f zardoz.in || Exit 1
+test -f zardoz.in
 grep '^zardoz:' zardoz.in && Exit 1
-Exit 0
+grep '^dummy:' zardoz.in
+
+:
diff --git a/tests/colon3.test b/tests/colon3.test
index 6fed8b9..05b0694 100755
--- a/tests/colon3.test
+++ b/tests/colon3.test
@@ -1,6 +1,6 @@
 #! /bin/sh
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003
-#   Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2010 Free Software
+# Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,10 +22,11 @@
 
 set -e
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(Makefile:zardoz.in:two.in:three.in)
+cat > configure.in <<END
+AC_INIT([$me], [1.0])
+AM_INIT_AUTOMAKE
+AC_CONFIG_FILES([Makefile:zardoz.in:two.in:three.in])
+AC_OUTPUT
 END
 
 : > zardoz.am
@@ -35,21 +36,24 @@ END
 $ACLOCAL
 $AUTOMAKE
 
-# We actually check several things here.
 # Automake should have created zardoz.in.
 test -f zardoz.in
 
 # The generated file should refer to zardoz.in and zardoz.am, but
-# never just "zardoz".
-echo Grep1
-grep zardoz zardoz.in | $FGREP -v 'zardoz.in' | $FGREP -v 'zardoz.am' > O || :
-# We cat the output file so we see in when verbose.
-cat O
-test -z "`cat O`"
-
-# Makefile should depend on two.in.
-echo Grep2
-grep '^Makefile:.* \$(srcdir)/two.in' zardoz.in
-# Likewise three.in.
-echo Grep3
-grep '^Makefile:.* \$(srcdir)/three.in' zardoz.in
+# never just "zardoz".  Also, Makefile should depend on two.in and
+# three.in.
+$PERL -npe '
+  # Take line wrapping into account.
+  while(s/\\\n//)
+  {
+    my $x = <>;
+    $x =~ s/^\s*//;
+    $_ .= $x;
+  }
+  s/\bzardoz\.(in|am)\b/zrdz.$1/g;
+' <zardoz.in >out
+$FGREP zardoz out && Exit 1
+grep '^Makefile:.* \$(srcdir)/two\.in' out
+grep '^Makefile:.* \$(srcdir)/three\.in' out
+
+:
diff --git a/tests/colon4.test b/tests/colon4.test
index cec3c86..97a4479 100755
--- a/tests/colon4.test
+++ b/tests/colon4.test
@@ -1,5 +1,6 @@
 #! /bin/sh
-# Copyright (C) 1998, 2000, 2001, 2002  Free Software Foundation, Inc.
+# Copyright (C) 1998, 2000, 2001, 2002, 2010 Free Software Foundation,
+# Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,10 +21,11 @@
 
 . ./defs || Exit 1
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(Makefile zardoz:one:two:three)
+set -e
+
+cat >> configure.in <<END
+AC_CONFIG_FILES([zardoz:two:three])
+AC_OUTPUT
 END
 
 : > Makefile.am
@@ -31,8 +33,8 @@ END
 : > two
 : > three
 
-$ACLOCAL || Exit 1
-$AUTOMAKE || Exit 1
+$ACLOCAL
+$AUTOMAKE
 
 # The rule should regenerate the file "zardoz".
 grep '^zardoz:one:two' Makefile.in && Exit 1
diff --git a/tests/colon5.test b/tests/colon5.test
index fe97f99..26f10e4 100755
--- a/tests/colon5.test
+++ b/tests/colon5.test
@@ -21,16 +21,31 @@
 
 set -e
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(Makefile:Makefile.in:Makefile.dep)
+cat > configure.in <<END
+AC_INIT([$me], [1.0])
+AM_INIT_AUTOMAKE
+AC_CONFIG_FILES([Makefile:Makefile.in:Makefile.dep])
+AC_OUTPUT
 END
 
-: > Makefile.am
 : > Makefile.dep
 
+cat > Makefile.am <<'END'
+.PHONY: test
+test:
+       case ' $(DIST_COMMON) ' in \
+         *' $(srcdir)/Makefile.dep '*) exit 0;; \
+         *) exit 1;; \
+       esac
+END
+
 $ACLOCAL
 $AUTOMAKE
 
-grep 'Makefile:Makefile.in' Makefile.in
+grep 'Makefile:Makefile\.in' Makefile.in
+grep '^Makefile:.* \$(srcdir)/Makefile\.dep' Makefile.in
+
+sed '/@SET_MAKE@/d' <Makefile.in >Makefile.sed
+$MAKE -f Makefile.sed SHELL=$SHELL test
+
+:
diff --git a/tests/colon6.test b/tests/colon6.test
index 99877c5..4fb738e 100755
--- a/tests/colon6.test
+++ b/tests/colon6.test
@@ -21,16 +21,33 @@
 
 set -e
 
-cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
-AC_OUTPUT(demo/Makefile demo/version.good:demo/version.gin)
+cat > configure.in <<END
+AC_INIT([$me], [1.0])
+AM_INIT_AUTOMAKE
+AC_CONFIG_FILES([demo/Makefile demo/version.good:demo/version.gin])
+AC_OUTPUT
 END
 
 mkdir demo
 
-: > demo/Makefile.am
 : > demo/version.gin
 
+cat > demo/Makefile.am <<'END'
+.PHONY: test
+test:
+       case ' $(DIST_COMMON) ' in \
+         *' $(srcdir)/version.gin '*) exit 0;; \
+         *) exit 1;; \
+       esac
+END
+
 $ACLOCAL
 $AUTOMAKE
+
+$EGREP 'Makefile:.*(demo|version)' demo/Makefile.in && Exit 1
+grep 'version\.good:.*version\.gin' demo/Makefile.in
+
+sed '/@SET_MAKE@/d' <demo/Makefile.in >Makefile.sed
+$MAKE -f Makefile.sed SHELL=$SHELL test
+
+:
diff --git a/tests/colon7.test b/tests/colon7.test
index 4df6a13..9c6f1a6 100755
--- a/tests/colon7.test
+++ b/tests/colon7.test
@@ -1,5 +1,6 @@
 #! /bin/sh
-# Copyright (C) 1998, 2000, 2001, 2002  Free Software Foundation, Inc.
+# Copyright (C) 1998, 2000, 2001, 2002, 2010 Free Software Foundation,
+# Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,9 +20,11 @@
 
 . ./defs || Exit 1
 
+set -e
+
 cat > configure.in << 'END'
-AC_INIT
-AM_INIT_AUTOMAKE(nonesuch, nonesuch)
+AC_INIT([colon7], [1.0])
+AM_INIT_AUTOMAKE
 AC_OUTPUT(subdir/bar:subdir/foo \
    Makefile \
    subdir/Makefile
@@ -34,8 +37,8 @@ mkdir subdir
 : > subdir/Makefile.am
 : > subdir/foo
 
-$ACLOCAL || Exit 1
-$AUTOMAKE || Exit 1
+$ACLOCAL
+$AUTOMAKE
 
 # shouldn't have any bar.in
 grep 'bar.in' subdir/Makefile.in && Exit 1
@@ -43,4 +46,4 @@ grep 'bar.in' subdir/Makefile.in && Exit 1
 # DIST_COMMON should have foo, not subdir/foo
 grep 'DIST_COMMON.*subdir/foo' subdir/Makefile.in && Exit 1
 
-Exit 0
+:
-- 
1.6.5


reply via email to

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