1#! /bin/sh 2# Copyright (C) 2008-2021 Free Software Foundation, Inc. 3# 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2, or (at your option) 7# any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <https://www.gnu.org/licenses/>. 16 17# Installing many files should not exceed the command line length limit. 18 19# This is the mans sister test of 'instmany.sh', see there for details. 20 21. test-init.sh 22 23# In order to have a useful test on modern systems (which have a high 24# limit, if any), use a fake install program that errors out for more 25# than 2K characters in a command line. The POSIX limit is 4096, but 26# that may include space taken up by the environment. 27 28limit=2500 29subdir=long_subdir_name_with_many_characters 30nfiles=81 31list=$(seq_ 1 $nfiles) 32 33oPATH=$PATH; export oPATH 34nPATH=$(pwd)/x-bin$PATH_SEPARATOR$PATH; export nPATH 35 36mkdir x-bin 37 38sed "s|@limit@|$limit|g" >x-bin/my-install <<'END' 39#! /bin/sh 40limit=@limit@ 41PATH=$oPATH; export PATH 42if test -z "$orig_INSTALL"; then 43 echo "$0: \$orig_INSTALL variable not set" >&2 44 exit 1 45fi 46len=`expr "$orig_INSTALL $*" : ".*" 2>/dev/null || echo $limit` 47if test $len -ge $limit; then 48 echo "$0: safe command line limit of $limit characters exceeded" >&2 49 exit 1 50fi 51exec $orig_INSTALL "$@" 52exit 1 53END 54 55# Creative quoting in the next line to please maintainer-check. 56sed "s|@limit@|$limit|g" >x-bin/'rm' <<'END' 57#! /bin/sh 58limit=@limit@ 59PATH=$oPATH; export PATH 60RM='rm -f' 61len=`expr "$RM $*" : ".*" 2>/dev/null || echo $limit` 62if test $len -ge $limit; then 63 echo "$0: safe command line limit of $limit characters exceeded" >&2 64 exit 1 65fi 66exec $RM "$@" 67exit 1 68END 69 70# Creative quoting in the next line to please maintainer-check. 71chmod +x x-bin/'rm' x-bin/my-install 72 73cat >setenv.in <<'END' 74orig_INSTALL='@INSTALL@' 75# In case we've falled back on the install-sh script (seen e.g., 76# on AIX 7.1), we need to make sure we use its absolute path, 77# as we don't know from which directory we'll be run. 78case "$orig_INSTALL" in 79 /*) ;; 80 */*) orig_INSTALL=$(pwd)/$orig_INSTALL;; 81esac 82export orig_INSTALL 83END 84 85cat >>configure.ac <<END 86AC_CONFIG_FILES([setenv.sh:setenv.in]) 87AC_CONFIG_FILES([$subdir/Makefile]) 88AC_OUTPUT 89END 90 91cat >Makefile.am <<END 92SUBDIRS = $subdir 93END 94 95mkdir $subdir 96cd $subdir 97 98cat >Makefile.am <<'END' 99man_MANS = 100man3_MANS = 101notrans_man_MANS = 102notrans_man3_MANS = 103END 104 105for n in $list; do 106 unindent >>Makefile.am <<END 107 man_MANS += page$n.1 108 man3_MANS += page$n.man 109 notrans_man_MANS += npage$n.1 110 notrans_man3_MANS += npage$n.man 111END 112 echo >page$n.1 113 echo >page$n.man 114 echo >npage$n.1 115 echo >npage$n.man 116done 117 118cd .. 119$ACLOCAL 120$AUTOCONF 121$AUTOMAKE --add-missing 122 123instdir=$(pwd)/inst 124mkdir build 125cd build 126../configure --prefix="$instdir" 127. ./setenv.sh 128test -n "$orig_INSTALL" 129$MAKE 130# Try whether native install (or install-sh) works. 131$MAKE install 132test -f "$instdir/share/man/man1/page1.1" 133# Multiple uninstall should work, too. 134$MAKE uninstall 135$MAKE uninstall 136test $(find "$instdir" -type f -print | wc -l) -eq 0 137 138# Try whether we don't exceed the low limit. 139PATH=$nPATH; export PATH 140run_make INSTALL=my-install install 141test -f "$instdir/share/man/man1/page1.1" 142run_make INSTALL=my-install uninstall 143test $(find "$instdir" -type f -print | wc -l) -eq 0 144PATH=$oPATH; export PATH 145 146cd $subdir 147srcdir=../../$subdir 148 149# Ensure 'make install' fails when 'install' fails. 150 151# We cheat here, for efficiency, knowing the internal rule names. 152# For correctness, one should '$MAKE install' here always, or at 153# least use install-exec or install-data. 154 155for file in page3.1 page$nfiles.1 npage3.1 npage$nfiles.1; do 156 chmod a-r $srcdir/$file 157 test ! -r $srcdir/$file || skip_ "cannot drop file read permissions" 158 $MAKE install-man1 && exit 1 159 chmod u+r $srcdir/$file 160done 161 162for file in page3.man page$nfiles.man npage3.man npage$nfiles.man; do 163 chmod a-r $srcdir/$file 164 $MAKE install-man3 && exit 1 165 chmod u+r $srcdir/$file 166done 167 168: 169