diff mbox

config-ml.in: Robustify ac_configure_args parsing.

Message ID 87fvmlkosq.fsf@schwinge.name
State New
Headers show

Commit Message

Thomas Schwinge March 14, 2014, 11:22 a.m. UTC
Hi!

    $ ../configure --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'
    [...]
    $ make configure-zlib
    config.status: creating Makefile
    config.status: executing default-1 commands
    ../../zlib/../config-ml.in: eval: line 142: unexpected EOF while looking for matching `''
    ../../zlib/../config-ml.in: eval: line 143: syntax error: unexpected end of file
    make: *** [configure-zlib] Error 1

       140          case $enableopt in
       141          enable_shared | enable_static) ;;
       142          *) eval $enableopt="$optarg" ;;
       143          esac
       144          ;;

    $ grep ac_configure_args < zlib/config.status
    ac_configure_args="  '--cache-file=./config.cache' '--enable-foo=--enable-a=1 --enable-b=2 --enable-c=3' '--enable-languages=c,c++,fortran,java,lto,objc' '--program-transform-name=s,y,y,' '--disable-option-checking' '--build=x86_64-unknown-linux-gnu' '--host=x86_64-unknown-linux-gnu' '--target=x86_64-unknown-linux-gnu' '--srcdir=../../zlib' 'build_alias=x86_64-unknown-linux-gnu' 'host_alias=x86_64-unknown-linux-gnu' 'target_alias=x86_64-unknown-linux-gnu'"

These are quoted correctly; the error happens because the
ac_configure_args parsing logic in config-ml.in will parse this as:

 1. '--enable-foo=--enable-a=1
 2. --enable-b=2
 3. --enable-c=3'

Below I'm proposing a patch using a shell function and eval to properly
handle such configure arguments.  Instead of a shell function, we could
also use:

    eval set x "${ac_configure_args}" && shift
    for option
    do
      [...]
    done

..., as done in top-level configure.ac for baseargs etc., but as the
config-ml.in script is sourced in different contexts, it is not obvious
to me that we're permitted to overwrite the shell's positional parameters
here.

OK for trunk?  (Will properly indent scan_arguments before commit.)

commit bc6f99e9840994309eaf4e88679c3ba50d5e4918
Author: Thomas Schwinge <thomas@codesourcery.com>
Date:   Thu Mar 13 19:54:58 2014 +0100

    	* config-ml.in: Robustify ac_configure_args parsing.



Grüße,
 Thomas

Comments

Thomas Schwinge May 22, 2014, 10:58 a.m. UTC | #1
Hi!

Ping.


On Fri, 14 Mar 2014 12:22:29 +0100, I wrote:
>     $ ../configure --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'
>     [...]
>     $ make configure-zlib
>     config.status: creating Makefile
>     config.status: executing default-1 commands
>     ../../zlib/../config-ml.in: eval: line 142: unexpected EOF while looking for matching `''
>     ../../zlib/../config-ml.in: eval: line 143: syntax error: unexpected end of file
>     make: *** [configure-zlib] Error 1
> 
>        140          case $enableopt in
>        141          enable_shared | enable_static) ;;
>        142          *) eval $enableopt="$optarg" ;;
>        143          esac
>        144          ;;
> 
>     $ grep ac_configure_args < zlib/config.status
>     ac_configure_args="  '--cache-file=./config.cache' '--enable-foo=--enable-a=1 --enable-b=2 --enable-c=3' '--enable-languages=c,c++,fortran,java,lto,objc' '--program-transform-name=s,y,y,' '--disable-option-checking' '--build=x86_64-unknown-linux-gnu' '--host=x86_64-unknown-linux-gnu' '--target=x86_64-unknown-linux-gnu' '--srcdir=../../zlib' 'build_alias=x86_64-unknown-linux-gnu' 'host_alias=x86_64-unknown-linux-gnu' 'target_alias=x86_64-unknown-linux-gnu'"
> 
> These are quoted correctly; the error happens because the
> ac_configure_args parsing logic in config-ml.in will parse this as:
> 
>  1. '--enable-foo=--enable-a=1
>  2. --enable-b=2
>  3. --enable-c=3'
> 
> Below I'm proposing a patch using a shell function and eval to properly
> handle such configure arguments.  Instead of a shell function, we could
> also use:
> 
>     eval set x "${ac_configure_args}" && shift
>     for option
>     do
>       [...]
>     done
> 
> ..., as done in top-level configure.ac for baseargs etc., but as the
> config-ml.in script is sourced in different contexts, it is not obvious
> to me that we're permitted to overwrite the shell's positional parameters
> here.
> 
> OK for trunk?  (Will properly indent scan_arguments before commit.)
> 
> commit bc6f99e9840994309eaf4e88679c3ba50d5e4918
> Author: Thomas Schwinge <thomas@codesourcery.com>
> Date:   Thu Mar 13 19:54:58 2014 +0100
> 
>     	* config-ml.in: Robustify ac_configure_args parsing.
> 
> diff --git config-ml.in config-ml.in
> index 1198346..0cd7db3 100644
> --- config-ml.in
> +++ config-ml.in
> @@ -105,10 +105,13 @@ ml_realsrcdir=${srcdir}
>  
>  # Scan all the arguments and set all the ones we need.
>  
> +scan_arguments ()
> +{
>  ml_verbose=--verbose
> -for option in ${ac_configure_args}
> +for option
>  do
> -  # strip single quotes surrounding individual options
> +  # Strip single quotes surrounding individual options, that is, remove one
> +  # level of shell quoting for these.
>    case $option in
>    \'*\') eval option=$option ;;
>    esac
> @@ -139,7 +142,7 @@ do
>  	# Don't undo its work.
>  	case $enableopt in
>  	enable_shared | enable_static) ;;
> -	*) eval $enableopt="$optarg" ;;
> +	*) eval $enableopt='$optarg' ;;
>  	esac
>  	;;
>    --norecursion | --no-recursion)
> @@ -157,7 +160,7 @@ do
>  	*)	optarg=yes ;;
>  	esac
>  	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
> -	eval $withopt="$optarg"
> +	eval $withopt='$optarg'
>  	;;
>    --without-*)
>  	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
> @@ -165,6 +168,11 @@ do
>  	;;
>    esac
>  done
> +}
> +# Use eval to properly handle configure arguments such as
> +# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
> +eval scan_arguments "${ac_configure_args}"
> +unset scan_arguments
>  
>  # Only do this if --enable-multilib.
>  if [ "${enable_multilib}" = yes ]; then
> @@ -860,7 +868,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
>  
>      if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
>  	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
> -	${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then
> +	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
>        true
>      else
>        exit 1


Grüße,
 Thomas
Thomas Schwinge June 3, 2014, 9:57 a.m. UTC | #2
Hi!

Ping.


On Thu, 22 May 2014 12:58:05 +0200, I wrote:
> Ping.
> 
> 
> On Fri, 14 Mar 2014 12:22:29 +0100, I wrote:
> >     $ ../configure --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'
> >     [...]
> >     $ make configure-zlib
> >     config.status: creating Makefile
> >     config.status: executing default-1 commands
> >     ../../zlib/../config-ml.in: eval: line 142: unexpected EOF while looking for matching `''
> >     ../../zlib/../config-ml.in: eval: line 143: syntax error: unexpected end of file
> >     make: *** [configure-zlib] Error 1
> > 
> >        140          case $enableopt in
> >        141          enable_shared | enable_static) ;;
> >        142          *) eval $enableopt="$optarg" ;;
> >        143          esac
> >        144          ;;
> > 
> >     $ grep ac_configure_args < zlib/config.status
> >     ac_configure_args="  '--cache-file=./config.cache' '--enable-foo=--enable-a=1 --enable-b=2 --enable-c=3' '--enable-languages=c,c++,fortran,java,lto,objc' '--program-transform-name=s,y,y,' '--disable-option-checking' '--build=x86_64-unknown-linux-gnu' '--host=x86_64-unknown-linux-gnu' '--target=x86_64-unknown-linux-gnu' '--srcdir=../../zlib' 'build_alias=x86_64-unknown-linux-gnu' 'host_alias=x86_64-unknown-linux-gnu' 'target_alias=x86_64-unknown-linux-gnu'"
> > 
> > These are quoted correctly; the error happens because the
> > ac_configure_args parsing logic in config-ml.in will parse this as:
> > 
> >  1. '--enable-foo=--enable-a=1
> >  2. --enable-b=2
> >  3. --enable-c=3'
> > 
> > Below I'm proposing a patch using a shell function and eval to properly
> > handle such configure arguments.  Instead of a shell function, we could
> > also use:
> > 
> >     eval set x "${ac_configure_args}" && shift
> >     for option
> >     do
> >       [...]
> >     done
> > 
> > ..., as done in top-level configure.ac for baseargs etc., but as the
> > config-ml.in script is sourced in different contexts, it is not obvious
> > to me that we're permitted to overwrite the shell's positional parameters
> > here.
> > 
> > OK for trunk?  (Will properly indent scan_arguments before commit.)
> > 
> > commit bc6f99e9840994309eaf4e88679c3ba50d5e4918
> > Author: Thomas Schwinge <thomas@codesourcery.com>
> > Date:   Thu Mar 13 19:54:58 2014 +0100
> > 
> >     	* config-ml.in: Robustify ac_configure_args parsing.
> > 
> > diff --git config-ml.in config-ml.in
> > index 1198346..0cd7db3 100644
> > --- config-ml.in
> > +++ config-ml.in
> > @@ -105,10 +105,13 @@ ml_realsrcdir=${srcdir}
> >  
> >  # Scan all the arguments and set all the ones we need.
> >  
> > +scan_arguments ()
> > +{
> >  ml_verbose=--verbose
> > -for option in ${ac_configure_args}
> > +for option
> >  do
> > -  # strip single quotes surrounding individual options
> > +  # Strip single quotes surrounding individual options, that is, remove one
> > +  # level of shell quoting for these.
> >    case $option in
> >    \'*\') eval option=$option ;;
> >    esac
> > @@ -139,7 +142,7 @@ do
> >  	# Don't undo its work.
> >  	case $enableopt in
> >  	enable_shared | enable_static) ;;
> > -	*) eval $enableopt="$optarg" ;;
> > +	*) eval $enableopt='$optarg' ;;
> >  	esac
> >  	;;
> >    --norecursion | --no-recursion)
> > @@ -157,7 +160,7 @@ do
> >  	*)	optarg=yes ;;
> >  	esac
> >  	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
> > -	eval $withopt="$optarg"
> > +	eval $withopt='$optarg'
> >  	;;
> >    --without-*)
> >  	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
> > @@ -165,6 +168,11 @@ do
> >  	;;
> >    esac
> >  done
> > +}
> > +# Use eval to properly handle configure arguments such as
> > +# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
> > +eval scan_arguments "${ac_configure_args}"
> > +unset scan_arguments
> >  
> >  # Only do this if --enable-multilib.
> >  if [ "${enable_multilib}" = yes ]; then
> > @@ -860,7 +868,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
> >  
> >      if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
> >  	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
> > -	${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then
> > +	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
> >        true
> >      else
> >        exit 1


Grüße,
 Thomas
Thomas Schwinge June 10, 2014, 6:39 a.m. UTC | #3
Hi!

Ping.


On Tue, 3 Jun 2014 11:57:44 +0200, I wrote:
> Ping.
> 
> 
> On Thu, 22 May 2014 12:58:05 +0200, I wrote:
> > Ping.
> > 
> > 
> > On Fri, 14 Mar 2014 12:22:29 +0100, I wrote:
> > >     $ ../configure --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'
> > >     [...]
> > >     $ make configure-zlib
> > >     config.status: creating Makefile
> > >     config.status: executing default-1 commands
> > >     ../../zlib/../config-ml.in: eval: line 142: unexpected EOF while looking for matching `''
> > >     ../../zlib/../config-ml.in: eval: line 143: syntax error: unexpected end of file
> > >     make: *** [configure-zlib] Error 1
> > > 
> > >        140          case $enableopt in
> > >        141          enable_shared | enable_static) ;;
> > >        142          *) eval $enableopt="$optarg" ;;
> > >        143          esac
> > >        144          ;;
> > > 
> > >     $ grep ac_configure_args < zlib/config.status
> > >     ac_configure_args="  '--cache-file=./config.cache' '--enable-foo=--enable-a=1 --enable-b=2 --enable-c=3' '--enable-languages=c,c++,fortran,java,lto,objc' '--program-transform-name=s,y,y,' '--disable-option-checking' '--build=x86_64-unknown-linux-gnu' '--host=x86_64-unknown-linux-gnu' '--target=x86_64-unknown-linux-gnu' '--srcdir=../../zlib' 'build_alias=x86_64-unknown-linux-gnu' 'host_alias=x86_64-unknown-linux-gnu' 'target_alias=x86_64-unknown-linux-gnu'"
> > > 
> > > These are quoted correctly; the error happens because the
> > > ac_configure_args parsing logic in config-ml.in will parse this as:
> > > 
> > >  1. '--enable-foo=--enable-a=1
> > >  2. --enable-b=2
> > >  3. --enable-c=3'
> > > 
> > > Below I'm proposing a patch using a shell function and eval to properly
> > > handle such configure arguments.  Instead of a shell function, we could
> > > also use:
> > > 
> > >     eval set x "${ac_configure_args}" && shift
> > >     for option
> > >     do
> > >       [...]
> > >     done
> > > 
> > > ..., as done in top-level configure.ac for baseargs etc., but as the
> > > config-ml.in script is sourced in different contexts, it is not obvious
> > > to me that we're permitted to overwrite the shell's positional parameters
> > > here.
> > > 
> > > OK for trunk?  (Will properly indent scan_arguments before commit.)
> > > 
> > > commit bc6f99e9840994309eaf4e88679c3ba50d5e4918
> > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > Date:   Thu Mar 13 19:54:58 2014 +0100
> > > 
> > >     	* config-ml.in: Robustify ac_configure_args parsing.
> > > 
> > > diff --git config-ml.in config-ml.in
> > > index 1198346..0cd7db3 100644
> > > --- config-ml.in
> > > +++ config-ml.in
> > > @@ -105,10 +105,13 @@ ml_realsrcdir=${srcdir}
> > >  
> > >  # Scan all the arguments and set all the ones we need.
> > >  
> > > +scan_arguments ()
> > > +{
> > >  ml_verbose=--verbose
> > > -for option in ${ac_configure_args}
> > > +for option
> > >  do
> > > -  # strip single quotes surrounding individual options
> > > +  # Strip single quotes surrounding individual options, that is, remove one
> > > +  # level of shell quoting for these.
> > >    case $option in
> > >    \'*\') eval option=$option ;;
> > >    esac
> > > @@ -139,7 +142,7 @@ do
> > >  	# Don't undo its work.
> > >  	case $enableopt in
> > >  	enable_shared | enable_static) ;;
> > > -	*) eval $enableopt="$optarg" ;;
> > > +	*) eval $enableopt='$optarg' ;;
> > >  	esac
> > >  	;;
> > >    --norecursion | --no-recursion)
> > > @@ -157,7 +160,7 @@ do
> > >  	*)	optarg=yes ;;
> > >  	esac
> > >  	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
> > > -	eval $withopt="$optarg"
> > > +	eval $withopt='$optarg'
> > >  	;;
> > >    --without-*)
> > >  	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
> > > @@ -165,6 +168,11 @@ do
> > >  	;;
> > >    esac
> > >  done
> > > +}
> > > +# Use eval to properly handle configure arguments such as
> > > +# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
> > > +eval scan_arguments "${ac_configure_args}"
> > > +unset scan_arguments
> > >  
> > >  # Only do this if --enable-multilib.
> > >  if [ "${enable_multilib}" = yes ]; then
> > > @@ -860,7 +868,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
> > >  
> > >      if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
> > >  	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
> > > -	${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then
> > > +	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
> > >        true
> > >      else
> > >        exit 1


Grüße,
 Thomas
diff mbox

Patch

diff --git config-ml.in config-ml.in
index 1198346..0cd7db3 100644
--- config-ml.in
+++ config-ml.in
@@ -105,10 +105,13 @@  ml_realsrcdir=${srcdir}
 
 # Scan all the arguments and set all the ones we need.
 
+scan_arguments ()
+{
 ml_verbose=--verbose
-for option in ${ac_configure_args}
+for option
 do
-  # strip single quotes surrounding individual options
+  # Strip single quotes surrounding individual options, that is, remove one
+  # level of shell quoting for these.
   case $option in
   \'*\') eval option=$option ;;
   esac
@@ -139,7 +142,7 @@  do
 	# Don't undo its work.
 	case $enableopt in
 	enable_shared | enable_static) ;;
-	*) eval $enableopt="$optarg" ;;
+	*) eval $enableopt='$optarg' ;;
 	esac
 	;;
   --norecursion | --no-recursion)
@@ -157,7 +160,7 @@  do
 	*)	optarg=yes ;;
 	esac
 	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
-	eval $withopt="$optarg"
+	eval $withopt='$optarg'
 	;;
   --without-*)
 	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
@@ -165,6 +168,11 @@  do
 	;;
   esac
 done
+}
+# Use eval to properly handle configure arguments such as
+# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
+eval scan_arguments "${ac_configure_args}"
+unset scan_arguments
 
 # Only do this if --enable-multilib.
 if [ "${enable_multilib}" = yes ]; then
@@ -860,7 +868,7 @@  if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
 
     if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
 	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
-	${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then
+	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
       true
     else
       exit 1