1 | # Most of this is probably too coreutils-centric to be useful to other packages.
|
---|
2 |
|
---|
3 | bin=bin-$$$$
|
---|
4 |
|
---|
5 | write_loser = printf '\#!%s\necho $$0: bad path 1>&2; exit 1\n' '$(SHELL)'
|
---|
6 |
|
---|
7 | tmpdir = $(abs_top_builddir)/tests/torture
|
---|
8 |
|
---|
9 | t=$(tmpdir)/$(PACKAGE)/test
|
---|
10 | pfx=$(t)/i
|
---|
11 |
|
---|
12 | built_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.
|
---|
20 | tp = $(tmpdir)/taint
|
---|
21 | t_prefix = $(tp)/a
|
---|
22 | t_taint = '$(t_prefix) b'
|
---|
23 | fake_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.
|
---|
27 | ifneq ('', $(filter *.xz, $(DIST_ARCHIVES)))
|
---|
28 | tar_decompress_opt_ = J
|
---|
29 | suffix_ = xz
|
---|
30 | else
|
---|
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
|
---|
38 | endif
|
---|
39 | amtar_extract_ = $(AMTAR) -$(tar_decompress_opt_)xf
|
---|
40 | preferred_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.
|
---|
48 | ALL_RECURSIVE_TARGETS += taint-distcheck
|
---|
49 | taint-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.
|
---|
70 | define 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"
|
---|
77 | endef
|
---|
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.
|
---|
81 | define 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 | }
|
---|
97 | endef
|
---|
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.
|
---|
106 | define 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 | }
|
---|
134 | endef
|
---|
135 |
|
---|
136 | # More generic version of the rule above.
|
---|
137 | define 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 | }
|
---|
160 | endef
|
---|
161 |
|
---|
162 | # Use this to make sure we don't run these programs when building
|
---|
163 | # from a virgin compressed tarball file, below.
|
---|
164 | null_AM_MAKEFLAGS ?= \
|
---|
165 | ACLOCAL=false \
|
---|
166 | AUTOCONF=false \
|
---|
167 | AUTOMAKE=false \
|
---|
168 | AUTOHEADER=false \
|
---|
169 | GPERF=false \
|
---|
170 | MAKEINFO=false
|
---|
171 |
|
---|
172 | ALL_RECURSIVE_TARGETS += my-distcheck
|
---|
173 | my-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 "========================"
|
---|