From: Ralf Wildenhues Date: Wed, 17 May 2006 01:58:40 +0000 (+0000) Subject: Eliminate quadratic scaling in argument parsing loop, for X-Git-Tag: release-2-1b~295 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=216754e10168dfd3788db78e67d0250d1205b91f;p=thirdparty%2Flibtool.git Eliminate quadratic scaling in argument parsing loop, for shells that understand `var+=value', such as Bash-3.1, or Zsh. * libltdl/m4/libtool.m4 (_LT_CHECK_XSI_SHELL): Test whether the shell understands `var+=value'. (_LT_PROG_XSI_SHELLFNS): Define `func_append' based on this. * config/ltmain.m4sh (func_mode_link): Use `func_append' for compile_command, finalize_command, libtool_args, libobjs, non_pic_objects. --- diff --git a/ChangeLog b/ChangeLog index f29e76964..96717ed63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-05-17 Ralf Wildenhues + + Eliminate quadratic scaling in argument parsing loop, for + shells that understand `var+=value', such as Bash-3.1, or Zsh. + + * libltdl/m4/libtool.m4 (_LT_CHECK_XSI_SHELL): Test whether + the shell understands `var+=value'. + (_LT_PROG_XSI_SHELLFNS): Define `func_append' based on this. + * config/ltmain.m4sh (func_mode_link): Use `func_append' for + compile_command, finalize_command, libtool_args, libobjs, + non_pic_objects. + 2006-05-15 Bruno Haible , Ralf Wildenhues diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh index c461303ed..5872ad19d 100644 --- a/libltdl/config/ltmain.m4sh +++ b/libltdl/config/ltmain.m4sh @@ -2195,10 +2195,10 @@ func_mode_link () allow_undefined=yes ;; esac - libtool_args="$nonopt" + libtool_args=$nonopt base_compile="$nonopt $@" - compile_command="$nonopt" - finalize_command="$nonopt" + compile_command=$nonopt + finalize_command=$nonopt compile_rpath= finalize_rpath= @@ -2265,8 +2265,8 @@ func_mode_link () if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static # See comment for -static flag below, for more details. - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" fi prefer_static_libs=yes ;; @@ -2298,15 +2298,15 @@ func_mode_link () arg="$1" shift func_quote_for_eval "$arg" - qarg="$func_quote_for_eval_unquoted_result" - libtool_args="$libtool_args $func_quote_for_eval_result" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" ;; esac @@ -2314,8 +2314,8 @@ func_mode_link () dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in @@ -2433,7 +2433,7 @@ func_mode_link () fi # A PIC object. - libobjs="$libobjs $pic_object" + func_append libobjs " $pic_object" arg="$pic_object" fi @@ -2443,7 +2443,7 @@ func_mode_link () non_pic_object="$xdir$non_pic_object" # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" + func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi @@ -2451,7 +2451,7 @@ func_mode_link () # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" + func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. @@ -2462,8 +2462,8 @@ func_mode_link () pic_object=`$ECHO "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$ECHO "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi @@ -2522,23 +2522,23 @@ func_mode_link () linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" + func_append compile_command " $qarg" + func_append finalize_command " $qarg" continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" + func_append compile_command " $qarg" + func_append finalize_command " $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" continue ;; *) @@ -2609,8 +2609,8 @@ func_mode_link () -L[[A-Z]][[A-Z]]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" ;; esac continue @@ -2702,17 +2702,17 @@ func_mode_link () # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot) - compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) compiler_flags="$compiler_flags $arg" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; @@ -2893,8 +2893,8 @@ func_mode_link () -t[[45]]*|-txscale*|@*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" compiler_flags="$compiler_flags $arg" continue ;; @@ -2955,7 +2955,7 @@ func_mode_link () fi # A PIC object. - libobjs="$libobjs $pic_object" + func_append libobjs " $pic_object" arg="$pic_object" fi @@ -2965,7 +2965,7 @@ func_mode_link () non_pic_object="$xdir$non_pic_object" # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" + func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi @@ -2973,7 +2973,7 @@ func_mode_link () # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" + func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. @@ -2984,8 +2984,8 @@ func_mode_link () pic_object=`$ECHO "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$ECHO "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi @@ -3027,8 +3027,8 @@ func_mode_link () # Now actually substitute the argument into the commands. if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" fi done # argument parsing loop @@ -3037,8 +3037,8 @@ func_mode_link () if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" fi oldlibs= diff --git a/libltdl/m4/libtool.m4 b/libltdl/m4/libtool.m4 index 499da0820..6fcaee925 100644 --- a/libltdl/m4/libtool.m4 +++ b/libltdl/m4/libtool.m4 @@ -6856,7 +6856,8 @@ AC_MSG_RESULT([$SED]) # _LT_CHECK_XSI_SHELL # ------------------- -# define func_basename as either Bourne or XSI compatible +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. m4_defun([_LT_CHECK_XSI_SHELL], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features @@ -6867,6 +6868,14 @@ xsi_shell=no && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) ])# _LT_CHECK_XSI_SHELL @@ -6948,4 +6957,29 @@ func_stripname () } _LT_EOF esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} +_LT_EOF + ;; + esac ])