| https://bugs.gentoo.org/542252 |
| |
| From 32f0df9835ac15ac17e04be57c368172c3ad1d19 Mon Sep 17 00:00:00 2001 |
| From: Pavel Raiskup <praiskup@redhat.com> |
| Date: Sun, 4 Oct 2015 21:55:03 +0200 |
| Subject: [PATCH] libtool: mitigate the $sed_quote_subst slowdown |
| |
| When it is reasonably possible, use shell implementation for |
| quoting. |
| |
| References: |
| http://lists.gnu.org/archive/html/libtool/2015-03/msg00005.html |
| http://lists.gnu.org/archive/html/libtool/2015-02/msg00000.html |
| https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20006 |
| |
| * gl/build-aux/funclib.sh (func_quote): New function that can be |
| used as substitution for '$SED $sed_quote_subst' call. |
| * build-aux/ltmain.in (func_emit_wrapper): Use func_quote instead |
| of '$SED $sed_quote_subst'. |
| (func_mode_link): Likewise. |
| * NEWS: Document. |
| * bootstrap: Sync with funclib.sh. |
| --- |
| NEWS | 3 +++ |
| bootstrap | 61 +++++++++++++++++++++++++++++++++++++++++++------ |
| build-aux/ltmain.in | 10 ++++---- |
| gl/build-aux/funclib.sh | 61 +++++++++++++++++++++++++++++++++++++++++++------ |
| 4 files changed, 117 insertions(+), 18 deletions(-) |
| |
| diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in |
| index 0c40da0..24acefd 100644 |
| --- a/build-aux/ltmain.in |
| +++ b/build-aux/ltmain.in |
| @@ -3346,7 +3346,8 @@ else |
| if test \"\$libtool_execute_magic\" != \"$magic\"; then |
| file=\"\$0\"" |
| |
| - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` |
| + func_quote "$ECHO" |
| + qECHO=$func_quote_result |
| $ECHO "\ |
| |
| # A function that is used when there is no print builtin or printf. |
| @@ -8596,8 +8597,8 @@ EOF |
| relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" |
| fi |
| done |
| - relink_command="(cd `pwd`; $relink_command)" |
| - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` |
| + func_quote "(cd `pwd`; $relink_command)" |
| + relink_command=$func_quote_result |
| fi |
| |
| # Only actually do things if not in dry run mode. |
| @@ -8843,7 +8844,8 @@ EOF |
| done |
| # Quote the link command for shipping. |
| relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" |
| - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` |
| + func_quote "$relink_command" |
| + relink_command=$func_quote_result |
| if test yes = "$hardcode_automatic"; then |
| relink_command= |
| fi |
| diff --git a/gl/build-aux/funclib.sh b/gl/build-aux/funclib.sh |
| index 39d972e..47d8b95 100644 |
| --- a/build-aux/funclib.sh |
| +++ b/build-aux/funclib.sh |
| @@ -1,5 +1,5 @@ |
| # Set a version string for this script. |
| -scriptversion=2015-01-20.17; # UTC |
| +scriptversion=2015-10-04.22; # UTC |
| |
| # General shell script boiler plate, and helper functions. |
| # Written by Gary V. Vaughan, 2004 |
| @@ -1026,6 +1026,57 @@ func_relative_path () |
| } |
| |
| |
| +# func_quote ARG |
| +# -------------- |
| +# Aesthetically quote one ARG, store the result into $func_quote_result. Note |
| +# that we keep attention to performance here (so far O(N) complexity as long as |
| +# func_append is O(1)). |
| +func_quote () |
| +{ |
| + $debug_cmd |
| + |
| + func_quote_result=$1 |
| + |
| + case $func_quote_result in |
| + *[\\\`\"\$]*) |
| + case $func_quote_result in |
| + *[\[\*\?]*) |
| + func_quote_result=`$ECHO "$func_quote_result" | $SED "$sed_quote_subst"` |
| + return 0 |
| + ;; |
| + esac |
| + |
| + func_quote_old_IFS=$IFS |
| + for _G_char in '\' '`' '"' '$' |
| + do |
| + # STATE($1) PREV($2) SEPARATOR($3) |
| + set start "" "" |
| + func_quote_result=dummy"$_G_char$func_quote_result$_G_char"dummy |
| + IFS=$_G_char |
| + for _G_part in $func_quote_result |
| + do |
| + case $1 in |
| + quote) |
| + func_append func_quote_result "$3$2" |
| + set quote "$_G_part" "\\$_G_char" |
| + ;; |
| + start) |
| + set first "" "" |
| + func_quote_result= |
| + ;; |
| + first) |
| + set quote "$_G_part" "" |
| + ;; |
| + esac |
| + done |
| + IFS=$func_quote_old_IFS |
| + done |
| + ;; |
| + *) ;; |
| + esac |
| +} |
| + |
| + |
| # func_quote_for_eval ARG... |
| # -------------------------- |
| # Aesthetically quote ARGs to be evaled later. |
| @@ -1042,12 +1093,8 @@ func_quote_for_eval () |
| func_quote_for_eval_unquoted_result= |
| func_quote_for_eval_result= |
| while test 0 -lt $#; do |
| - case $1 in |
| - *[\\\`\"\$]*) |
| - _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; |
| - *) |
| - _G_unquoted_arg=$1 ;; |
| - esac |
| + func_quote "$1" |
| + _G_unquoted_arg=$func_quote_result |
| if test -n "$func_quote_for_eval_unquoted_result"; then |
| func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" |
| else |
| |
| patch the generated file too to keep help2man from generating man pages |
| https://bugs.gentoo.org/556512 |
| |
| --- a/build-aux/ltmain.sh |
| +++ b/build-aux/ltmain.sh |
| @@ -1,5 +1,5 @@ |
| # Set a version string for this script. |
| -scriptversion=2015-01-20.17; # UTC |
| +scriptversion=2015-10-04.22; # UTC |
| |
| # General shell script boiler plate, and helper functions. |
| # Written by Gary V. Vaughan, 2004 |
| @@ -1026,6 +1026,57 @@ func_relative_path () |
| } |
| |
| |
| +# func_quote ARG |
| +# -------------- |
| +# Aesthetically quote one ARG, store the result into $func_quote_result. Note |
| +# that we keep attention to performance here (so far O(N) complexity as long as |
| +# func_append is O(1)). |
| +func_quote () |
| +{ |
| + $debug_cmd |
| + |
| + func_quote_result=$1 |
| + |
| + case $func_quote_result in |
| + *[\\\`\"\$]*) |
| + case $func_quote_result in |
| + *[\[\*\?]*) |
| + func_quote_result=`$ECHO "$func_quote_result" | $SED "$sed_quote_subst"` |
| + return 0 |
| + ;; |
| + esac |
| + |
| + func_quote_old_IFS=$IFS |
| + for _G_char in '\' '`' '"' '$' |
| + do |
| + # STATE($1) PREV($2) SEPARATOR($3) |
| + set start "" "" |
| + func_quote_result=dummy"$_G_char$func_quote_result$_G_char"dummy |
| + IFS=$_G_char |
| + for _G_part in $func_quote_result |
| + do |
| + case $1 in |
| + quote) |
| + func_append func_quote_result "$3$2" |
| + set quote "$_G_part" "\\$_G_char" |
| + ;; |
| + start) |
| + set first "" "" |
| + func_quote_result= |
| + ;; |
| + first) |
| + set quote "$_G_part" "" |
| + ;; |
| + esac |
| + done |
| + IFS=$func_quote_old_IFS |
| + done |
| + ;; |
| + *) ;; |
| + esac |
| +} |
| + |
| + |
| # func_quote_for_eval ARG... |
| # -------------------------- |
| # Aesthetically quote ARGs to be evaled later. |
| @@ -1042,12 +1093,8 @@ func_quote_for_eval () |
| func_quote_for_eval_unquoted_result= |
| func_quote_for_eval_result= |
| while test 0 -lt $#; do |
| - case $1 in |
| - *[\\\`\"\$]*) |
| - _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; |
| - *) |
| - _G_unquoted_arg=$1 ;; |
| - esac |
| + func_quote "$1" |
| + _G_unquoted_arg=$func_quote_result |
| if test -n "$func_quote_for_eval_unquoted_result"; then |
| func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" |
| else |
| @@ -3346,7 +3346,8 @@ else |
| if test \"\$libtool_execute_magic\" != \"$magic\"; then |
| file=\"\$0\"" |
| |
| - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` |
| + func_quote "$ECHO" |
| + qECHO=$func_quote_result |
| $ECHO "\ |
| |
| # A function that is used when there is no print builtin or printf. |
| @@ -8596,8 +8597,8 @@ EOF |
| relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" |
| fi |
| done |
| - relink_command="(cd `pwd`; $relink_command)" |
| - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` |
| + func_quote "(cd `pwd`; $relink_command)" |
| + relink_command=$func_quote_result |
| fi |
| |
| # Only actually do things if not in dry run mode. |
| @@ -8843,7 +8844,8 @@ EOF |
| done |
| # Quote the link command for shipping. |
| relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" |
| - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` |
| + func_quote "$relink_command" |
| + relink_command=$func_quote_result |
| if test yes = "$hardcode_automatic"; then |
| relink_command= |
| fi |
| -- |
| 2.6.2 |
| |