From: Bruno Haible Date: Thu, 9 Feb 2023 02:42:39 +0000 (+0100) Subject: x-to-1: Accept additional help2man arguments. X-Git-Tag: v1.0~1691 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=be8e401adf67e4e0b6638e8d396b6aaa0fd6834b;p=gnulib.git x-to-1: Accept additional help2man arguments. Suggested by Reuben Thomas in . * build-aux/x-to-1.in: Allow additional options after the HELP2MAN argument, and pass them down to help2man. --- diff --git a/ChangeLog b/ChangeLog index 1e2a4e2e9d..9b7a6fee50 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2023-02-08 Bruno Haible + + x-to-1: Accept additional help2man arguments. + Suggested by Reuben Thomas in + . + * build-aux/x-to-1.in: Allow additional options after the HELP2MAN + argument, and pass them down to help2man. + 2023-02-08 Bruno Haible x-to-1: Document the configure-time prerequisites. diff --git a/build-aux/x-to-1.in b/build-aux/x-to-1.in index 6dc01157f5..daa37c85aa 100644 --- a/build-aux/x-to-1.in +++ b/build-aux/x-to-1.in @@ -19,12 +19,13 @@ # This program creates a program's manual from the .x skeleton and its --help # output. # -# Usage: x-to-1 [OPTIONS] PERL HELP2MAN EXECUTABLE PROGRAM.x PROGRAM.1 +# Usage: x-to-1 [OPTIONS] PERL HELP2MAN [HELP2MAN-OPTIONS] EXECUTABLE PROGRAM.x PROGRAM.1 # where # # PERL The file name of the perl program. # HELP2MAN Either the file name of the help2man perl script, or a complete # command such as "$PERL -w -- help2man". +# HELP2MAN-OPTIONS Options to pass to the help2man perl script. # EXECUTABLE The file name of the program to invoke with --help. # PROGRAM The name of the program. # PROGRAM.x The .x skeleton is a file containing manual page text that is @@ -56,15 +57,34 @@ while true; do esac done -if test $# != 5; then - echo "Usage: x-to-1 [OPTIONS] PERL HELP2MAN executable program.x program.1" 1>&2 +if test $# -lt 5; then + echo "Usage: x-to-1 [OPTIONS] PERL HELP2MAN [HELP2MAN-OPTIONS] executable program.x program.1" 1>&2 exit 1 fi -PERL="$1" -HELP2MAN="$2" -executable="$3" -aux="$4" -output="$5" + +# In order to construct a command that invokes HELP2MAN [HELP2MAN-OPTIONS] ... +# we need 'eval'. +command_for_print= +command_for_eval= +# Protecting special characters, hiding them from 'eval': +# Double each backslash. +sed_protect_1='s/\\/\\\\/g' +# Escape each dollar, backquote, double-quote. +sed_protect_2a='s/\$/\\$/g' +sed_protect_2b='s/`/\\`/g' +sed_protect_2c='s/"/\\"/g' +# Add double-quotes at the beginning and end of the word. +sed_protect_3a='1s/^/"/' +sed_protect_3b='$s/$/"/' +func_add_word_to_command () +{ + command_for_print="${command_for_print:+$command_for_print }$1" + word_protected=`echo "$1" | sed -e "$sed_protect_1" -e "$sed_protect_2a" -e "$sed_protect_2b" -e "$sed_protect_2c" -e "$sed_protect_3a" -e "$sed_protect_3b"` + command_for_eval="${command_for_eval:+$command_for_eval }$word_protected" +} + +PERL="$1"; shift +HELP2MAN="$1"; shift # Accommodate both possible forms of the HELP2MAN argument. case "$HELP2MAN" in @@ -72,6 +92,22 @@ case "$HELP2MAN" in *) HELP2MAN="$PERL $HELP2MAN" ;; esac +# Do word-splitting of $HELP2MAN, but carefully. +for word in $HELP2MAN; do + func_add_word_to_command "$word" +done + +# Now grok the HELP2MAN-OPTIONS. +while test $# -gt 3; do + arg="$1"; shift + func_add_word_to_command "$arg" +done + +# Grok the final arguments. +executable="$1" +aux="$2" +output="$3" + progname=`basename $aux .x` # configure determined whether perl exists. case "$PERL" in @@ -89,9 +125,11 @@ case "$PERL" in esac if test @CROSS_COMPILING@ = no && test -f $executable && test $perlok = yes; then echo "Updating man page $output" - echo "$HELP2MAN --include=$aux $executable > $output" + func_add_word_to_command "--include=$aux" + func_add_word_to_command "$executable" + echo "$command_for_print > $output" rm -f t-$progname.1 - $HELP2MAN --include=$aux $executable > t-$progname.1 || exit 1 + eval $command_for_eval > t-$progname.1 || exit 1 if test -n "$update"; then # In --update mode, don't overwrite the output if nothing would change. if cmp t-$progname.1 $output >/dev/null 2>&1; then