Re: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
On 05/11/2014 02:48 PM, Paul Eggert wrote: Following up to the grep snapshot announcement in: http://lists.gnu.org/archive/html/platform-testers/2014-05/msg0.html That snapshot failed to build the shell scripts egrep and fgrep properly on Solaris 10, because it set SHELL = /bin/sh in src/Makefile, which caused the makefile to put #!/bin/sh at the top of the shell scripts, which breaks because the shell scripts use a construct '${0%/*}' that Solaris 10 /bin/sh doesn't grok. The build should have used SHELL = /bin/bash, which is what grep does with my test builds. In autoconf.git, there are zero hits for: git grep -F '0%/*' However, in grep.git, there is: src/egrep.sh:if test -x ${0%/*}/@grep@; then src/egrep.sh: PATH=${0%/*}:$PATH The culprit is grep itself, not autoconf. -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature
Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
On Sun, May 11, 2014 at 1:48 PM, Paul Eggert egg...@cs.ucla.edu wrote: Following up to the grep snapshot announcement in: http://lists.gnu.org/archive/html/platform-testers/2014-05/msg0.html That snapshot failed to build the shell scripts egrep and fgrep properly on Solaris 10, because it set SHELL = /bin/sh in src/Makefile, which caused the makefile to put #!/bin/sh at the top of the shell scripts, which breaks because the shell scripts use a construct '${0%/*}' that Solaris 10 /bin/sh doesn't grok. The build should have used SHELL = /bin/bash, which is what grep does with my test builds. We could work around the problem by avoiding that shell construct, but I'd rather fix the build machinery because this bug could affect any package that uses POSIX shell scripts. The snapshot was built with an experimental version of Autoconf (2.69.117-1717), whereas I had tested with the latest stable version (2.69 as shipped with Fedora 20). The two versions differ in how they compute the name of a working shell, so it appears that there's a bug in the experimental version of Autoconf. A quick workaround for grep is to build the next snapshot with Autoconf 2.69. In the long run, though, we should fix the Autoconf bug. I'll CC: this to bug-autoconf to give them a heads-up. Hi Paul, Thanks for reporting that. I would like our egrep and fgrep scripts to work even on systems with a non-POSIX shell and no bash to fall back on. Our tests/init.sh code tries hard to find a sufficiently functional shell (including a test for the ${VAR%GLOB} construct), and making it work in spite of Solaris's /bin/sh was tricky, and we had to be willing to give up and skip tests altogether, in the event that no sufficiently featureful shell is found. Here, we don't have that luxury. Ideally, these wrapper shell scripts would not have to fork an extra process to perform this trivial string manipulation, but I can live with the extra overhead, expecially for scripts like these that merely provide support for obsolescent-named programs. I think the attach patch is sufficiently portable to do what I want. Does anyone see a way to make it more efficient with a POSIX shell? 0001-egrep-fgrep-make-wrappers-portable-to-non-POSIX-shel.patch Description: Binary data
Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
On Sun, May 11, 2014 at 1:48 PM, Paul Eggert egg...@cs.ucla.edu wrote: Following up to the grep snapshot announcement in: http://lists.gnu.org/archive/html/platform-testers/2014-05/msg0.html That snapshot failed to build the shell scripts egrep and fgrep properly on Solaris 10, because it set SHELL = /bin/sh in src/Makefile, which caused the makefile to put #!/bin/sh at the top of the shell scripts, which breaks because the shell scripts use a construct '${0%/*}' that Solaris 10 /bin/sh doesn't grok. The build should have used SHELL = /bin/bash, which is what grep does with my test builds. We could work around the problem by avoiding that shell construct, but I'd rather fix the build machinery because this bug could affect any package that uses POSIX shell scripts. The snapshot was built with an experimental version of Autoconf (2.69.117-1717), whereas I had tested with the latest stable version (2.69 as shipped with Fedora 20). The two versions differ in how they compute the name of a working shell, so it appears that there's a bug in the experimental version of Autoconf. A quick workaround for grep is to build the next snapshot with Autoconf 2.69. In the long run, though, we should fix the Autoconf bug. I'll CC: this to bug-autoconf to give them a heads-up. Hi Paul, Thanks for reporting that. I would like our egrep and fgrep scripts to work even on systems with an old shell and no bash to fall back on. Our tests/init.sh code tries hard to find a sufficiently functional shell (including a test for the ${VAR%GLOB} construct), and making it work in spite of Solaris's /bin/sh was tricky... plus, we had to be willing to give up and skip tests altogether, in the event that no sufficiently functional shell is found. Here, we don't have that luxury. Ideally, these wrapper shell scripts would not have to fork an extra process to perform this trivial string manipulation, but I can live with the extra overhead, especially for scripts like these that merely provide support for obsolescent programs. I think the attached patch is sufficiently portable to work everywhere. Does anyone see a (simple+clean) way to make it more efficient for the common case in which @SHELL@ is a more functional shell?
Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
On 2014-05-12 10:33 -0700, Jim Meyering wrote: [...] I think the attach patch is sufficiently portable to do what I want. Does anyone see a way to make it more efficient with a POSIX shell? From e2a305bff2be376f6dd29e52a1d32636e0c22706 Mon Sep 17 00:00:00 2001 From: Jim Meyering meyer...@fb.com Date: Mon, 12 May 2014 10:33:09 -0700 Subject: [PATCH] egrep, fgrep: make wrappers portable to non-POSIX shells * src/egrep.sh (grep): Use sed in a subshell in place of the POSIX sh construct, ${0%/*}. The latter is not portable to Solaris 10. Reported by Paul Eggert in http://debbugs.gnu.org/17471 --- src/egrep.sh | 7 --- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/egrep.sh b/src/egrep.sh index f1b4146..0a374aa 100644 --- a/src/egrep.sh +++ b/src/egrep.sh @@ -2,9 +2,10 @@ grep=grep case $0 in */*) -if test -x ${0%/*}/@grep@; then - PATH=${0%/*}:$PATH - grep=@grep@ +dirname=`echo $0|sed 's,//*[^/]*$,,'` I'd write dirname=`expr x$0 : x'\(.*\)/'` but mainly for style reasons... +if test -x $dirname/'@grep@'; then + PATH=$dirname:$PATH + grep='@grep@' fi;; esac exec $grep @option@ $@ Cheers, -- Nick Bowler, Elliptic Technologies (http://www.elliptictech.com/)
Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
On 05/12/2014 10:33 AM, Jim Meyering wrote: Does anyone see a way to make it more efficient with a POSIX shell? Yes. Eric's earlier message convinced me that grep shouldn't rely on Autoconf guaranteeing a shell that supports substrings in parameter expansion, so I came up with the attached patch (which keeps the shell efficient with a POSIX shell) and pushed it before I got around to reading your message. I tested on Solaris 10 with the shell artificially set to /bin/sh, so I'm marking this as done. From an Autoconf point of view it might be nice to have a good way to say I need a POSIX shell or at least I need a shell that does substrings, but that's merely a wishlist item. From 0ca1f6d79514189ef8db6e931f285cbaec9789ec Mon Sep 17 00:00:00 2001 From: Paul Eggert egg...@cs.ucla.edu Date: Mon, 12 May 2014 11:38:28 -0700 Subject: [PATCH] egrep, fgrep: port to Solaris 10 /bin/sh This old shell doesn't grok ${0%/*}; see: http://bugs.gnu.org/17471 * src/Makefile.am (egrep fgrep): Don't assume the shell does substrings. * src/egrep.sh (dir): New var, so that the substring calculation is done only once (which is a small win even with newer shells), and so that the calculation is easier to edit on older shells. --- src/Makefile.am | 7 +++ src/egrep.sh| 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index f8c9415..e2c82a4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,7 +47,14 @@ EXTRA_DIST = dosbuf.c egrep.sh egrep fgrep: egrep.sh Makefile $(AM_V_GEN)grep=`echo grep | sed -e '$(transform)'` \ case $@ in egrep) option=-E;; fgrep) option=-F;; esac \ + shell_does_substrings='set x/y d=$${1%/*} test $$d = x' \ + if $(SHELL) -c $$shell_does_substrings 2/dev/null; then \ + edit_substring='s,X,X,'; \ + else \ + edit_substring='s,\$${0%/\*},`expr X$$0 : '\''X\\(.*\\)/'\''`,g'; \ + fi \ sed -e 's|[@]SHELL@|$(SHELL)|g' \ + -e $$edit_substring \ -e s|[@]grep@|$$grep|g \ -e s|[@]option@|$$option|g $(srcdir)/egrep.sh $@-t $(AM_V_at)chmod +x $@-t diff --git a/src/egrep.sh b/src/egrep.sh index f1b4146..1a03d2a 100644 --- a/src/egrep.sh +++ b/src/egrep.sh @@ -2,8 +2,9 @@ grep=grep case $0 in */*) -if test -x ${0%/*}/@grep@; then - PATH=${0%/*}:$PATH +dir=${0%/*} +if test -x $dir/@grep@; then + PATH=$dir:$PATH grep=@grep@ fi;; esac -- 1.9.0
Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug
Thanks for dealing with that. The only potential problem I see with your patch would be when one runs configure with a perverse program name transformation, e.g., --program-transform-name='s/^/$/', introducing a shell metacharacter (or leading/trailing white space!) in the resulting name. In that case, the lack of single quotes around @grep@ would be fatal. Fixing that is not high priority. Anyone who does that to grep deserves the result :-)