1# Most of this is probably too coreutils-centric to be useful to other packages. 2 3bin=bin-$$$$ 4 5write_loser = printf '\#!%s\necho $$0: bad path 1>&2; exit 1\n' '$(SHELL)' 6 7tmpdir = $(abs_top_builddir)/tests/torture 8 9t=$(tmpdir)/$(PACKAGE)/test 10pfx=$(t)/i 11 12built_programs = \ 13 $$(echo 'spy:;@echo $$(bin_PROGRAMS)' \ 14 | MAKEFLAGS= $(MAKE) -s -f Makefile -f - spy \ 15 | fmt -1 | sed 's,$(EXEEXT)$$,,' | sort -u) 16 17# More than once, tainted build and source directory names would 18# have caused at least one "make check" test to apply "chmod 700" 19# to all directories under $HOME. Make sure it doesn't happen again. 20tp = $(tmpdir)/taint 21t_prefix = $(tp)/a 22t_taint = '$(t_prefix) b' 23fake_home = $(tp)/home 24 25# When extracting from a distribution tarball, extract using the fastest 26# method possible. With dist-xz, that means using the *.xz file. 27ifneq ('', $(filter *.xz, $(DIST_ARCHIVES))) 28 tar_decompress_opt_ = J 29 suffix_ = xz 30else 31 ifneq ('', $(filter *.gz, $(DIST_ARCHIVES))) 32 tar_decompress_opt_ = z 33 suffix_ = gz 34 else 35 tar_decompress_opt_ = j 36 suffix_ = bz2 37 endif 38endif 39amtar_extract_ = $(AMTAR) -$(tar_decompress_opt_)xf 40preferred_tarball_ = $(distdir).tar.$(suffix_) 41 42# Ensure that tests run from tainted build and src dir names work, 43# and don't affect anything in $HOME. Create witness files in $HOME, 44# record their attributes, and build/test. Then ensure that the 45# witnesses were not affected. 46# Skip this test when using libtool, since libtool-generated scripts 47# cannot deal with a space-tainted srcdir. 48ALL_RECURSIVE_TARGETS += taint-distcheck 49taint-distcheck: $(DIST_ARCHIVES) 50 grep '^[ ]*LT_INIT' configure.ac >/dev/null && exit 0 || : 51 test -d $(t_taint) && chmod -R 700 $(t_taint) || : 52 -rm -rf $(t_taint) $(fake_home) 53 mkdir -p $(t_prefix) $(t_taint) $(fake_home) 54 $(amtar_extract_) $(preferred_tarball_) -C $(t_taint) 55 mkfifo $(fake_home)/fifo 56 touch $(fake_home)/f 57 mkdir -p $(fake_home)/d/e 58 ls -lR $(fake_home) $(t_prefix) > $(tp)/.ls-before 59 HOME=$(fake_home); export HOME; \ 60 cd $(t_taint)/$(distdir) \ 61 && ./configure \ 62 && $(MAKE) \ 63 && $(MAKE) check \ 64 && ls -lR $(fake_home) $(t_prefix) > $(tp)/.ls-after \ 65 && diff $(tp)/.ls-before $(tp)/.ls-after \ 66 && test -d $(t_prefix) 67 rm -rf $(tp) 68 69# Verify that a twisted use of --program-transform-name=PROGRAM works. 70define install-transform-check 71 echo running install-transform-check \ 72 && rm -rf $(pfx) \ 73 && $(MAKE) program_transform_name='s/.*/zyx/' \ 74 prefix=$(pfx) install \ 75 && test "$$(echo $(pfx)/bin/*)" = "$(pfx)/bin/zyx" \ 76 && test "$$(find $(pfx)/share/man -type f|sed 's,.*/,,;s,\..*,,')" = "zyx" 77endef 78 79# Install, then verify that all binaries and man pages are in place. 80# Note that neither the binary, ginstall, nor the [.1 man page is installed. 81define my-instcheck 82 echo running my-instcheck; \ 83 $(MAKE) prefix=$(pfx) install \ 84 && test ! -f $(pfx)/bin/ginstall \ 85 && { fail=0; \ 86 for i in $(built_programs); do \ 87 test "$$i" = ginstall && i=install; \ 88 for j in "$(pfx)/bin/$$i" \ 89 "$(pfx)/share/man/man1/$$i.1"; do \ 90 case $$j in *'[.1') continue;; esac; \ 91 test -f "$$j" && : \ 92 || { echo "$$j not installed"; fail=1; }; \ 93 done; \ 94 done; \ 95 test $$fail = 1 && exit 1 || :; \ 96 } 97endef 98 99# The hard-linking for-loop below ensures that there is a bin/ directory 100# full of all of the programs under test (except the ones that are required 101# for basic Makefile rules), all symlinked to the just-built "false" program. 102# This is to ensure that if ever a test neglects to make PATH include 103# the build srcdir, these always-failing programs will run. 104# Otherwise, it is too easy to test the wrong programs. 105# Note that "false" itself is a symlink to true, so it too will malfunction. 106define coreutils-path-check 107 { \ 108 echo running coreutils-path-check; \ 109 if test -f $(srcdir)/src/true.c; then \ 110 fail=1; \ 111 mkdir $(bin) \ 112 && ($(write_loser)) > $(bin)/loser \ 113 && chmod a+x $(bin)/loser \ 114 && for i in $(built_programs); do \ 115 case $$i in \ 116 rm|expr|basename|echo|sort|ls|tr);; \ 117 cat|dirname|mv|wc);; \ 118 *) ln $(bin)/loser $(bin)/$$i;; \ 119 esac; \ 120 done \ 121 && ln -sf ../src/true $(bin)/false \ 122 && PATH=`pwd`/$(bin)$(PATH_SEPARATOR)$$PATH \ 123 $(MAKE) -C tests check \ 124 && { test -d gnulib-tests \ 125 && $(MAKE) -C gnulib-tests check \ 126 || :; } \ 127 && rm -rf $(bin) \ 128 && fail=0; \ 129 else \ 130 fail=0; \ 131 fi; \ 132 test $$fail = 1 && exit 1 || :; \ 133 } 134endef 135 136# More generic version of the rule above. 137define generic-path-check 138 { \ 139 echo running generic-path-check; \ 140 if test -f /bin/false; then \ 141 fail=1; \ 142 mkdir $(bin) \ 143 && ($(write_loser)) > $(bin)/loser \ 144 && chmod a+x $(bin)/loser \ 145 && for i in $(built_programs); do \ 146 ln $(bin)/loser $(bin)/$$i; \ 147 done \ 148 && PATH=`pwd`/$(bin)$(PATH_SEPARATOR)$$PATH \ 149 $(MAKE) check \ 150 && { test -d gnulib-tests \ 151 && $(MAKE) -C gnulib-tests check \ 152 || :; } \ 153 && rm -rf $(bin) \ 154 && fail=0; \ 155 else \ 156 fail=0; \ 157 fi; \ 158 test $$fail = 1 && exit 1 || :; \ 159 } 160endef 161 162# Use this to make sure we don't run these programs when building 163# from a virgin compressed tarball file, below. 164null_AM_MAKEFLAGS ?= \ 165 ACLOCAL=false \ 166 AUTOCONF=false \ 167 AUTOMAKE=false \ 168 AUTOHEADER=false \ 169 GPERF=false \ 170 MAKEINFO=false 171 172ALL_RECURSIVE_TARGETS += my-distcheck 173my-distcheck: $(DIST_ARCHIVES) $(local-check) 174 $(MAKE) syntax-check 175 $(MAKE) check 176 -rm -rf $(t) 177 mkdir -p $(t) 178 $(amtar_extract_) $(preferred_tarball_) -C $(t) 179 (set -e; cd $(t)/$(distdir); \ 180 ./configure --quiet --enable-gcc-warnings --disable-nls; \ 181 $(MAKE) AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)'; \ 182 $(MAKE) dvi; \ 183 $(install-transform-check); \ 184 $(my-instcheck); \ 185 $(coreutils-path-check); \ 186 $(generic-path-check); \ 187 $(MAKE) distclean \ 188 ) 189 (cd $(t) && mv $(distdir) $(distdir).old \ 190 && $(amtar_extract_) - ) < $(preferred_tarball_) 191 find $(t)/$(distdir).old $(t)/$(distdir) -name .deps | xargs rmdir 192 diff -ur $(t)/$(distdir).old $(t)/$(distdir) 193 -rm -rf $(t) 194 rmdir $(tmpdir)/$(PACKAGE) $(tmpdir) 195 @echo "========================"; \ 196 echo "ready for distribution:"; \ 197 for i in $(DIST_ARCHIVES); do echo " $$i"; done; \ 198 echo "========================" 199