diff options
author | Gaël Bonithon <trash.paradise@protonmail.com> | 2020-10-02 12:25:44 +0200 |
---|---|---|
committer | Gaël Bonithon <trash.paradise@protonmail.com> | 2020-10-03 09:14:32 +0200 |
commit | 72483f0e80a4241893711f6431d53def515e5b6d (patch) | |
tree | 79e4dc8504bb1774f736fe29e5195ece6390e7ff /scripts | |
parent | 3e01e2136b0cb687987345cd19e0458e46e2d5b9 (diff) | |
download | xfce4-dev-tools-72483f0e80a4241893711f6431d53def515e5b6d.tar.gz |
xdt-autogen: Properly handle whitespaces in filenames
and more generally special characters different from '\1'.
This is achieved by replacing the filename separator ' ' with '\1' in
lookup_configure_ac_*(), and the default IFS=' \t\n' with IFS='\1', but
only where necessary: the default IFS is usually required for things to
go as expected.
So we have to do an IFS round-trip substitution around each "for" loop
on filenames, just before and just after pathname expansion by the
shell.
Additionally, when running $XDT_PROG_ACLOCAL, one has to define some
new variables ACLOCAL_DIR and use conditional parameter expansion, to
properly set the program flags:
$XDT_PROG_ACLOCAL ${ACLOCAL_DIR:+-I "$ACLOCAL_DIR"}
Finally, one has to take care of some non optional quoting
(strictly speaking, some are optional in this commit, but I preferred
not to cut as close as possible and to keep an overall coherence).
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/xdt-autogen.in | 158 |
1 files changed, 100 insertions, 58 deletions
diff --git a/scripts/xdt-autogen.in b/scripts/xdt-autogen.in index bbf9527..355b6df 100644 --- a/scripts/xdt-autogen.in +++ b/scripts/xdt-autogen.in @@ -34,6 +34,14 @@ datarootdir="@datarootdir@" m4macrodir="${datarootdir}/aclocal" ## +## to properly handle whitespaces in filenames, +## and more generally special characters different from '\1' +## + +default_IFS=$IFS +special_IFS=$(printf '\1') + +## ## a few portability tests ## @@ -76,10 +84,12 @@ EOF exit 1 fi - test "x$configure_ac_file" != "x" && printf "%s" "$configure_ac_file " + test -n "$configure_ac_file" && printf "%s$special_IFS" "$configure_ac_file" - subdirs=`parse_configure_subdirs ${configure_ac_file}` + subdirs=$(parse_configure_subdirs "${configure_ac_file}") + IFS=$special_IFS for subdir in $subdirs; do + IFS=$default_IFS lookup_configure_ac_files "$1/$subdir"; done } @@ -97,10 +107,12 @@ lookup_configure_ac_in_files() configure_ac_in_file="$1/configure.in.in"; fi - test "x$configure_ac_in_file" != "x" && printf "%s" "$configure_ac_in_file " + test -n "$configure_ac_in_file" && printf "%s$special_IFS" "$configure_ac_in_file" - subdirs=`parse_configure_subdirs ${configure_ac_in_file}` + subdirs=$(parse_configure_subdirs "${configure_ac_in_file}") + IFS=$special_IFS for subdir in $subdirs; do + IFS=$default_IFS lookup_configure_ac_in_files "$1/$subdir"; done } @@ -111,7 +123,7 @@ lookup_configure_ac_in_files() ## check command-line args ## if test "x$1" = "x--version" -o "x$1" = "x-V"; then - echo "`basename $0` $VERSION" + echo "$(basename "$0") $VERSION" exit 0 fi @@ -163,9 +175,11 @@ MASTER_DIR=`pwd`; test -z "${MASTER_DIR}" && MASTER_DIR="." ## ## First we do some substitutions to generate configure.{ac,in} if necessary ## -CONFIGURE_AC_IN_FILES=`lookup_configure_ac_in_files "$MASTER_DIR"` +CONFIGURE_AC_IN_FILES=$(lookup_configure_ac_in_files "$MASTER_DIR") +IFS=$special_IFS for configure_ac_in_file in $CONFIGURE_AC_IN_FILES; do - configure_ac_file="`echo $configure_ac_in_file | sed -e 's:\.in$::'`" + IFS=$default_IFS + configure_ac_file=${configure_ac_in_file%.in} # first generate a revision id if test -d .git; then @@ -177,11 +191,11 @@ for configure_ac_in_file in $CONFIGURE_AC_IN_FILES; do fi # find out what languages we support - conf_dir=`dirname $configure_ac_file` linguas=$(echo $(for i in "$conf_dir"/po/*.po; do test -e "$i" && basename -- "$i" .po; done) | tr -d '\n') + conf_dir=$(dirname "$configure_ac_file") # and do the substitution - tmp=`basename ${configure_ac_in_file}` + tmp=$(basename "${configure_ac_in_file}") cat >"$configure_ac_file" <<EOF dnl dnl This file was autogenerated from "${tmp}". @@ -199,7 +213,7 @@ done ## ## Search for the configure.{ac,in} files ## -CONFIGURE_AC_FILES=`lookup_configure_ac_files "$MASTER_DIR"` +CONFIGURE_AC_FILES=$(lookup_configure_ac_files "$MASTER_DIR") ## @@ -223,12 +237,14 @@ fi ## ## cleanup autogenerated files ## -if test x"$1" = x"clean"; then +if test "$1" = "clean"; then + IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do - directory=`dirname ${configure_ac_file}` + IFS=$default_IFS + directory=$(dirname "${configure_ac_file}") echo "Running ${MAKE} distclean in ${directory}..." - (cd ${directory} ; ${MAKE} distclean) >/dev/null 2>&1 + ( cd "${directory}" && ${MAKE} distclean ) >/dev/null 2>&1 echo "Cleaning generated files in ${directory}..." @@ -238,32 +254,37 @@ if test x"$1" = x"clean"; then -e 's|.*AC_OUTPUT(\[\{0,1\}\([[:alnum:]_@/\. -]\{1,\}\).*|\1|p' \ "${configure_ac_file}" ) + # we are in the repository here: these filenames don't contain whitespaces + # nor special characters: no need to change the IFS for output_file in $output_files; do - if test x`basename $output_file` = x"Makefile"; then - rm -f "${directory}/${output_file}.in"; - rm -f "${directory}/${output_file}.in.in"; + if test "$(basename "$output_file")" = "Makefile"; then + rm -f "${directory}/${output_file}.in" + rm -f "${directory}/${output_file}.in.in" fi - rm -f "${directory}/${output_file}"; + rm -f "${directory}/${output_file}" done - (cd ${directory} ; - rm -f config.* configure configure.lineno aclocal.m4 ; - rm -f compile depcomp ltmain.sh missing install-sh ; - rm -f po/Makefile.in.in po/stamp-it ; - rm -f stamp-h1 *.spec ; - rm -f mkinstalldirs libtool ; - rm -rf autom4te.cache m4 gtk-doc.m4 ; - rm -f intltool-* gtk-doc.make ; - rm -f test-driver ; - - if test -f po/POTFILES.in; then - rm -f po/POTFILES - fi - if test -f configure.ac.in -a -f configure.ac; then - rm -f configure.ac - elif test -f configure.in.in -a -f configure.in; then - rm -f configure.in - fi) + ( + cd "${directory}" && { + rm -f config.* configure configure.lineno aclocal.m4 + rm -f compile depcomp ltmain.sh missing install-sh + rm -f po/Makefile.in.in po/stamp-it + rm -f stamp-h1 ./*.spec + rm -f mkinstalldirs libtool + rm -rf autom4te.cache m4 gtk-doc.m4 + rm -f intltool-* gtk-doc.make + rm -f test-driver + + if test -f po/POTFILES.in; then + rm -f po/POTFILES + fi + if test -f configure.ac.in -a -f configure.ac; then + rm -f configure.ac + elif test -f configure.in.in -a -f configure.in; then + rm -f configure.in + fi + } + ) # determine translations used in this package directory # translations=$( @@ -274,7 +295,7 @@ if test x"$1" = x"clean"; then # for translation in $translations; do # rm -f "${directory}/po/${translation}.gmo"; # done - rm -f ${directory}/po/*.gmo; + rm -f "${directory}"/po/*.gmo; done exit 0 @@ -304,7 +325,9 @@ EOF ## Check for intltoolize ## test -z "${XDT_PROG_INTLTOOLIZE}" && XDT_PROG_INTLTOOLIZE="intltoolize" +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do + IFS=$default_IFS if $EGREP -q "^(AC|IT)_PROG_INTLTOOL" "${configure_ac_file}"; then (${XDT_PROG_INTLTOOLIZE} --version) </dev/null >/dev/null 2>&1 || { cat >&2 <<EOF @@ -317,7 +340,10 @@ EOF break; fi; done + +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do + IFS=$default_IFS if grep -q "^AC_PROG_INTLTOOL" "${configure_ac_file}"; then cat >&2 <<EOF xdt-autogen: It is recommended to use IT_PROG_INTLTOOL([0.35.0]) @@ -341,7 +367,10 @@ if test -z "${XDT_PROG_LIBTOOLIZE}"; then XDT_PROG_LIBTOOLIZE="libtoolize" fi fi + +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do + IFS=$default_IFS runlibtoolize=0 if grep -q "^AC_PROG_LIBTOOL" "${configure_ac_file}"; then cat >&2 <<EOF @@ -378,8 +407,10 @@ done ## Check for glib-gettextize ## test -z "${XDT_PROG_GLIB_GETTEXTIZE}" && XDT_PROG_GLIB_GETTEXTIZE="glib-gettextize" +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do - directory=`dirname ${configure_ac_file}` + IFS=$default_IFS + directory=$(dirname "${configure_ac_file}") if test -d "${directory}/po"; then (${XDT_PROG_GLIB_GETTEXTIZE} --version) </dev/null >/dev/null 2>&1 || { cat >&2 <<EOF @@ -397,7 +428,9 @@ done ## Check for gtkdocize ## test -z "${XDT_PROG_GTKDOCIZE}" && XDT_PROG_GTKDOCIZE="gtkdocize" +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do + IFS=$default_IFS if grep -q "^GTK_DOC_CHECK" "${configure_ac_file}"; then (${XDT_PROG_GTKDOCIZE} --version) </dev/null >/dev/null 2>&1 || { cat >&2 <<EOF @@ -434,7 +467,9 @@ EOF ## Check for autoheader ## test -z "${XDT_PROG_AUTOHEADER}" && +IFS=$special_IFS for configure_ac_file in $CONFIGURE_AC_FILES; do + IFS=$default_IFS if $EGREP -q "^A(M|C)_CONFIG_HEADER" "${configure_ac_file}"; then test -z "${AUTOHEADER_VERSION}" && i=autoheader || i=autoheader-${AUTOHEADER_VERSION} (${i} --version) </dev/null >/dev/null 2>&1 && @@ -482,18 +517,20 @@ CONFIGURE_FLAGS="${XDT_CONFIGURE_FLAGS} $@" ## ## Do the real work(TM) ## +IFS=$special_IFS for configure_ac_file in ${CONFIGURE_AC_FILES}; do + IFS=$default_IFS # figure out the package dir path - source_dir=`dirname ${configure_ac_file}` + source_dir=$(dirname "${configure_ac_file}") echo "Preparing package directory ${source_dir}..." # set aclocal flags ACLOCAL_FLAGS="${ACLOCAL_FLAGS} ${XDT_ACLOCAL_FLAGS} -I ${m4macrodir}" if test -d "${source_dir}/m4macros"; then - ACLOCAL_FLAGS="${ACLOCAL_FLAGS} -I ${source_dir}/m4macros"; + ACLOCAL_DIR_1="${source_dir}/m4macros"; fi if test -d "${source_dir}/m4"; then - ACLOCAL_FLAGS="${ACLOCAL_FLAGS} -I ${source_dir}/m4"; + ACLOCAL_DIR_2="${source_dir}/m4"; fi if test -d "${source_dir}/po"; then @@ -538,34 +575,39 @@ XGETTEXT_ARGS = @XGETTEXT_ARGS@ fi if grep -q -e "^AC_PROG_LIBTOOL" -e "^LT_PREREQ" "${configure_ac_file}"; then - (echo "Running ${XDT_PROG_LIBTOOLIZE} --force --copy..." && - cd "${source_dir}" && - ${XDT_PROG_LIBTOOLIZE} --force --copy) || exit 1 + ( echo "Running ${XDT_PROG_LIBTOOLIZE} --force --copy..." \ + && cd "${source_dir}" \ + && ${XDT_PROG_LIBTOOLIZE} --force --copy ) || exit 1 fi if grep -q "^GTK_DOC_CHECK" "${configure_ac_file}"; then - (echo "Running ${XDT_PROG_GTKDOCIZE} --copy..." && - cd ${source_dir} && - ${XDT_PROG_GTKDOCIZE} --copy) || exit 1 + ( echo "Running ${XDT_PROG_GTKDOCIZE} --copy..." \ + && cd "${source_dir}" \ + && ${XDT_PROG_GTKDOCIZE} --copy ) || exit 1 fi - (echo "Running ${XDT_PROG_ACLOCAL} ${ACLOCAL_FLAGS}..." && - cd ${source_dir} && - ${XDT_PROG_ACLOCAL} ${ACLOCAL_FLAGS}) || exit 1 + ( echo -n "Running ${XDT_PROG_ACLOCAL}" ${ACLOCAL_FLAGS} \ + ${ACLOCAL_DIR_1:+-I "${ACLOCAL_DIR_1}"} \ + ${ACLOCAL_DIR_2:+-I "${ACLOCAL_DIR_2}"} \ + && echo '...' \ + && cd "${source_dir}" \ + && ${XDT_PROG_ACLOCAL} ${ACLOCAL_FLAGS} \ + ${ACLOCAL_DIR_1:+-I "${ACLOCAL_DIR_1}"} \ + ${ACLOCAL_DIR_2:+-I "${ACLOCAL_DIR_2}"} ) || exit 1 if $EGREP -q "^A(M|C)_CONFIG_HEADER" "${configure_ac_file}"; then - (echo "Running ${XDT_PROG_AUTOHEADER}..." && - cd ${source_dir} && - ${XDT_PROG_AUTOHEADER}) || exit 1 + ( echo "Running ${XDT_PROG_AUTOHEADER}..." \ + && cd "${source_dir}" \ + && ${XDT_PROG_AUTOHEADER} ) || exit 1 fi - (echo "Running ${XDT_PROG_AUTOMAKE} --force-missing --add-missing --copy --gnu..." && - cd ${source_dir} && - ${XDT_PROG_AUTOMAKE} --force-missing --add-missing --copy --gnu) || exit 1 + ( echo "Running ${XDT_PROG_AUTOMAKE} --force-missing --add-missing --copy --gnu..." \ + && cd "${source_dir}" \ + && ${XDT_PROG_AUTOMAKE} --force-missing --add-missing --copy --gnu ) || exit 1 - (echo "Running ${XDT_PROG_AUTOCONF}..." && - cd ${source_dir} && - ${XDT_PROG_AUTOCONF}) || exit 1 + ( echo "Running ${XDT_PROG_AUTOCONF}..." \ + && cd "${source_dir}" \ + && ${XDT_PROG_AUTOCONF} ) || exit 1 echo done |