summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorGaël Bonithon <trash.paradise@protonmail.com>2020-10-02 12:25:44 +0200
committerGaël Bonithon <trash.paradise@protonmail.com>2020-10-03 09:14:32 +0200
commit72483f0e80a4241893711f6431d53def515e5b6d (patch)
tree79e4dc8504bb1774f736fe29e5195ece6390e7ff /scripts
parent3e01e2136b0cb687987345cd19e0458e46e2d5b9 (diff)
downloadxfce4-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.in158
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