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