From 878d61d615bbd1ea852638a9dfbb4e2ca82aebc8 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Sun, 20 May 2012 18:26:01 +0200 Subject: [PATCH] [ng] mkinstalldirs: remove support for the script and the variable According to our documentation: mkinstalldirs used to be a wrapper around 'mkdir -p', which is not portable. Now we prefer to use 'install-sh -d' when configure finds that 'mkdir -p' does not work, this makes one less script to distribute. For backward compatibility mkinstalldirs is still used and distributed when automake finds it in a package. But it is no longer installed automatically, and it should be safe to remove it. So we remove the 'mkinstalldirs' as well as its companion $(mkinstalldirs) variable from Automake-NG altogether. * NG-NEWS, doc/automake-ng.texi: Update. * automake.in (handle_configure): Don not require nor distribute the 'mkinstalldirs' script anymore. Do not define the $(mkinstalldirs) variable. (@common_files): Do not report 'mkinstalldirs' anymore. Reformat the array while we are at it, to make it easier to add or remove entries in the future. * lib/mkinstalldirs: Delete this file. * Makefile.am (dist_script_DATA): Remove it. (check-coverage-run, recheck-coverage-run): Use $(MKDIR_P), not $(mkinstalldirs), to create the 'cover_db' directory. * syntax-checks.mk (sc_mkinstalldirs): Adjust to verify we have mo more instances of 'mkinstalldirs'. * contrib/multilib/config-ml.in: Remove comment referencing the 'mkinstalldirs' script. * t/auxdir.sh: Adjust to use 'py-compile' rather than 'mkinstalldirs'. * t/auxdir6.sh: Likewise. * t/auxdir7.sh: Likewise. * t/auxdir8.sh: Likewise. * t/pr9.sh: Adjust comments to avoid spuriously triggering the 'sc_mkinstalldirs' maintainer check. * t/mkinst3.sh: Converted to test 'install-sh -d' rather than 'mkinstalldirs'. * t/subdir.sh: Adjust comments. * t/werror.sh: Use 'am_create_testdir=empty' rather than removing the install-sh, depcomp, missing and mkinstalldirs scripts by hand. * t/mkinstall.sh: Remove as obsolete. * t/instman2.sh: Likewise. Signed-off-by: Stefano Lattarini --- Makefile.am | 3 +- NG-NEWS | 5 ++ automake.in | 61 +++++++------ contrib/multilib/config-ml.in | 2 +- doc/automake-ng.texi | 13 +-- lib/mkinstalldirs | 162 ---------------------------------- syntax-checks.mk | 16 ++-- t/auxdir.sh | 7 +- t/auxdir6.sh | 9 +- t/auxdir7.sh | 9 +- t/auxdir8.sh | 11 +-- t/instman2.sh | 33 ------- t/mkinst3.sh | 18 ++-- t/mkinstall.sh | 31 ------- t/pr9.sh | 4 +- t/subdir.sh | 3 +- t/werror.sh | 14 ++- 17 files changed, 96 insertions(+), 305 deletions(-) delete mode 100755 lib/mkinstalldirs delete mode 100755 t/instman2.sh delete mode 100755 t/mkinstall.sh diff --git a/Makefile.am b/Makefile.am index baef18613..39cde8592 100644 --- a/Makefile.am +++ b/Makefile.am @@ -147,7 +147,6 @@ dist_script_DATA = \ lib/install-sh \ lib/mdate-sh \ lib/missing \ - lib/mkinstalldirs \ lib/elisp-comp \ lib/ylwrap \ lib/depcomp \ @@ -658,7 +657,7 @@ PERL_COVERAGE_FLAGS = -MDevel::Cover=-db,$(PERL_COVERAGE_DB),-silent,on,-summary PERL_COVER = cover check-coverage-run recheck-coverage-run: all - $(mkinstalldirs) $(PERL_COVERAGE_DB) + $(MKDIR_P) $(PERL_COVERAGE_DB) PERL5OPT="$$PERL5OPT $(PERL_COVERAGE_FLAGS)"; export PERL5OPT; \ WANT_NO_THREADS=yes; export WANT_NO_THREADS; unset AUTOMAKE_JOBS; \ $(MAKE) `echo $@ | sed 's/-coverage-run//'` diff --git a/NG-NEWS b/NG-NEWS index 73c4f759b..18aa0ce35 100644 --- a/NG-NEWS +++ b/NG-NEWS @@ -206,6 +206,11 @@ Miscellaneous as recommended in the Autoconf manual (as of Autoconf 2.69, chapter "Obsolete Constructs", section "acconfig.h"). +* The 'mkinstalldirs' script is not installed, distributed, nor provided + anymore; its same effects can be obtained by "install-sh -d" instead. + Similarly, the $(mkinstallscripts) make variable is not defined anymore; + one should use $(MKDIR_P) instead. + ----- Copyright (C) 2012 Free Software Foundation, Inc. diff --git a/automake.in b/automake.in index 6c840a359..c38f1b378 100644 --- a/automake.in +++ b/automake.in @@ -227,13 +227,40 @@ my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh); # Commonly found files we look for and automatically include in # distributed files. -my @common_files = - (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB - COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO - ar-lib compile config.guess config.rpath - config.sub depcomp elisp-comp install-sh libversion.in mdate-sh - missing mkinstalldirs py-compile texinfo.tex ylwrap), - @libtool_files, @libtool_sometimes); +my @common_files = ( + qw( + ABOUT-GNU + ABOUT-NLS + AUTHORS + BACKLOG + COPYING + COPYING.DOC + COPYING.LIB + COPYING.LESSER + ChangeLog + INSTALL + NEWS + README + THANKS + TODO + ar-lib + compile + config.guess + config.rpath + config.sub + depcomp + elisp-comp + install-sh + libversion.in + mdate-sh + missing + py-compile + texinfo.tex + ylwrap + ), + @libtool_files, + @libtool_sometimes, +); # Commonly used files we auto-include, but only sometimes. This list # is used for the --help output only. @@ -4037,26 +4064,6 @@ sub handle_configure ($$$@) FILES => "@distclean_config") if @distclean_config; - # Distribute and define mkinstalldirs only if it is already present - # in the package, for backward compatibility (some people may still - # use $(mkinstalldirs)). - my $mkidpath = "$config_aux_dir/mkinstalldirs"; - if (-f $mkidpath) - { - # Use require_file so that any existing script gets updated - # by --force-missing. - require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs'); - define_variable ('mkinstalldirs', - "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL); - } - else - { - # Use $(install_sh), not $(MKDIR_P) because the latter requires - # at least one argument, and $(mkinstalldirs) used to work - # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)). - define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL); - } - reject_var ('CONFIG_HEADER', "'CONFIG_HEADER' is an anachronism; now determined " . "automatically\nfrom '$configure_ac'"); diff --git a/contrib/multilib/config-ml.in b/contrib/multilib/config-ml.in index 0734a95b6..cc3a99dba 100644 --- a/contrib/multilib/config-ml.in +++ b/contrib/multilib/config-ml.in @@ -659,7 +659,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then fi if [ -d ${ml_dir} ]; then true; else - # ``mkdir -p ${ml_dir}'' See also mkinstalldirs. + # ``mkdir -p ${ml_dir}'' pathcomp="" for d in `echo ":${ml_dir}" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`; do pathcomp="$pathcomp$d" diff --git a/doc/automake-ng.texi b/doc/automake-ng.texi index eb4705c24..b6522fe85 100644 --- a/doc/automake-ng.texi +++ b/doc/automake-ng.texi @@ -2311,16 +2311,6 @@ maintainers. If the program in question doesn't exist, @command{missing} prints an informative warning and attempts to fix things so that the build can continue. -@item mkinstalldirs -This script used to be a wrapper around @samp{mkdir -p}, which is not -portable. Now we prefer to use @samp{install-sh -d} when @command{configure} -finds that @samp{mkdir -p} does not work, this makes one less script to -distribute. - -For backward compatibility @file{mkinstalldirs} is still used and -distributed when @command{automake} finds it in a package. But it is no -longer installed automatically, and it should be safe to remove it. - @item py-compile This is used to byte-compile Python scripts. @@ -2950,7 +2940,6 @@ Automake will look for various helper scripts, such as @file{ltmain.sh}, @file{mdate-sh}, @file{missing}, -@file{mkinstalldirs}, @file{py-compile}, @file{test-driver}, @file{texinfo.tex}, @@ -12919,7 +12908,7 @@ suite failures, please attach the @file{test-suite.log} file. @c LocalWords: pkg libdir cpio bindir sbindir rmt pax sbin zar zardir acindex @c LocalWords: HTML htmldir html noinst TEXINFOS nodist nobase strudel CFLAGS @c LocalWords: libmumble CC YFLAGS itemx de fication config url comp -@c LocalWords: depcomp elisp sh mdate mkinstalldirs mkdir py tex dvi ps pdf +@c LocalWords: depcomp elisp sh mdate mkdir py tex dvi ps pdf @c LocalWords: ylwrap zardoz INIT gettext acinclude mv FUNCS LIBOBJS LDADD fr @c LocalWords: uref featureful dnl src LINGUAS es ko nl pl sl sv PROG ISC doc @c LocalWords: POSIX STDC fcntl FUNC ALLOCA blksize struct stat intl po chmod diff --git a/lib/mkinstalldirs b/lib/mkinstalldirs deleted file mode 100755 index 96a79651e..000000000 --- a/lib/mkinstalldirs +++ /dev/null @@ -1,162 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy - -scriptversion=2009-04-28.21; # UTC - -# Original author: Noah Friedman -# Created: 1993-05-16 -# Public domain. -# -# This file is maintained in Automake-NG, please report -# bugs to or send patches to -# . - -nl=' -' -IFS=" "" $nl" -errstatus=0 -dirmode= - -usage="\ -Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... - -Create each directory DIR (with mode MODE, if specified), including all -leading file name components. - -Report bugs to ." - -# process command line arguments -while test $# -gt 0 ; do - case $1 in - -h | --help | --h*) # -h for help - echo "$usage" - exit $? - ;; - -m) # -m PERM arg - shift - test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } - dirmode=$1 - shift - ;; - --version) - echo "$0 $scriptversion" - exit $? - ;; - --) # stop option processing - shift - break - ;; - -*) # unknown option - echo "$usage" 1>&2 - exit 1 - ;; - *) # first non-opt arg - break - ;; - esac -done - -for file -do - if test -d "$file"; then - shift - else - break - fi -done - -case $# in - 0) exit 0 ;; -esac - -# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and -# mkdir -p a/c at the same time, both will detect that a is missing, -# one will create a, then the other will try to create a and die with -# a "File exists" error. This is a problem when calling mkinstalldirs -# from a parallel make. We use --version in the probe to restrict -# ourselves to GNU mkdir, which is thread-safe. -case $dirmode in - '') - if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - echo "mkdir -p -- $*" - exec mkdir -p -- "$@" - else - # On NextStep and OpenStep, the 'mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because '.' already - # exists. - test -d ./-p && rmdir ./-p - test -d ./--version && rmdir ./--version - fi - ;; - *) - if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && - test ! -d ./--version; then - echo "mkdir -m $dirmode -p -- $*" - exec mkdir -m "$dirmode" -p -- "$@" - else - # Clean up after NextStep and OpenStep mkdir. - for d in ./-m ./-p ./--version "./$dirmode"; - do - test -d $d && rmdir $d - done - fi - ;; -esac - -for file -do - case $file in - /*) pathcomp=/ ;; - *) pathcomp= ;; - esac - oIFS=$IFS - IFS=/ - set fnord $file - shift - IFS=$oIFS - - for d - do - test "x$d" = x && continue - - pathcomp=$pathcomp$d - case $pathcomp in - -*) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - else - if test ! -z "$dirmode"; then - echo "chmod $dirmode $pathcomp" - lasterr= - chmod "$dirmode" "$pathcomp" || lasterr=$? - - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi - fi - fi - - pathcomp=$pathcomp/ - done -done - -exit $errstatus - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/syntax-checks.mk b/syntax-checks.mk index a05402cac..9b273cf33 100644 --- a/syntax-checks.mk +++ b/syntax-checks.mk @@ -137,13 +137,17 @@ sc_no_for_variable_in_macro: exit 1; \ else :; fi -## Make sure all invocations of mkinstalldirs are correct. +## The script and variable 'mkinstalldirs' are obsolete. sc_mkinstalldirs: - @if grep -n 'mkinstalldirs' $(ams) \ - | grep -F -v '$$(mkinstalldirs)' \ - | grep -v '^\./Makefile.am:[0-9][0-9]*: *lib/mkinstalldirs \\$$'; \ - then \ - echo "Found incorrect use of mkinstalldirs in the lines above" 1>&2; \ + @files="\ + $(xtests) \ + $(pms) \ + $(ams) \ + $(srcdir)/automake.in \ + $(srcdir)/doc/*.texi \ + "; \ + if grep 'mkinstalldirs' $$files; then \ + echo "Found use of mkinstalldirs; that is obsolete" 1>&2; \ exit 1; \ else :; fi diff --git a/t/auxdir.sh b/t/auxdir.sh index c4860f4d2..f2abfd787 100755 --- a/t/auxdir.sh +++ b/t/auxdir.sh @@ -24,19 +24,20 @@ AC_INIT([$me], [1.0]) AC_CONFIG_AUX_DIR([./.]) AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile]) +AM_PATH_PYTHON END cat > Makefile.am << 'END' -pkgdata_DATA = +python_PYTHON = foo.py END -cp "$am_scriptdir/mkinstalldirs" . +cp "$am_scriptdir/py-compile" . # The "././" prefix confuses Automake into thinking it is doing a # subdir build. Yes, this is hacky. $ACLOCAL $AUTOMAKE ././Makefile -grep '/\./\./mkinstalldirs' Makefile.in +grep '/\./\./py-compile' Makefile.in : diff --git a/t/auxdir6.sh b/t/auxdir6.sh index 08de2415a..a6d68fdda 100755 --- a/t/auxdir6.sh +++ b/t/auxdir6.sh @@ -27,24 +27,25 @@ AC_INIT([$me], [1.0]) AC_CONFIG_AUX_DIR([auxdir]) AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile subdir/Makefile]) +AM_PATH_PYTHON END mkdir subdir auxdir cat > Makefile.am << 'END' -pkgdata_DATA = +python_PYTHON = foo.py END cp Makefile.am subdir/Makefile.am -: > auxdir/mkinstalldirs : > auxdir/install-sh : > auxdir/missing +: > auxdir/py-compile $ACLOCAL $AUTOMAKE -$FGREP '$(top_srcdir)/auxdir/mkinstalldirs' Makefile.in -$FGREP '$(top_srcdir)/auxdir/mkinstalldirs' subdir/Makefile.in +$FGREP '$(top_srcdir)/auxdir/py-compile' Makefile.in +$FGREP '$(top_srcdir)/auxdir/py-compile' subdir/Makefile.in : diff --git a/t/auxdir7.sh b/t/auxdir7.sh index 9a32bcbb8..bdf571efb 100755 --- a/t/auxdir7.sh +++ b/t/auxdir7.sh @@ -26,22 +26,23 @@ AC_INIT([$me], [1.0]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile subdir/Makefile]) +AM_PATH_PYTHON END mkdir subdir cat > Makefile.am << 'END' -pkgdata_DATA = +python_PYTHON = foo.py END cp Makefile.am subdir/Makefile.am -: > mkinstalldirs +: > py-compile $ACLOCAL $AUTOMAKE -$FGREP '$(top_srcdir)/mkinstalldirs' Makefile.in -$FGREP '$(top_srcdir)/mkinstalldirs' subdir/Makefile.in +$FGREP '$(top_srcdir)/py-compile' Makefile.in +$FGREP '$(top_srcdir)/py-compile' subdir/Makefile.in : diff --git a/t/auxdir8.sh b/t/auxdir8.sh index 4dd083549..21c346ebf 100755 --- a/t/auxdir8.sh +++ b/t/auxdir8.sh @@ -17,7 +17,7 @@ # Test to make sure AC_CONFIG_AUX_DIR works correctly. # This test tries without an explicit call to AC_CONFIG_AUX_DIR; # the config auxdir should be implicitly defined to '.' since -# the install-sh, mkinstalldirs, etc., scripts are in the top-level +# the install-sh, py-compile, etc., scripts are in the top-level # directory. # Keep this in sync with sister tests auxdir6.test and auxdir7.test. @@ -25,22 +25,23 @@ cat >> configure.ac << 'END' AC_CONFIG_FILES([subdir/Makefile]) +AM_PATH_PYTHON END mkdir subdir cat > Makefile.am << 'END' -pkgdata_DATA = +python_PYTHON = foo.py END cp Makefile.am subdir/Makefile.am -: > mkinstalldirs +: > py-compile $ACLOCAL $AUTOMAKE -$FGREP '$(top_srcdir)/mkinstalldirs' Makefile.in -$FGREP '$(top_srcdir)/mkinstalldirs' subdir/Makefile.in +$FGREP '$(top_srcdir)/py-compile' Makefile.in +$FGREP '$(top_srcdir)/py-compile' subdir/Makefile.in : diff --git a/t/instman2.sh b/t/instman2.sh deleted file mode 100755 index 04663dbef..000000000 --- a/t/instman2.sh +++ /dev/null @@ -1,33 +0,0 @@ -#! /bin/sh -# Copyright (C) 2000-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Test to make sure mkinstalldirs invocation correct in install-man -# target. Bug reported by Gordon Irlam . - -. ./defs || Exit 1 - -cat > Makefile.am << 'EOF' -man8_MANS = frob.8 -EOF - -: > frob.8 - -$ACLOCAL -$AUTOMAKE - -grep '^install-man' Makefile.in - -: diff --git a/t/mkinst3.sh b/t/mkinst3.sh index fbe01c652..79485349a 100755 --- a/t/mkinst3.sh +++ b/t/mkinst3.sh @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Test mkinstalldirs with spaces in directory names. +# Test "install-sh -d" with spaces in directory names. am_create_testdir=empty . ./defs || Exit 1 @@ -24,15 +24,15 @@ mkdir '~a b' && mkdir '~a b/-x y' \ || skip_ "directory names with spaces and metacharacters not accepted" rm -rf '~a b' -get_shell_script mkinstalldirs +get_shell_script install-sh -# Test mkinstalldirs with the installed mkdir. +# Test with the installed mkdir. -./mkinstalldirs '~a b/-x y' +./install-sh -d '~a b/-x y' test -d '~a b/-x y' rm -rf '~a b' -# Trick mkinstalldirs into thinking mkdir does not support -p. +# Trick install-sh into thinking mkdir does not support -p. mkdir bin cat >bin/mkdir <<'EOF' @@ -54,12 +54,14 @@ export AM_PATH PATH=`pwd`/bin$PATH_SEPARATOR$PATH export PATH -# Test mkinstalldirs without mkdir -p. +# Test without mkdir -p. -./mkinstalldirs '~a b/-x y' +./install-sh -d '~a b/-x y' test -d '~a b/-x y' rm -rf '~a b' -./mkinstalldirs "`pwd`///~a b//-x y" +./install-sh -d "`pwd`///~a b//-x y" test -d "`pwd`/~a b/-x y" rm -rf '~a b' + +: diff --git a/t/mkinstall.sh b/t/mkinstall.sh deleted file mode 100755 index e6b3bc22a..000000000 --- a/t/mkinstall.sh +++ /dev/null @@ -1,31 +0,0 @@ -#! /bin/sh -# Copyright (C) 1996-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Test for bug where mkinstalldirs variable can be set incorrectly. - -. ./defs || Exit 1 - -cat > Makefile.am << 'END' -pkgdata_DATA = -END - -# The "././" prefix confuses Automake into thinking it is doing a -# subdir build. Yes, this is hacky. -$ACLOCAL -$AUTOMAKE ././Makefile - -grep ' /mkinstalldirs' Makefile.in && Exit 1 -Exit 0 diff --git a/t/pr9.sh b/t/pr9.sh index 36a9f7e95..2556b8b80 100755 --- a/t/pr9.sh +++ b/t/pr9.sh @@ -20,8 +20,8 @@ # == Report == # When AC_CONFIG_AUX_DIR is set (in my case to 'support'), make dist # no longer automatically includes config.guess, config.sub, install-sh, -# ltconfig, ltmain.sh, mdate-sh, missing, and mkinstalldirs. In fact, -# the entire 'support/' directory is omitted. +# ltconfig, ltmain.sh, mdate-sh, and missing. In fact, the entire +# 'support/' directory is omitted. . ./defs || Exit 1 diff --git a/t/subdir.sh b/t/subdir.sh index 34b6ece88..2ce68b86b 100755 --- a/t/subdir.sh +++ b/t/subdir.sh @@ -14,8 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Test to make sure install-sh and mkinstalldirs correctly found in -# subdirs. +# Test to make sure install-sh is correctly found in subdirs. . ./defs || Exit 1 diff --git a/t/werror.sh b/t/werror.sh index 606fed620..7407e00de 100755 --- a/t/werror.sh +++ b/t/werror.sh @@ -16,11 +16,19 @@ # Test to make sure -Werror and --add-missing work together. +am_create_testdir=empty . ./defs || Exit 1 -: > Makefile.am - -rm -f install-sh depcomp missing mkinstalldirs +cat > configure.ac < Makefile.am +test ! -f install-sh # Sanity check. $ACLOCAL $AUTOMAKE -Werror --add-missing +test -f install-sh # Sanity check. + +: -- 2.47.2