2 include @TOP_OBJDIR@/src/config/Makefile.config
3 include @TOP_OBJDIR@/src/config/Makefile.lwp
6 INSTALL_DATA = @INSTALL_DATA@
7 INSTALL_PROGRAM = @INSTALL_PROGRAM@
8 INSTALL_SCRIPT = @INSTALL_SCRIPT@
12 INCDIRS=-I${TOP_OBJDIR}/src/config -I${TOP_INCDIR}/afs -I${TOP_INCDIR}
13 INCLIBS=-L${SRCDIR}/lib/afs -L${TOP_LIBDIR}
18 ${TOP_LIBDIR}/libauth.a \
19 ${TOP_LIBDIR}/libaudit.a \
20 ${TOP_LIBDIR}/libvolser.a \
21 ${TOP_LIBDIR}/libvldb.a \
22 ${TOP_LIBDIR}/libubik.a \
23 ${TOP_LIBDIR}/librxkad.a \
24 ${TOP_LIBDIR}/libsys.a \
25 ${TOP_LIBDIR}/librx.a \
26 ${TOP_LIBDIR}/liblwp.a \
27 ${TOP_LIBDIR}/util.a \
28 ${TOP_LIBDIR}/libafscom_err.a \
31 OBJS_afsdump_scan = afsdump_scan.o repair.o
32 OBJS_afsdump_xsed = afsdump_xsed.o repair.o
33 OBJS_libxfiles.a = xfiles.o xf_errs.o xf_printf.o int64.o \
34 xf_files.o xf_rxcall.o xf_profile.o
35 OBJS_libdumpscan.a = primitive.o util.o dumpscan_errs.o parsetag.o \
36 parsedump.o parsevol.o parsevnode.o dump.o \
37 directory.o pathname.o backuphdr.o stagehdr.o
39 TARGETS = libxfiles.a libdumpscan.a \
40 afsdump_scan afsdump_dirlist afsdump_extract dumptool
42 all: run-tests OpenAFS/Dirpath.pm libxfiles.a libdumpscan.a $(TEST_PROGRAMS)\
43 afsdump_scan afsdump_dirlist afsdump_extract dumptool OpenAFS/Dirpath.sh
46 generated: xf_errs.c xf_errs.h dumpscan_errs.c dumpscan_errs.h
48 afsdump_scan: libxfiles.a libdumpscan.a $(OBJS_afsdump_scan)
49 $(AFS_LDRULE) $(OBJS_afsdump_scan) $(LIBS)
52 afsdump_xsed: libxfiles.a libdumpscan.a $(OBJS_afsdump_xsed)
53 $(AFS_LDRULE) $(OBJS_afsdump_xsed) $(LIBS)
55 afsdump_dirlist: libxfiles.a libdumpscan.a afsdump_dirlist.o
56 $(AFS_LDRULE) afsdump_dirlist.o $(LIBS)
58 afsdump_extract: libxfiles.a libdumpscan.a afsdump_extract.o
59 $(AFS_LDRULE) afsdump_extract.o $(LIBS)
61 null-search: libxfiles.a libdumpscan.a null-search.c
62 $(AFS_LDRULE) null-search.c $(LIBS)
65 $(AFS_LDRULE) dumptool dumptool.c
67 libxfiles.a: $(OBJS_libxfiles.a)
69 $(AR) r libxfiles.a $(OBJS_libxfiles.a)
72 libdumpscan.a: $(OBJS_libdumpscan.a)
74 $(AR) r libdumpscan.a $(OBJS_libdumpscan.a)
75 $(RANLIB) libdumpscan.a
77 xf_errs.c xf_errs.h: xf_errs.et
78 $(COMPILE_ET) xf_errs.et
80 dumpscan_errs.c dumpscan_errs.h: dumpscan_errs.et
81 $(COMPILE_ET) dumpscan_errs.et
83 util.o xfiles.o xf_files.o: xf_errs.h
84 backuphdr.o directory.o parsedump.o parsetag.o: dumpscan_errs.h
85 parsevnode.o parsevol.o pathname.o stagehdr.o: dumpscan_errs.h
86 util.o: dumpscan_errs.h
88 # repair addresses the same storage as two different types of structs at the
90 CFLAGS_repair.o = @CFLAGS_NOSTRICT@
91 repair.o: repair.c dumpscan_errs.h
93 ${TOP_LIBDIR}/libxfiles.a: libxfiles.a
96 ${TOP_LIBDIR}/libdumpscan.a: libdumpscan.a
99 SYS_LIBS = ${TOP_LIBDIR}/libsys.a ${TOP_LIBDIR}/librx.a ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/util.a
101 AUTH_LIBS = ${TOP_LIBDIR}/libauth.a ${SYS_LIBS}
103 INT_LIBS = ${TOP_LIBDIR}/libafsint.a ${TOP_LIBDIR}/libsys.a ${TOP_LIBDIR}/librxkad.a ${TOP_LIBDIR}/librx.a ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/libafscom_err.a ${TOP_LIBDIR}/util.a
105 TEST_PROGRAMS = write-ro-file hello-world read-vs-mmap read-vs-mmap2 \
106 mmap-and-read large-dir large-dir2 large-dir3 mountpoint \
107 test-setgroups test-setpag hardlink1 hardlink2 mkdir2 \
108 create-files create-symlinks create-dirs dup2-and-unlog \
109 readdir-vs-lstat read-write create-remove mkdir3 \
110 symlink echo-n test-parallel1 test-parallel2 create-stat \
111 kill-softly kill-softer rm-rf exit-wo-close \
112 mmap-vs-read mmap-vs-read2 strange-characters-c pine \
113 append-over-page write-ucc utime-dir mmap-shared-write \
114 rename5 rename-under-feet write-closed write-closed2 \
115 truncate fchmod make-page utime-file rename6 \
116 write3 still-there-p write-large afscp hardlink4 \
117 intr-read asu truncate-files mmap-cat blocks-new-file \
120 TEST_OBJS = write-ro-file.o read-vs-mmap.o read-vs-mmap2.o \
121 mmap-and-read.o large-dir.o large-dir2.o large-dir3.o \
122 test-setgroups.o test-setpag.o hardlink1.o hardlink2.o \
123 mkdir2.o create-files.o create-symlinks.o create-dirs.o \
124 dup2-and-unlog.o readdir-vs-lstat.o read-write.o \
125 create-remove.o symlink.o echo-n.o test-parallel1.o \
126 test-parallel1.o mkdir3.o rename6.o \
127 create-stat.o kill-softly.o kill-softer.o rm-rf.o \
128 exit-wo-close.o mmap-vs-read.o mmap-vs-read2.o \
129 strange-characters-c.o pine.o append-over-page.o \
130 write-ucc.o utime-dir.o mmap-shared-write.o rename5.o \
131 rename-under-feet.o write-closed.o write-closed2.o \
132 truncate.o fchmod.o make-page.o utime-file.o \
133 write3.o still-there-p.o write-large.o hardlink4.o \
134 intr-read.o asu.o truncate-files.o mmap-cat.o \
135 blocks-new-file.o fsx.o afscp.o afscp_callback.o \
138 TEST_SRCS = write-ro-file.c read-vs-mmap.c read-vs-mmap2.c \
139 mmap-and-read.c large-dir.c large-dir2.c large-dir3.c \
140 test-setgroups.c test-setpag.c hardlink1.c hardlink2.c \
141 mkdir2.c create-files.c create-symlinks.c create-dirs.c \
142 dup2-and-unlog.c readdir-vs-lstat.c read-write.c \
143 create-remove.c symlink.c echo-n.c test-parallel1.c \
144 test-parallel2.c mkdir3.c rename6.c \
145 create-stat.c kill-softly.c kill-softer.c rm-rf.c \
146 exit-wo-close.c mmap-vs-read.c mmap-vs-read2.c \
147 strange-characters-c.c pine.c append-over-page.c \
148 write-ucc.c utime-dir.c mmap-shared-write.c rename5.c \
149 rename-under-feet.c write-closed.c write-closed2.c \
150 truncate.c fchmod.c make-page.c utime-file.c \
151 write3.c still-there-p.c write-large.c hardlink4.c \
152 intr-read.c asu.c truncate-files.c mmap-cat.c \
153 blocks-new-file.c fsx.c afscp.c afscp_callback.c \
156 EXTRA_OBJS = err.o errx.o warn.o warnx.o vwarn.o vwarnx.o verr.o verrx.o warnerr.o snprintf.o
158 fsx: fsx.o $(EXTRA_OBJS)
159 $(AFS_LDRULE) fsx.o $(EXTRA_OBJS) $(LIBS)
161 write-rand: write-rand.o $(EXTRA_OBJS)
162 $(AFS_LDRULE) write-rand.o $(EXTRA_OBJS) $(LIBS)
164 write-ro-file: write-ro-file.o $(EXTRA_OBJS)
165 $(AFS_LDRULE) write-ro-file.o $(EXTRA_OBJS) $(LIBS)
167 write-large: write-large.o $(EXTRA_OBJS)
168 $(AFS_LDRULE) write-large.o $(EXTRA_OBJS) $(LIBS)
170 read-vs-mmap: read-vs-mmap.o $(EXTRA_OBJS)
171 $(AFS_LDRULE) read-vs-mmap.o $(EXTRA_OBJS) $(LIBS)
173 read-vs-mmap2: read-vs-mmap2.o $(EXTRA_OBJS)
174 $(AFS_LDRULE) read-vs-mmap2.o $(EXTRA_OBJS) $(LIBS)
176 mmap-vs-read: mmap-vs-read.o $(EXTRA_OBJS)
177 $(AFS_LDRULE) mmap-vs-read.o $(EXTRA_OBJS) $(LIBS)
179 mmap-vs-read2: mmap-vs-read2.o $(EXTRA_OBJS)
180 $(AFS_LDRULE) mmap-vs-read2.o $(EXTRA_OBJS) $(LIBS)
182 read-write: read-write.o $(EXTRA_OBJS)
183 $(AFS_LDRULE) read-write.o $(EXTRA_OBJS) $(LIBS)
185 mmap-and-read: mmap-and-read.o $(EXTRA_OBJS)
186 $(AFS_LDRULE) mmap-and-read.o $(EXTRA_OBJS) $(LIBS)
188 large-dir: large-dir.o $(EXTRA_OBJS)
189 $(AFS_LDRULE) large-dir.o $(EXTRA_OBJS) $(LIBS)
191 large-dir2: large-dir2.o $(EXTRA_OBJS)
192 $(AFS_LDRULE) large-dir2.o $(EXTRA_OBJS) $(LIBS)
194 large-dir3: large-dir3.o $(EXTRA_OBJS)
195 $(AFS_LDRULE) large-dir3.o $(EXTRA_OBJS) $(LIBS)
197 fchmod: fchmod.o $(EXTRA_OBJS)
198 $(AFS_LDRULE) fchmod.o $(EXTRA_OBJS) $(LIBS)
200 truncate: truncate.o $(EXTRA_OBJS)
201 $(AFS_LDRULE) truncate.o $(EXTRA_OBJS) $(LIBS)
203 make-page: make-page.o $(EXTRA_OBJS)
204 $(AFS_LDRULE) make-page.o $(EXTRA_OBJS) $(LIBS)
206 still-there-p: still-there-p.o $(EXTRA_OBJS)
207 $(AFS_LDRULE) still-there-p.o $(EXTRA_OBJS) $(LIBS)
209 intr-read: intr-read.o $(EXTRA_OBJS)
210 $(AFS_LDRULE) intr-read.o $(EXTRA_OBJS) $(LIBS)
212 blocks-new-file: blocks-new-file.o $(EXTRA_OBJS)
213 $(AFS_LDRULE) blocks-new-file.o $(EXTRA_OBJS) $(LIBS)
215 asu: asu.o $(EXTRA_OBJS)
216 $(AFS_LDRULE) asu.o $(EXTRA_OBJS) $(LIBS)
218 test-setgroups: test-setgroups.o $(EXTRA_OBJS)
219 $(AFS_LDRULE) test-setgroups.o $(EXTRA_OBJS) $(SYS_LIBS) $(LIBS)
221 test-setpag: test-setpag.o $(EXTRA_OBJS)
222 $(AFS_LDRULE) test-setpag.o $(EXTRA_OBJS) $(SYS_LIBS) $(LIBS)
224 hardlink1: hardlink1.o $(EXTRA_OBJS)
225 $(AFS_LDRULE) hardlink1.o $(EXTRA_OBJS) $(LIBS)
227 hardlink2: hardlink2.o $(EXTRA_OBJS)
228 $(AFS_LDRULE) hardlink2.o $(EXTRA_OBJS) $(LIBS)
230 hardlink4: hardlink4.o $(EXTRA_OBJS)
231 $(AFS_LDRULE) hardlink4.o $(EXTRA_OBJS) $(LIBS)
233 mkdir2: mkdir2.o $(EXTRA_OBJS)
234 $(AFS_LDRULE) mkdir2.o $(EXTRA_OBJS) $(LIBS)
236 mkdir3: mkdir3.o $(EXTRA_OBJS)
237 $(AFS_LDRULE) mkdir3.o $(EXTRA_OBJS) $(LIBS)
239 create-files: create-files.o $(EXTRA_OBJS)
240 $(AFS_LDRULE) create-files.o $(EXTRA_OBJS) $(LIBS)
242 create-symlinks: create-symlinks.o $(EXTRA_OBJS)
243 $(AFS_LDRULE) create-symlinks.o $(EXTRA_OBJS) $(LIBS)
245 create-dirs: create-dirs.o $(EXTRA_OBJS)
246 $(AFS_LDRULE) create-dirs.o $(EXTRA_OBJS) $(LIBS)
248 create-remove: create-remove.o $(EXTRA_OBJS)
249 $(AFS_LDRULE) create-remove.o $(EXTRA_OBJS) $(LIBS)
251 dup2-and-unlog: dup2-and-unlog.o $(EXTRA_OBJS)
252 $(AFS_LDRULE) dup2-and-unlog.o $(EXTRA_OBJS) $(AUTH_LIBS) $(LIBS)
254 readdir-vs-lstat: readdir-vs-lstat.o $(EXTRA_OBJS)
255 $(AFS_LDRULE) readdir-vs-lstat.o $(EXTRA_OBJS) $(LIBS)
257 symlink: symlink.o $(EXTRA_OBJS)
258 $(AFS_LDRULE) symlink.o $(EXTRA_OBJS) $(LIBS)
260 echo-n: echo-n.o $(EXTRA_OBJS)
261 $(AFS_LDRULE) echo-n.o $(EXTRA_OBJS)
263 test-parallel1: test-parallel1.o $(EXTRA_OBJS)
264 $(AFS_LDRULE) test-parallel1.o $(EXTRA_OBJS) $(LIBS)
266 test-parallel2: test-parallel2.o $(EXTRA_OBJS)
267 $(AFS_LDRULE) test-parallel2.o $(EXTRA_OBJS) $(LIBS)
269 create-stat: create-stat.o fs_lib.o $(EXTRA_OBJS)
270 $(AFS_LDRULE) create-stat.o fs_lib.o $(EXTRA_OBJS) $(SYS_LIBS) $(LIBS)
272 kill-softly: kill-softly.o $(EXTRA_OBJS)
273 $(AFS_LDRULE) kill-softly.o $(EXTRA_OBJS) $(LIBS)
275 kill-softer: kill-softer.o $(EXTRA_OBJS)
276 $(AFS_LDRULE) kill-softer.o $(EXTRA_OBJS) $(LIBS)
278 rm-rf: rm-rf.o fs_lib.o $(EXTRA_OBJS)
279 $(AFS_LDRULE) rm-rf.o fs_lib.o $(EXTRA_OBJS) $(SYS_LIBS) $(LIBS)
281 exit-wo-close: exit-wo-close.o $(EXTRA_OBJS)
282 $(AFS_LDRULE) exit-wo-close.o $(EXTRA_OBJS) $(LIBS)
284 strange-characters-c: strange-characters-c.o $(EXTRA_OBJS)
285 $(AFS_LDRULE) strange-characters-c.o $(EXTRA_OBJS) $(LIBS)
287 pine: pine.o $(EXTRA_OBJS)
288 $(AFS_LDRULE) pine.o $(EXTRA_OBJS) $(LIBS)
290 append-over-page: append-over-page.o $(EXTRA_OBJS)
291 $(AFS_LDRULE) append-over-page.o $(EXTRA_OBJS) $(LIBS)
293 write-ucc: write-ucc.o $(EXTRA_OBJS)
294 $(AFS_LDRULE) write-ucc.o $(EXTRA_OBJS) $(LIBS)
296 utime-dir: utime-dir.o $(EXTRA_OBJS)
297 $(AFS_LDRULE) utime-dir.o $(EXTRA_OBJS) $(LIBS)
299 utime-file: utime-file.o $(EXTRA_OBJS)
300 $(AFS_LDRULE) utime-file.o $(EXTRA_OBJS) $(LIBS)
302 mmap-shared-write: mmap-shared-write.o $(EXTRA_OBJS)
303 $(AFS_LDRULE) mmap-shared-write.o $(EXTRA_OBJS) $(LIBS)
305 rename5: rename5.o $(EXTRA_OBJS)
306 $(AFS_LDRULE) rename5.o $(EXTRA_OBJS) $(LIBS)
308 rename6: rename6.o $(EXTRA_OBJS)
309 $(AFS_LDRULE) rename6.o $(EXTRA_OBJS) $(LIBS)
311 write3: write3.o $(EXTRA_OBJS)
312 $(AFS_LDRULE) write3.o $(EXTRA_OBJS) $(LIBS)
314 rename-under-feet: rename-under-feet.o $(EXTRA_OBJS)
315 $(AFS_LDRULE) rename-under-feet.o $(EXTRA_OBJS) $(LIBS)
317 write-closed: write-closed.o $(EXTRA_OBJS)
318 $(AFS_LDRULE) write-closed.o $(EXTRA_OBJS) $(LIBS)
320 write-closed2: write-closed2.o $(EXTRA_OBJS)
321 $(AFS_LDRULE) write-closed2.o $(EXTRA_OBJS) $(SYS_LIBS) $(LIBS)
323 truncate-files: truncate-files.o $(EXTRA_OBJS)
324 $(AFS_LDRULE) truncate-files.o $(EXTRA_OBJS) $(LIBS)
326 mmap-cat: mmap-cat.o $(EXTRA_OBJS)
327 $(AFS_LDRULE) mmap-cat.o $(EXTRA_OBJS) $(LIBS)
329 run-tests: run-tests.in
330 (cd ../..; CONFIG_FILES=src/tests/run-tests CONFIG_HEADERS= $(SHELL) @TOP_OBJDIR@/config.status)
333 afscp: afscp.o afscp_callback.o $(EXTRA_OBJS)
334 $(AFS_LDRULE) afscp.o afscp_callback.o $(EXTRA_OBJS) $(INT_LIBS) ${XLIBS}
336 hello-world: hello-world.in
337 sed -e "s!%CC%!$(CC)!" $(srcdir)/hello-world.in > $@
340 mountpoint: mountpoint.in
341 sed -e "s!%bindir%!$(bindir)!" $(srcdir)/mountpoint.in > $@
351 -rm -f xf_errs.c xf_errs.h dumpscan_errs.c dumpscan_errs.h *.o \
352 $(TARGETS) run-tests $(TEST_PROGRAMS) OpenAFS/Dirpath.pm OpenAFS/Dirpath.sh
354 include ../config/Makefile.version
359 check: run-tests $(TEST_PROGRAMS)
362 check-fast: run-tests $(TEST_PROGRAMS)
363 ./run-tests -all -fast
365 # Note: The autoconf variables are not fully expanded
366 # until make is run so we resort to creating the
367 # configuration at make time.
368 OpenAFS/Dirpath.pm: Makefile
369 @echo "Creating OpenAFS/Dirpath.pm"
370 @echo "# This is -*- perl -*-" >$@
371 @echo "# auto-generated by src/tests/Makefile" >>$@
372 @echo "# DO NOT EDIT" >>$@
373 @echo "package OpenAFS::Dirpath;" >>$@
374 @echo "use strict;" >>$@
375 @echo "use vars qw( @ISA @EXPORT \$$openafsdirpath);" >>$@
376 @echo "@ISA = qw(Exporter);" >>$@
377 @echo "require Exporter;" >>$@
378 @echo "@EXPORT = qw(\$$openafsdirpath);" >>$@
380 @echo "\$$openafsdirpath = {" >>$@
381 @echo " 'afsconfdir' => '@afsconfdir@'," >>$@
382 @echo " 'viceetcdir' => '@viceetcdir@'," >>$@
383 @echo " 'afssrvbindir' => '@afssrvbindir@'," >>$@
384 @echo " 'afssrvsbindir' => '@afssrvsbindir@'," >>$@
385 @echo " 'afssrvlibexecdir' => '@afssrvlibexecdir@'," >>$@
386 @echo " 'afsdbdir' => '@afsdbdir@'," >>$@
387 @echo " 'afslogsdir' => '@afslogsdir@'," >>$@
388 @echo " 'afslocaldir' => '@afslocaldir@'," >>$@
389 @echo " 'afsbackupdir' => '@afsbackupdir@'," >>$@
390 @echo " 'afsbosconfigdir' => '@afsbosconfigdir@'," >>$@
391 @echo " 'ostype' => '@MKAFS_OSTYPE@'," >>$@
392 @if test "@afsconfdir@" = "/usr/afs/etc" ; then \
393 echo " # transarc paths" ;\
394 echo " 'cachedir' => '/usr/vice/cache'," ;\
395 echo " 'afsddir' => '/usr/vice/etc'," ;\
396 echo " 'initdir' => '/usr/vice/etc'," ;\
397 echo " 'afskerneldir' => '/usr/vice/etc/modload'," ;\
398 echo " 'afswsbindir' => '/usr/afsws/bin'," ;\
400 echo " # modern paths" ;\
401 echo " 'cachedir' => '@localstatedir@/openafs/cache'," ;\
402 echo " 'afsddir' => '@afssrvsbindir@'," ;\
403 echo " 'initdir' => '@sysconfdir@'," ;\
404 echo " 'afskerneldir' => '@afskerneldir@'," ;\
405 echo " 'afswsbindir' => '@afssrvbindir@'," ;\
411 OpenAFS/Dirpath.sh: Makefile
412 @echo "Creating OpenAFS/Dirpath.sh"
413 @echo "# auto-generated by src/tests/Makefile" >$@
414 @echo "# source or '.' in this file in shell" >>$@
415 @echo "# DO NOT EDIT" >>$@
416 @echo " AFSCONFDIR=@afsconfdir@" >>$@
417 @echo " VICEETCDIR=@viceetcdir@" >>$@
418 @echo " AFSSRVBINDIR=@afssrvbindir@" >>$@
419 @echo " AFSSRVSBINDIR=@afssrvsbindir@" >>$@
420 @echo " AFSSRVLIBEXECDIR=@afssrvlibexecdir@" >>$@
421 @echo " AFSDBDIR=@afsdbdir@" >>$@
422 @echo " AFSLOGSDIR=@afslogsdir@" >>$@
423 @echo " AFSLOCALDIR=@afslocaldir@" >>$@
424 @echo " AFSBACKUPDIR=@afsbackupdir@" >>$@
425 @echo " AFSBOSCONFIGDIR=@afsbosconfigdir@" >>$@
426 @echo " OSTYPE=@MKAFS_OSTYPE@" >>$@
427 @if test "@afsconfdir@" = "/usr/afs/etc" ; then \
428 echo "# transarc paths" ;\
429 echo " CACHEDIR=/usr/vice/cache" ;\
430 echo " AFSDDIR=/usr/vice/etc" ;\
431 echo " INITDIR=/usr/vice/etc" ; \
432 echo " AFSKERNELDIR=/usr/vice/etc/modload" ;\
433 echo " AFSWSBINDIR=/usr/afsws/bin" ;\
435 echo "# modern paths" ;\
436 echo " CACHEDIR=@localstatedir@/openafs/cache" ;\
437 echo " AFSDDIR=@afssrvsbindir@" ;\
438 echo " INITDIR=@sysconfdir@" ;\
439 echo " AFSKERNELDIR=@afskerneldir@" ;\
440 echo " AFSWSBINDIR=@afssrvbindir@" ;\
442 @echo "export AFSCONFDIR VICEETCDIR AFSSRVBINDIR AFSSRVSBINDIR" >>$@
443 @echo "export AFSSRVLIBEXECDIR AFSDBDIR AFSLOGSDIR AFSLOCALDIR" >>$@
444 @echo "export AFSBACKUPDIR AFSBOSCONFIGDIR OSTYPE CACHEDIR AFSDDIR" >>$@
445 @echo "export INITDIR AFSKERNELDIR AFSWSBINDIR" >>$@
447 .PHONY: all install clean realclean distclean mostlyclean install uninstall check