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 <tho...@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
pgpHe1tqkFZ5h.pgp
Description: PGP signature