ia64/xen-unstable

view stubdom/Makefile @ 19623:e0221531d0e5

stubdom: Rebuild the ocaml runtime libraries with the options needed
if they are to be linked with object files created by ocamlc and the minios
kernel.

This is needed to build stubdoms written in ocaml.

Signed-off-by: Alex Zeffertt <alex.zeffertt@eu.citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Tue May 19 14:17:56 2009 +0100 (2009-05-19)
parents b5522741f6b5
children 415505139333
line source
1 XEN_ROOT = ..
2 MINI_OS = $(XEN_ROOT)/extras/mini-os
4 export XEN_OS=MiniOS
6 export stubdom=y
7 export debug=y
8 include $(XEN_ROOT)/Config.mk
10 #ZLIB_URL?=http://www.zlib.net
11 ZLIB_URL=$(XEN_EXTFILES_URL)
12 ZLIB_VERSION=1.2.3
14 #LIBPCI_URL?=http://www.kernel.org/pub/software/utils/pciutils
15 LIBPCI_URL?=$(XEN_EXTFILES_URL)
16 LIBPCI_VERSION=2.2.9
18 #NEWLIB_URL?=ftp://sources.redhat.com/pub/newlib
19 NEWLIB_URL?=$(XEN_EXTFILES_URL)
20 NEWLIB_VERSION=1.16.0
22 #LWIP_URL?=http://download.savannah.gnu.org/releases/lwip
23 LWIP_URL?=$(XEN_EXTFILES_URL)
24 LWIP_VERSION=1.3.0
26 #GRUB_URL?=http://alpha.gnu.org/gnu/grub
27 GRUB_URL?=$(XEN_EXTFILES_URL)
28 GRUB_VERSION=0.97
30 #OCAML_URL?=$(XEN_EXTFILES_URL)
31 OCAML_URL?=http://caml.inria.fr/pub/distrib/ocaml-3.11
32 OCAML_VERSION=3.11.0
34 WGET=wget -c
36 GNU_TARGET_ARCH:=$(XEN_TARGET_ARCH)
37 ifeq ($(XEN_TARGET_ARCH),x86_32)
38 GNU_TARGET_ARCH:=i686
39 endif
41 ifeq ($(GNU_TARGET_ARCH), i686)
42 TARGET_CFLAGS=
43 NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS
44 STUBDOM_SUPPORTED=1
45 endif
46 ifeq ($(GNU_TARGET_ARCH), x86_64)
47 TARGET_CFLAGS=-mno-red-zone
48 NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS
49 STUBDOM_SUPPORTED=1
50 endif
51 ifeq ($(GNU_TARGET_ARCH), ia64)
52 TARGET_CFLAGS=-mconstant-gp
53 endif
55 CROSS_ROOT=cross-root-$(GNU_TARGET_ARCH)
56 CROSS_PREFIX=$(CURDIR)/$(CROSS_ROOT)
58 # Disable PIE/SSP if GCC supports them. They can break us.
59 TARGET_CFLAGS += $(CFLAGS)
60 TARGET_CPPFLAGS += $(CPPFLAGS)
61 TARGET_CFLAGS += $(call cc-option,$(CC),-nopie,)
62 TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
63 TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
65 # Do not use host headers and libs
66 GCC_INSTALL = $(shell LANG=C gcc -print-search-dirs | sed -n -e 's/install: \(.*\)/\1/p')
67 TARGET_CPPFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__
68 TARGET_CPPFLAGS += -nostdinc
69 TARGET_CPPFLAGS += -isystem $(CURDIR)/$(MINI_OS)/include/posix
70 TARGET_CPPFLAGS += -isystem $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include
71 TARGET_CPPFLAGS += -isystem $(GCC_INSTALL)include
72 TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-$(XEN_TARGET_ARCH)/src/include
73 TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-$(XEN_TARGET_ARCH)/src/include/ipv4
74 TARGET_CPPFLAGS += -I$(CURDIR)/include
76 TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib
78 TARGETS=ioemu c caml grub
80 .PHONY: all
81 all: build
82 ifeq ($(STUBDOM_SUPPORTED),1)
83 build: ioemu-stubdom c-stubdom pv-grub
84 else
85 build:
86 endif
88 ##############
89 # Cross-newlib
90 ##############
92 newlib-$(NEWLIB_VERSION).tar.gz:
93 $(WGET) $(NEWLIB_URL)/$@
95 newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz
96 tar xzf $<
97 patch -d $@ -p0 < newlib.patch
98 patch -d $@ -p0 < newlib-chk.patch
99 touch $@
101 NEWLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libc.a
102 .PHONY: cross-newlib
103 cross-newlib: $(NEWLIB_STAMPFILE)
104 $(NEWLIB_STAMPFILE): mk-headers-$(XEN_TARGET_ARCH) newlib-$(NEWLIB_VERSION)
105 mkdir -p newlib-$(XEN_TARGET_ARCH)
106 ( cd newlib-$(XEN_TARGET_ARCH) && \
107 CC_FOR_TARGET="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(NEWLIB_CFLAGS)" AR_FOR_TARGET=$(AR) LD_FOR_TARGET=$(LD) RANLIB_FOR_TARGET=$(RANLIB) ../newlib-$(NEWLIB_VERSION)/configure --prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf --enable-newlib-io-long-long --disable-multilib && \
108 $(MAKE) && \
109 DESTDIR= $(MAKE) install )
111 ############
112 # Cross-zlib
113 ############
115 zlib-$(ZLIB_VERSION).tar.gz:
116 $(WGET) $(ZLIB_URL)/$@
118 zlib-$(XEN_TARGET_ARCH): zlib-$(ZLIB_VERSION).tar.gz
119 tar xzf $<
120 mv zlib-$(ZLIB_VERSION) $@
122 ZLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libz.a
123 .PHONY: cross-zlib
124 cross-zlib: $(ZLIB_STAMPFILE)
125 $(ZLIB_STAMPFILE): zlib-$(XEN_TARGET_ARCH) $(NEWLIB_STAMPFILE)
126 ( cd $< && \
127 CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" CC=$(CC) ./configure --prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf && \
128 $(MAKE) libz.a && \
129 $(MAKE) install )
131 ##############
132 # Cross-libpci
133 ##############
135 pciutils-$(LIBPCI_VERSION).tar.bz2:
136 $(WGET) $(LIBPCI_URL)/$@
138 pciutils-$(XEN_TARGET_ARCH): pciutils-$(LIBPCI_VERSION).tar.bz2
139 tar xjf $<
140 mv pciutils-$(LIBPCI_VERSION) $@
141 patch -d $@ -p1 < pciutils.patch
142 touch $@
144 LIBPCI_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libpci.a
145 .PHONY: cross-libpci
146 cross-libpci: $(LIBPCI_STAMPFILE)
147 $(LIBPCI_STAMPFILE): pciutils-$(XEN_TARGET_ARCH) $(NEWLIB_STAMPFILE) $(ZLIB_STAMPFILE)
148 ( cd $< && \
149 cp ../libpci.config.h lib/config.h && \
150 echo '#define PCILIB_VERSION "$(LIBPCI_VERSION)"' >> lib/config.h && \
151 cp ../libpci.config.mak lib/config.mk && \
152 $(MAKE) CC="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -I$(realpath $(MINI_OS)/include)" lib/libpci.a && \
153 $(INSTALL_DATA) lib/libpci.a $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib/ && \
154 $(INSTALL_DIR) $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci && \
155 $(INSTALL_DATA) lib/config.h lib/header.h lib/pci.h lib/types.h $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci/ \
156 )
158 ######
159 # lwIP
160 ######
162 lwip-$(LWIP_VERSION).tar.gz:
163 $(WGET) $(LWIP_URL)/$@
165 lwip-$(XEN_TARGET_ARCH): lwip-$(LWIP_VERSION).tar.gz
166 tar xzf $<
167 mv lwip $@
168 patch -d $@ -p0 < lwip.patch-cvs
169 touch $@
171 #############
172 # Cross-ocaml
173 #############
175 CAMLLIB = $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib/ocaml
176 OCAML_STAMPFILE=$(CAMLLIB)/.dirstamp
178 ocaml-$(OCAML_VERSION).tar.gz:
179 $(WGET) $(OCAML_URL)/$@
181 ocaml-$(XEN_TARGET_ARCH)/.dirstamp: ocaml-$(OCAML_VERSION).tar.gz ocaml.patch
182 tar xzf $<
183 cd ocaml-$(OCAML_VERSION) && patch -p0 < ../ocaml.patch
184 rm -rf ocaml-$(XEN_TARGET_ARCH)
185 mv ocaml-$(OCAML_VERSION) ocaml-$(XEN_TARGET_ARCH)
186 touch $@
188 MINIOS_HASNOT=IPV6 INET_ATON
190 .PHONY: cross-ocaml
191 cross-ocaml: $(OCAML_STAMPFILE)
192 $(OCAML_STAMPFILE): ocaml-$(XEN_TARGET_ARCH)/.dirstamp
193 cd ocaml-$(XEN_TARGET_ARCH) && ./configure -prefix $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf \
194 -no-pthread -no-shared-libs -no-tk -no-curses \
195 -cc "$(CC) -U_FORTIFY_SOURCE -fno-stack-protector"
196 $(foreach i,$(MINIOS_HASNOT),sed -i 's,^\(#define HAS_$(i)\),//\1,' ocaml-$(XEN_TARGET_ARCH)/config/s.h ; )
197 $(MAKE) -C ocaml-$(XEN_TARGET_ARCH) world
198 $(MAKE) -C ocaml-$(XEN_TARGET_ARCH) opt
199 $(MAKE) -C ocaml-$(XEN_TARGET_ARCH) install
200 touch $@
202 #######
203 # Links
204 #######
206 .PHONY: $(CROSS_ROOT)
207 $(CROSS_ROOT): cross-newlib cross-zlib cross-libpci
209 $(XEN_ROOT)/tools/ioemu-dir:
210 make -C $(XEN_ROOT)/tools ioemu-dir-find
212 ioemu/linkfarm.stamp: $(XEN_ROOT)/tools/ioemu-dir
213 mkdir -p ioemu
214 set -e; \
215 $(absolutify_xen_root); \
216 cd ioemu; \
217 src="$$XEN_ROOT/tools/ioemu-dir"; export src; \
218 (cd $$src && find * -type d -print) | xargs mkdir -p; \
219 (cd $$src && find * ! -type l -type f $(addprefix ! -name , \
220 '*.[oda1]' 'config-*' config.mak qemu-dm qemu-img-xen \
221 '*.html' '*.pod' \
222 )) | \
223 while read f; do rm -f "$$f"; ln -s "$$src/$$f" "$$f"; done
224 touch ioemu/linkfarm.stamp
226 mk-headers-$(XEN_TARGET_ARCH): ioemu/linkfarm.stamp
227 mkdir -p include/xen && \
228 ln -sf $(addprefix ../../,$(wildcard $(XEN_ROOT)/xen/include/public/*.h)) include/xen && \
229 ln -sf $(addprefix ../../$(XEN_ROOT)/xen/include/public/,arch-ia64 arch-x86 hvm io xsm) include/xen && \
230 ( [ -h include/xen/sys ] || ln -sf ../../$(XEN_ROOT)/tools/include/xen-sys/MiniOS include/xen/sys ) && \
231 ( [ -h include/xen/libelf ] || ln -sf ../../$(XEN_ROOT)/tools/include/xen/libelf include/xen/libelf ) && \
232 mkdir -p include/xen-foreign && \
233 ln -sf $(addprefix ../../,$(wildcard $(XEN_ROOT)/tools/include/xen-foreign/*)) include/xen-foreign/ && \
234 $(MAKE) -C include/xen-foreign/ && \
235 ( [ -h include/xen/foreign ] || ln -sf ../xen-foreign include/xen/foreign )
236 mkdir -p libxc-$(XEN_TARGET_ARCH)
237 [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \
238 ln -sf ../$(XEN_ROOT)/tools/libxc/*.h . && \
239 ln -sf ../$(XEN_ROOT)/tools/libxc/*.c . && \
240 ln -sf ../$(XEN_ROOT)/tools/libxc/Makefile . )
241 mkdir -p libxc-$(XEN_TARGET_ARCH)/$(XEN_TARGET_ARCH)
242 [ -h libxc-$(XEN_TARGET_ARCH)/$(XEN_TARGET_ARCH) ] || ( cd libxc-$(XEN_TARGET_ARCH)/$(XEN_TARGET_ARCH) && \
243 ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.c . && \
244 ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.h . && \
245 ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/Makefile . )
246 $(MAKE) -C $(MINI_OS) links
247 touch mk-headers-$(XEN_TARGET_ARCH)
249 TARGETS_MINIOS=$(addprefix mini-os-$(XEN_TARGET_ARCH)-,$(TARGETS))
250 $(TARGETS_MINIOS): mini-os-%:
251 [ -d $@ ] || \
252 for i in $$(cd $(MINI_OS) ; find . -type d) ; do \
253 mkdir -p $@/$$i ; \
254 done
256 #######
257 # libxc
258 #######
260 .PHONY: libxc
261 libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a
262 libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a:: cross-zlib
263 CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C libxc-$(XEN_TARGET_ARCH)
265 #######
266 # ioemu
267 #######
269 .PHONY: ioemu
270 ioemu: cross-zlib cross-libpci libxc
271 [ -f ioemu/config-host.mak ] || \
272 ( $(absolutify_xen_root); \
273 PREFIX=$(PREFIX); \
274 export PREFIX; \
275 cd ioemu ; \
276 LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) \
277 TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" \
278 TARGET_CFLAGS="$(TARGET_CFLAGS)" \
279 TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \
280 ./xen-setup-stubdom )
281 $(MAKE) -C ioemu
283 ######
284 # caml
285 ######
287 .PHONY: caml
288 caml: $(CROSS_ROOT)
289 CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) OCAMLC_CROSS_PREFIX=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/bin/
291 ###
292 # C
293 ###
295 .PHONY: c
296 c: $(CROSS_ROOT)
297 CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH)
299 ######
300 # Grub
301 ######
303 grub-$(GRUB_VERSION).tar.gz:
304 $(WGET) $(GRUB_URL)/$@
306 grub-upstream: grub-$(GRUB_VERSION).tar.gz
307 tar xzf $<
308 mv grub-$(GRUB_VERSION) $@
309 for i in grub.patches/* ; do \
310 patch -d $@ -p1 < $$i ; \
311 done
313 .PHONY: grub
314 grub: grub-upstream $(CROSS_ROOT)
315 mkdir -p grub-$(XEN_TARGET_ARCH)
316 CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ OBJ_DIR=$(CURDIR)/grub-$(XEN_TARGET_ARCH)
318 ########
319 # minios
320 ########
322 .PHONY: ioemu-stubdom
323 ioemu-stubdom: APP_OBJS=$(CURDIR)/ioemu/i386-stubdom/qemu.a $(CURDIR)/ioemu/i386-stubdom/libqemu.a $(CURDIR)/ioemu/libqemu_common.a
324 ioemu-stubdom: mini-os-$(XEN_TARGET_ARCH)-ioemu lwip-$(XEN_TARGET_ARCH) libxc ioemu
325 DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_QEMU $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) APP_OBJS="$(APP_OBJS)"
327 .PHONY: caml-stubdom
328 caml-stubdom: mini-os-$(XEN_TARGET_ARCH)-caml lwip-$(XEN_TARGET_ARCH) libxc caml
329 DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_CAML $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) APP_OBJS="$(CURDIR)/caml/main-caml.o $(CURDIR)/caml/caml.o $(CAMLLIB)/libasmrun.a"
331 .PHONY: c-stubdom
332 c-stubdom: mini-os-$(XEN_TARGET_ARCH)-c lwip-$(XEN_TARGET_ARCH) libxc c
333 DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_C $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) APP_OBJS=$(CURDIR)/c/main.a
335 .PHONY: pv-grub
336 pv-grub: mini-os-$(XEN_TARGET_ARCH)-grub libxc grub
337 DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_GRUB $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< APP_OBJS=$(CURDIR)/grub-$(XEN_TARGET_ARCH)/main.a
339 #########
340 # install
341 #########
343 ifeq ($(STUBDOM_SUPPORTED),1)
344 install: install-readme install-ioemu install-grub
345 else
346 install:
347 endif
349 install-readme:
350 $(INSTALL_DIR) $(DESTDIR)$(DOCDIR)
351 $(INSTALL_DATA) README $(DESTDIR)$(DOCDIR)/README.stubdom
353 install-ioemu: ioemu-stubdom
354 $(INSTALL_DIR) "$(DESTDIR)$(LIBEXEC)"
355 $(INSTALL_PROG) stubdom-dm "$(DESTDIR)$(LIBEXEC)"
356 $(INSTALL_DIR) "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot"
357 $(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-ioemu/mini-os.gz "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot/ioemu-stubdom.gz"
359 install-grub: pv-grub
360 $(INSTALL_DIR) "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot"
361 $(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-grub/mini-os.gz "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot/pv-grub-$(XEN_TARGET_ARCH).gz"
363 #######
364 # clean
365 #######
367 # Only clean the libxc/ioemu/mini-os part
368 .PHONY: clean
369 clean:
370 rm -fr mini-os-$(XEN_TARGET_ARCH)-ioemu
371 rm -fr mini-os-$(XEN_TARGET_ARCH)-c
372 rm -fr mini-os-$(XEN_TARGET_ARCH)-caml
373 rm -fr mini-os-$(XEN_TARGET_ARCH)-grub
374 $(MAKE) -C caml clean
375 $(MAKE) -C c clean
376 rm -fr grub-$(XEN_TARGET_ARCH)
377 [ ! -d libxc-$(XEN_TARGET_ARCH) ] || $(MAKE) -C libxc-$(XEN_TARGET_ARCH) clean
378 -[ ! -d ioemu ] || $(MAKE) -C ioemu clean
380 # clean the cross-compilation result
381 .PHONY: crossclean
382 crossclean: clean
383 rm -fr $(CROSS_ROOT)
384 rm -fr newlib-$(XEN_TARGET_ARCH)
385 rm -fr zlib-$(XEN_TARGET_ARCH) pciutils-$(XEN_TARGET_ARCH)
386 rm -fr libxc-$(XEN_TARGET_ARCH) ioemu
387 rm -f mk-headers-$(XEN_TARGET_ARCH)
388 rm -fr ocaml-$(XEN_TARGET_ARCH)
390 # clean patched sources
391 .PHONY: patchclean
392 patchclean: crossclean
393 rm -fr newlib-$(NEWLIB_VERSION)
394 rm -fr lwip-$(XEN_TARGET_ARCH)
395 rm -fr grub-upstream
397 # clean downloads
398 .PHONY: downloadclean
399 downloadclean: patchclean
400 rm -f newlib-$(NEWLIB_VERSION).tar.gz
401 rm -f zlib-$(ZLIB_VERSION).tar.gz
402 rm -f pciutils-$(LIBPCI_VERSION).tar.bz2
403 rm -f grub-$(GRUB_VERSION).tar.gz
404 rm -f lwip-$(LWIP_VERSION).tar.gz
405 rm -f ocaml-$(OCAML_VERSION).tar.gz
407 .PHONY: distclean
408 distclean: downloadclean