bug-autoconf
[Top][All Lists]
Advanced

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

Re: [PATCH] Dealing with read-only variables


From: Ludovic Courtès
Subject: Re: [PATCH] Dealing with read-only variables
Date: Fri, 4 Jun 2004 15:11:51 +0200
User-agent: Mutt/1.5.4i [Guile enabled]

Hi again,

With the previous patch, read-only variable `as_unused_readonly_var' was
potentially re-used by `config.status' which does not work.

Also, `_AS_LINENO_PREPARE' did not check whether `ENV' was read-only
before unsetting it.

This patch fixes it.  I tested it by adding a "readonly ENV" (or
"readonly ENV=x" for bash) line at the beginning of `configure' and then
letting it run till the end.

Ludovic.

Today, one hour, 23 minutes, 19 seconds ago, Ludovic Courtès wrote:
> Hi,
> 
> Some news regarding the `unset' issue with read-only variables when
> using SGI's /bin/sh on IRIX 6.5 (see below).  According to their manual
> [1], `sh' supports read-only variables through the `readonly' builtin
> command and such variables cannot be unset.  From my experience, trying
> to unset a read-only variable from within a script just makes it stop.
> Also, by default, it seems that the `ENV' variable is read-only.
> 
> So I came up with the following workaround: use the `readonly' or
> `readonly -p' output and grep it in order to known whether a given
> variable is read-only.  Unset it iff it is _not_ read-only (or none of
> `readonly VAR', `readonly' and `readonly -p' works).
> 
> The attached patch applies to `lib/m4sugar/m4sh.m4' (Autoconf 2.59).  I
> did not add an `AS_READONLY_VAR' test to `AS_UNSET' since this is
> probably not useful for variables which are only used from within the
> script.  I tested it with Bash 2.05, Tru64 5.1's /bin/sh, and HP-UX
> 11.11's /bin/sh (couldn't test it with IRIX's /bin/sh though).
> 
> Side note: Bash 2.05 seems to be buggy in that `ENV' does not show up in
> the output of `readonly -p' if one executes `readonly ENV' _after_ it's
> been defined (although `ENV' actually is read-only, ie. `unset ENV'
> complains).  However, `ENV' does show up in the `readonly -p' output if
> it has been defined as `readonly ENV=x'...
> 
> Thanks,
> Ludovic.
> 
> [1] 
> http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=man&fname=/usr/share/catman/u_man/cat1/sh.z&srch=sh
> 
> 2 days, one hour, one minute, 59 seconds ago, 
> Ludovic Courtès wrote:
> > Hi,
> > 
> > I'm forwarding this message here since it may be more relevant to post
> > it here.
> > 
> > Thanks,
> > Ludovic.
> > 
> > -------------------[ Forwarded from Ludovic Courtès ]-------------------
> > 
> > From: Ludovic Courtès <address@hidden>
> > To: address@hidden
> > Date: Fri, 28 May 2004 10:30:45 +0200
> > Subject: `unset ENV' and `AC_CHECK_LIB' on IRIX
> > 
> > Hi,
> > 
> > I got into troubles when running an Autoconf 2.59 generated `configure'
> > script on an IRIX64 6.2 machine.
> > 
> > The first problem I had is that I was unable to run `configure' and
> > `config.status' as is.  Both scripts contain the following line:
> > 
> >   # Work around bugs in pre-3.0 UWIN ksh.
> >   $as_unset ENV MAIL MAILPATH
> > 
> > On IRIX (whose `sh' does support `unset'), this causes the script to
> > abort with the following error message:
> > 
> >   configure[35]: ENV: readonly
> > 
> > (35 being the number of the line where the `unset' occurs).  Is there a
> > way to work around this problem?
> > 
> > 
> > The second problem I had was when checking for function `main' in some
> > libraries, like:
> > 
> >   AC_CHECK_LIB([ACE], [main],
> >            [LIBS="-lACE $LIBS"],
> >                [AC_MSG_ERROR([Could not find libACE.])])
> > 
> > (since there are C++ libraries, I cannot check for actual function name
> > such as `ACE::init ()' since Autoconf would declare it "as is" which
> > won't work).  SGI CC C++ compiler produces an error with a message like:
> > 
> >   function "main" may not be called or have its address taken
> > 
> > Compaq's CXX outputs a similar message except that it only considers it
> > as a warning.  With SGI CC, this causes `configure' to think that the
> > library was not found.  Using `CHECK_LIB' with an empty function name
> > doesn't work.  So, again, what would be the best solution to work around
> > this problem?
> > 
> > Thanks,
> > Ludovic.
> > 
> > 
> > _______________________________________________
> > Autoconf mailing list
> > address@hidden
> > http://mail.gnu.org/mailman/listinfo/autoconf
> > 
> > ----------------------[ End of forwarded message ]----------------------
> > 
> > 

> --- m4sh.m4.orig      Fri Jun  4 10:17:11 2004
> +++ m4sh.m4   Fri Jun  4 13:22:29 2004
> @@ -155,9 +155,19 @@
>  DUALCASE=1; export DUALCASE # for MKS sh
>  
>  _AS_UNSET_PREPARE
> +_AS_READONLY_PREPARE
>  
>  # Work around bugs in pre-3.0 UWIN ksh.
> -$as_unset ENV MAIL MAILPATH
> +for as_var in ENV MAIL MAILPATH
> +do
> +  # Before unsetting a variable, check whether it is read-only.
> +  # Trying to unset a read-only variable with SGI's /bin/sh on IRIX 6.5
> +  # causes the script to stop (and the `ENV' variable typically is
> +  # read-only).
> +  AS_READONLY_VAR([$as_var], [],
> +                  [$as_unset $as_var])
> +done
> +
>  PS1='$ '
>  PS2='> '
>  PS4='+ '
> @@ -289,6 +299,30 @@
>  fi
>  ])
>  
> +# _AS_READONLY_PREPARE
> +# -----------------
> +# Compute $as_readonly depending on whether the `readonly' builtin is
> +# available.
> +m4_defun([_AS_READONLY_PREPARE],
> +[# Check whether `readonly' is available.
> +# Most shells (bash, IRIX's /bin/sh, HP-UX 11.11's /bin/sh) have
> +# `readonly -p' list all read-only variables; however, Tru64's /bin/sh
> +# does not support `-p'.  Fortunately, most shells (each one of the
> +# above shells, although I couldn't check on IRIX) also list all
> +# readonly variables when no argument is passed to `readonly'.
> +as_unused_readonly_var=something ; export as_unused_readonly_var
> +if readonly as_unused_readonly_var >/dev/null 2>&1 ; then
> +  if readonly | grep "as_unused_readonly_var=" >/dev/null 2>&1; then
> +    as_readonly=readonly
> +  elif readonly -p | grep "as_unused_readonly_var=" >/dev/null 2>&1; then
> +    as_readonly="readonly -p"
> +  else
> +    as_readonly=true
> +  fi
> +else
> +  as_readonly=true
> +fi
> +])
>  
>  # AS_UNSET(VAR, [VALUE-IF-UNSET-NOT-SUPPORTED = `'])
>  # --------------------------------------------------
> @@ -298,6 +332,24 @@
>  [AS_REQUIRE([_AS_UNSET_PREPARE])dnl
>  $as_unset $1 || test "${$1+set}" != set || { $1=$2; export $1; }])
>  
> +# AS_READONLY_VAR(VAR, ACTION-IF-READONLY, ACTION-IF-READWRITE)
> +# -------------------------------------------------------------
> +# If read-only variables are supported, check whether VAR is readonly and
> +# execute ACTION-IF-READONLY if it is, ACTION-IF-READWRITE otherwise.
> +# Both Tru64's /bin/sh and GNU bash `readonly' builtins list the read-only
> +# variables when no argument is given.  However, IRIX's /bin/sh manual
> +# does not mention whether if behaves the same way (`readonly -p' does
> +# list read-only variables though).
> +m4_defun([AS_READONLY_VAR],
> +[AS_REQUIRE([_AS_READONLY_PREPARE])dnl
> +if $as_readonly | grep "$1=" >/dev/null 2>&1 ; then
> +   :
> +   $2
> +else
> +   :
> +   $3
> +fi
> +])
>  
>  
>  

Attachment: m4sh.m4.unset.diff
Description: Text document


reply via email to

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