Makefile revision 1.14 1 1.3 riastrad PROG= vndcompress
2 1.6 riastrad SRCS= main.c offtab.c utils.c vndcompress.c vnduncompress.c
3 1.3 riastrad
4 1.3 riastrad LINKS= ${BINDIR}/vndcompress ${BINDIR}/vnduncompress
5 1.3 riastrad MLINKS= vndcompress.1 vnduncompress.1
6 1.1 hubertf
7 1.3 riastrad DPADD+= ${LIBZ}
8 1.1 hubertf LDADD+= -lz
9 1.1 hubertf
10 1.8 riastrad WARNS= 5
11 1.8 riastrad
12 1.1 hubertf .include <bsd.prog.mk>
13 1.3 riastrad
14 1.3 riastrad TESTFILES+= oneblock
15 1.3 riastrad XFAIL+= oneblock.in-outx
16 1.3 riastrad XFAIL+= oneblock.cl2-cl2x
17 1.3 riastrad oneblock.in:
18 1.3 riastrad head -c 512 < /usr/share/dict/words > ${.TARGET}.tmp \
19 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
20 1.3 riastrad
21 1.3 riastrad TESTFILES+= tenblock
22 1.3 riastrad XFAIL+= tenblock.in-outx
23 1.3 riastrad XFAIL+= tenblock.cl2-cl2x
24 1.3 riastrad tenblock.in:
25 1.3 riastrad head -c 5120 < /usr/share/dict/words > ${.TARGET}.tmp \
26 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
27 1.3 riastrad
28 1.3 riastrad TESTFILES+= smallfile
29 1.3 riastrad XFAIL+= smallfile.in-outx
30 1.3 riastrad XFAIL+= smallfile.cl2-cl2x
31 1.3 riastrad smallfile.in:
32 1.3 riastrad head -c 12345 < /usr/share/dict/words > ${.TARGET}.tmp \
33 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
34 1.3 riastrad
35 1.3 riastrad CHECKS+= check-pipe
36 1.3 riastrad CLEANFILES+= smallfile.cl2pipe
37 1.3 riastrad check-pipe: .PHONY smallfile.cl2 smallfile.cl2pipe
38 1.3 riastrad cmp ${.ALLSRC}
39 1.3 riastrad smallfile.cl2pipe: smallfile.in vndcompress
40 1.3 riastrad head -c 54321 < /usr/share/dict/words \
41 1.3 riastrad | ./vndcompress -l 12345 /dev/stdin ${.TARGET}.tmp \
42 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
43 1.3 riastrad
44 1.3 riastrad TESTFILES+= onechunk
45 1.3 riastrad onechunk.in:
46 1.3 riastrad head -c 65536 < /usr/share/dict/words > ${.TARGET}.tmp \
47 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
48 1.3 riastrad
49 1.3 riastrad TESTFILES+= tenchunk
50 1.3 riastrad tenchunk.in:
51 1.3 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
52 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
53 1.3 riastrad
54 1.3 riastrad TESTFILES+= extrablock
55 1.3 riastrad XFAIL+= extrablock.in-outx
56 1.3 riastrad XFAIL+= extrablock.cl2-cl2x
57 1.3 riastrad extrablock.in:
58 1.3 riastrad head -c $$((65536 + 512)) < /usr/share/dict/words > ${.TARGET}.tmp \
59 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
60 1.3 riastrad
61 1.3 riastrad TESTFILES+= medfile
62 1.3 riastrad XFAIL+= medfile.in-outx
63 1.3 riastrad XFAIL+= medfile.cl2-cl2x
64 1.3 riastrad medfile.in:
65 1.3 riastrad head -c 123456 < /usr/share/dict/words > ${.TARGET}.tmp \
66 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
67 1.3 riastrad
68 1.3 riastrad TESTFILES+= onetinyblock
69 1.3 riastrad BLOCKSIZE.onetinyblock= 512
70 1.3 riastrad onetinyblock.in:
71 1.3 riastrad head -c 512 < /usr/share/dict/words > ${.TARGET}.tmp \
72 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
73 1.3 riastrad
74 1.3 riastrad TESTFILES+= tentinyblock
75 1.3 riastrad BLOCKSIZE.tentinyblock= 512
76 1.3 riastrad tentinyblock.in:
77 1.3 riastrad head -c 5120 < /usr/share/dict/words > ${.TARGET}.tmp \
78 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
79 1.3 riastrad
80 1.14 riastrad # Make sure we can restart from a pipe.
81 1.3 riastrad CHECKS+= check-pipe-restart
82 1.3 riastrad CLEANFILES+= piperestart.in piperestart.in.tmp
83 1.3 riastrad CLEANFILES+= piperestart.cl2 piperestart.cl2.tmp
84 1.3 riastrad CLEANFILES+= piperestart.cl2restart piperestart.cl2restart.tmp
85 1.3 riastrad CLEANFILES+= piperestart.cl2part piperestart.cl2part.tmp
86 1.3 riastrad check-pipe-restart: .PHONY piperestart.cl2 piperestart.cl2restart
87 1.3 riastrad cmp ${.ALLSRC}
88 1.3 riastrad piperestart.cl2restart: piperestart.cl2part vndcompress
89 1.3 riastrad cp piperestart.cl2part ${.TARGET}.tmp \
90 1.3 riastrad && head -c 700000 < /usr/share/dict/words \
91 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r -R /dev/stdin ${.TARGET}.tmp \
92 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
93 1.9 riastrad # The following rule uses ; and not && on purpose: vndcompress is
94 1.9 riastrad # supposed to fail (and it is even OK to interrupt!) so we can restart
95 1.9 riastrad # and fill in the rest.
96 1.3 riastrad piperestart.cl2part: vndcompress
97 1.3 riastrad head -c 600000 < /usr/share/dict/words \
98 1.3 riastrad | ./vndcompress -l 655360 -k 1 /dev/stdin ${.TARGET}.tmp; \
99 1.3 riastrad mv -f ${.TARGET}.tmp ${.TARGET}
100 1.3 riastrad piperestart.in:
101 1.3 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
102 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
103 1.3 riastrad
104 1.14 riastrad # Make sure we can restart from a pipe even if the original start was
105 1.14 riastrad # corrupted, as long as we don't pass -R.
106 1.14 riastrad CHECKS+= check-pipe-badstart
107 1.14 riastrad CLEANFILES+= pipebadstart.in pipebadstart.in.tmp
108 1.14 riastrad CLEANFILES+= pipebadstart.cl2 pipebadstart.cl2.tmp
109 1.14 riastrad CLEANFILES+= pipebadstart.cl2restart pipebadstart.cl2restart.tmp
110 1.14 riastrad CLEANFILES+= pipebadstart.cl2part pipebadstart.cl2part.tmp
111 1.14 riastrad check-pipe-badstart: .PHONY pipebadstart.cl2 pipebadstart.cl2restart
112 1.14 riastrad cmp ${.ALLSRC}
113 1.14 riastrad pipebadstart.cl2restart: pipebadstart.cl2part vndcompress
114 1.14 riastrad cp pipebadstart.cl2part ${.TARGET}.tmp \
115 1.14 riastrad && head -c 700000 < /usr/share/dict/words \
116 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r /dev/stdin ${.TARGET}.tmp \
117 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
118 1.14 riastrad pipebadstart.cl2part:
119 1.14 riastrad touch ${.TARGET}
120 1.14 riastrad pipebadstart.in:
121 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
122 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
123 1.14 riastrad
124 1.14 riastrad # Make sure we can `restart' even if there's nothing there.
125 1.14 riastrad CHECKS+= check-pipe-falsestart
126 1.14 riastrad CLEANFILES+= pipefalsestart.in pipefalsestart.in.tmp
127 1.14 riastrad CLEANFILES+= pipefalsestart.cl2 pipefalsestart.cl2.tmp
128 1.14 riastrad CLEANFILES+= pipefalsestart.cl2restart pipefalsestart.cl2restart.tmp
129 1.14 riastrad check-pipe-falsestart: .PHONY pipefalsestart.cl2 pipefalsestart.cl2restart
130 1.14 riastrad cmp ${.ALLSRC}
131 1.14 riastrad pipefalsestart.cl2restart: vndcompress
132 1.14 riastrad rm -f ${.TARGET}.tmp \
133 1.14 riastrad && head -c 700000 < /usr/share/dict/words \
134 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r /dev/stdin ${.TARGET}.tmp \
135 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
136 1.14 riastrad pipefalsestart.in:
137 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
138 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
139 1.14 riastrad
140 1.14 riastrad # Make sure we can restart from a file, simulated with `-p'.
141 1.3 riastrad CHECKS+= check-part
142 1.14 riastrad CLEANFILES+= part.orig part.orig.tmp
143 1.14 riastrad CLEANFILES+= part.cl2part part.cl2part.tmp
144 1.14 riastrad CLEANFILES+= part.cl2 part.cl2.tmp
145 1.14 riastrad CLEANFILES+= part.out part.out.tmp
146 1.3 riastrad check-part: .PHONY part.orig part.out
147 1.3 riastrad cmp part.orig part.out
148 1.3 riastrad part.cl2: part.orig part.cl2part vndcompress
149 1.3 riastrad cp part.cl2part ${.TARGET}.tmp \
150 1.14 riastrad && ./vndcompress -b 512 -r -R part.orig ${.TARGET}.tmp \
151 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
152 1.3 riastrad part.cl2part: part.orig vndcompress
153 1.12 riastrad ./vndcompress -b 512 -p 10 part.orig ${.TARGET}.tmp \
154 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
155 1.3 riastrad part.orig:
156 1.3 riastrad head -c 12345 < /usr/share/dict/words > ${.TARGET}.tmp \
157 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
158 1.3 riastrad
159 1.14 riastrad # Make sure we can `restart' even if there's nothing there.
160 1.14 riastrad CHECKS+= check-falsestart
161 1.14 riastrad CLEANFILES+= falsestart.in falsestart.in.tmp
162 1.14 riastrad CLEANFILES+= falsestart.cl2 falsestart.cl2.tmp
163 1.14 riastrad CLEANFILES+= falsestart.cl2restart falsestart.cl2restart.tmp
164 1.14 riastrad check-falsestart: .PHONY falsestart.cl2 falsestart.cl2restart
165 1.14 riastrad cmp ${.ALLSRC}
166 1.14 riastrad falsestart.cl2restart: vndcompress falsestart.in
167 1.14 riastrad rm -f ${.TARGET}.tmp \
168 1.14 riastrad && ./vndcompress -r falsestart.in ${.TARGET}.tmp \
169 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
170 1.14 riastrad falsestart.in:
171 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
172 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
173 1.14 riastrad
174 1.10 riastrad TESTFILES+= smallwindow
175 1.10 riastrad smallwindow.in:
176 1.10 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \
177 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
178 1.10 riastrad smallwindow.cl2: smallwindow.in
179 1.10 riastrad ./vndcompress -w 1 ${.IMPSRC} ${.TARGET}.tmp \
180 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
181 1.10 riastrad smallwindow.out: smallwindow.cl2
182 1.10 riastrad ./vndcompress -w 1 -d ${.IMPSRC} ${.TARGET}.tmp \
183 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
184 1.10 riastrad
185 1.10 riastrad CHECKS+= check-pipewindow
186 1.10 riastrad check-pipewindow: smallwindow.cl2
187 1.10 riastrad @echo '# expecting failure...'
188 1.10 riastrad if cat smallwindow.cl2 | ./vndcompress -w 1 -d /dev/stdin /dev/null; \
189 1.10 riastrad then \
190 1.10 riastrad echo 'unexpected pass!' && exit 1; \
191 1.10 riastrad fi
192 1.10 riastrad
193 1.11 riastrad # The following two tests try to ensure a limited window size means
194 1.11 riastrad # limited memory allocation. They don't work very well. The virtual
195 1.11 riastrad # address space rlimit (ulimit -v, RLIMIT_AS) must cover the stack size
196 1.11 riastrad # that is allocated automatically for the process, which varies from
197 1.11 riastrad # machine architecture to machine architecture (the kernel's MAXSSIZ
198 1.11 riastrad # parameter), as well as any shared libraries that get loaded in and
199 1.11 riastrad # other auxiliary crud the loader or libc might allocate.
200 1.11 riastrad #
201 1.11 riastrad # In principle, the overhead from that and the program image should be
202 1.11 riastrad # constant, and the only substantial memory allocation performed by
203 1.11 riastrad # vndcompress should be w*8 bytes or (n/b)*8, where w is the window
204 1.11 riastrad # size if specified, n is the size of the input, and b is the block
205 1.11 riastrad # size.
206 1.11 riastrad #
207 1.11 riastrad # We could perhaps do an exponential growth and then binary search on
208 1.11 riastrad # the virtual address space limit to determine the overhead, but that's
209 1.11 riastrad # more trouble than I care to do in a makefile right now. Currently
210 1.11 riastrad # this is calibrated for NetBSD/amd64 6, where 128 MB of virtual
211 1.11 riastrad # address space is allocated for the stack. (Note `ulimit -v' takes a
212 1.11 riastrad # number of kilobytes, not a number of bytes.) Since this is not
213 1.11 riastrad # reliable, however, these are commented out.
214 1.11 riastrad
215 1.11 riastrad #CHECKS+= check-ulimit
216 1.11 riastrad #check-ulimit:
217 1.11 riastrad # @echo '# expecting failure...'
218 1.11 riastrad # if head -c $$((64 * 1024 * 1024)) < /dev/zero \
219 1.11 riastrad # | (ulimit -v $$((139 * 1024)) && \
220 1.13 riastrad # ./vndcompress -w 0 -l 64m -b 512 /dev/stdin /dev/null); then \
221 1.11 riastrad # echo 'unexpected pass!' && exit 1; \
222 1.11 riastrad # fi
223 1.11 riastrad #
224 1.11 riastrad #CHECKS+= check-ulimit-window
225 1.11 riastrad #check-ulimit-window:
226 1.11 riastrad # head -c $$((64 * 1024 * 1024)) < /dev/zero \
227 1.11 riastrad # | (ulimit -v $$((139 * 1024)) && \
228 1.12 riastrad # ./vndcompress -w 8192 -l 64m -b 512 /dev/stdin /dev/null)
229 1.10 riastrad
230 1.3 riastrad TESTSUFFIXES+= in cl2 cl2x out outx
231 1.3 riastrad
232 1.3 riastrad TESTFORMS+= cl2 cl2x
233 1.3 riastrad TESTFORMS+= in out
234 1.3 riastrad TESTFORMS+= in outx
235 1.3 riastrad
236 1.3 riastrad .for testfile in ${TESTFILES}
237 1.3 riastrad . for suffix in ${TESTSUFFIXES}
238 1.3 riastrad CLEANFILES+= ${testfile}.${suffix}
239 1.3 riastrad CLEANFILES+= ${testfile}.${suffix}.tmp
240 1.3 riastrad . endfor
241 1.3 riastrad . for left right in ${TESTFORMS}
242 1.3 riastrad CHECKS.${testfile}+= check-${testfile}.${left}-${right}
243 1.3 riastrad check-${testfile}.${left}-${right}: .PHONY \
244 1.3 riastrad ${testfile}.${left} ${testfile}.${right}
245 1.3 riastrad . if empty(XFAIL:M${testfile}.${left}-${right})
246 1.3 riastrad cmp ${testfile}.${left} ${testfile}.${right}
247 1.3 riastrad . else
248 1.3 riastrad @echo '# expecting failure...' \
249 1.3 riastrad && echo 'cmp ${testfile}.${left} ${testfile}.${right}' \
250 1.3 riastrad && if cmp ${testfile}.${left} ${testfile}.${right}; then \
251 1.3 riastrad echo 'unexpected pass!' \
252 1.3 riastrad && exit 1; \
253 1.3 riastrad fi
254 1.3 riastrad . endif
255 1.3 riastrad . endfor
256 1.3 riastrad check-${testfile}: ${CHECKS.${testfile}}
257 1.3 riastrad CHECKS+= check-${testfile}
258 1.3 riastrad .endfor
259 1.3 riastrad
260 1.3 riastrad check: .PHONY ${CHECKS}
261 1.3 riastrad
262 1.3 riastrad .SUFFIXES: .cl2 .cl2x .in .out .outx
263 1.3 riastrad
264 1.10 riastrad # XXX These tests should automatically try different window sizes, but
265 1.10 riastrad # that is tricky to express in make.
266 1.10 riastrad
267 1.3 riastrad .in.cl2: vndcompress
268 1.7 riastrad ./vndcompress ${.IMPSRC} ${.TARGET}.tmp ${BLOCKSIZE.${.PREFIX}} \
269 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
270 1.3 riastrad
271 1.3 riastrad .in.cl2x:
272 1.7 riastrad vndcompress ${.IMPSRC} ${.TARGET}.tmp ${BLOCKSIZE.${.PREFIX}} \
273 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
274 1.3 riastrad
275 1.3 riastrad .cl2.out: vndcompress
276 1.7 riastrad ./vndcompress -d ${.IMPSRC} ${.TARGET}.tmp \
277 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
278 1.3 riastrad
279 1.3 riastrad .cl2.outx:
280 1.7 riastrad vnduncompress ${.IMPSRC} ${.TARGET}.tmp \
281 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET}
282