Commit 0e6929ec authored by Glenn Morris's avatar Glenn Morris

Parallelize clean rules using GNU make features

* Makefile.in: (submake_template): New definition.
(mostlyclean_dirs, clean_dirs, distclean_dirs, maintainer_clean_dirs):
New variables.
(mostlyclean, clean, distclean, bootstrap-clean, maintainer-clean)
(extraclean): Define using each subdirectory as a prequisite.

* lib/Makefile.am (bootstrap-clean):
* doc/emacs/Makefile.in (bootstrap-clean):
* doc/lispintro/Makefile.in (bootstrap-clean):
* doc/lispref/Makefile.in (bootstrap-clean):
* doc/misc/Makefile.in (bootstrap-clean):
* lib-src/Makefile.in (bootstrap-clean):
* lwlib/Makefile.in (bootstrap-clean):
* nextstep/Makefile.in (bootstrap-clean):
* nt/Makefile.in (bootstrap-clean):
* oldXMenu/Makefile.in (bootstrap-clean):
New rules, for symmetry/simplicity.

* lwlib/Makefile.in (mostlyclean, clean, distclean, maintainer-clean):
* oldXMenu/Makefile.in (mostlyclean, clean, distclean, maintainer-clean, tags):
Declare as PHONY.
parent 90de50e2
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in: Parallelize clean rules using GNU make features.
(submake_template): New definition.
(mostlyclean_dirs, clean_dirs, distclean_dirs, maintainer_clean_dirs):
New variables.
(mostlyclean, clean, distclean, bootstrap-clean, maintainer-clean)
(extraclean): Define using each subdirectory as a prequisite.
* lib/Makefile.am (bootstrap-clean): New.
2014-06-15 Paul Eggert <eggert@cs.ucla.edu> 2014-06-15 Paul Eggert <eggert@cs.ucla.edu>
Port part of the AIX fix to Solaris (Bug#17598). Port part of the AIX fix to Solaris (Bug#17598).
......
...@@ -770,22 +770,27 @@ uninstall-nt: ...@@ -770,22 +770,27 @@ uninstall-nt:
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean extraclean .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean extraclean
## Eg:
## src_clean:
## make -C src clean
define submake_template
.PHONY: $(1)_$(2)
$(1)_$(2):
$$(MAKE) -C $(1) $(2)
endef
### `mostlyclean' ### `mostlyclean'
### Like `clean', but may refrain from deleting a few files that people ### Like `clean', but may refrain from deleting a few files that people
### normally don't want to recompile. For example, the `mostlyclean' ### normally don't want to recompile. For example, the `mostlyclean'
### target for GCC does not delete `libgcc.a', because recompiling it ### target for GCC does not delete `libgcc.a', because recompiling it
### is rarely necessary and takes a lot of time. ### is rarely necessary and takes a lot of time.
mostlyclean: mostlyclean_dirs = src oldXMenu lwlib lib lib-src nt doc/emacs doc/misc \
cd src && $(MAKE) mostlyclean doc/lispref doc/lispintro
cd oldXMenu && $(MAKE) mostlyclean
cd lwlib && $(MAKE) mostlyclean $(foreach dir,$(mostlyclean_dirs),$(eval $(call submake_template,$(dir),mostlyclean)))
cd lib && $(MAKE) mostlyclean
cd lib-src && $(MAKE) mostlyclean mostlyclean: $(mostlyclean_dirs:=_mostlyclean)
cd nt && $(MAKE) mostlyclean
-cd doc/emacs && $(MAKE) mostlyclean
-cd doc/misc && $(MAKE) mostlyclean
-cd doc/lispref && $(MAKE) mostlyclean
-cd doc/lispintro && $(MAKE) mostlyclean
### `clean' ### `clean'
### Delete all files from the current directory that are normally ### Delete all files from the current directory that are normally
...@@ -795,24 +800,18 @@ mostlyclean: ...@@ -795,24 +800,18 @@ mostlyclean:
### with them. ### with them.
### ###
### Delete `.dvi' files here if they are not part of the distribution. ### Delete `.dvi' files here if they are not part of the distribution.
clean: clean_dirs = $(mostlyclean_dirs) nextstep
$(foreach dir,$(clean_dirs),$(eval $(call submake_template,$(dir),clean)))
clean: $(clean_dirs:=_clean)
-rm -f etc/emacs.tmpdesktop -rm -f etc/emacs.tmpdesktop
cd src && $(MAKE) clean
cd oldXMenu && $(MAKE) clean
cd lwlib && $(MAKE) clean
cd lib && $(MAKE) clean
cd lib-src && $(MAKE) clean
cd nt && $(MAKE) clean
-cd doc/emacs && $(MAKE) clean
-cd doc/misc && $(MAKE) clean
-cd doc/lispref && $(MAKE) clean
-cd doc/lispintro && $(MAKE) clean
cd nextstep && $(MAKE) clean
### `bootclean' ### `bootclean'
### Delete all files that need to be remade for a clean bootstrap. ### Delete all files that need to be remade for a clean bootstrap.
top_bootclean=\ top_bootclean=\
rm -f config.cache config.log rm -f config.cache config.log
### `distclean' ### `distclean'
### Delete all files from the current directory that are created by ### Delete all files from the current directory that are created by
### configuring or building the program. If you have unpacked the ### configuring or building the program. If you have unpacked the
...@@ -822,44 +821,25 @@ top_bootclean=\ ...@@ -822,44 +821,25 @@ top_bootclean=\
top_distclean=\ top_distclean=\
${top_bootclean}; \ ${top_bootclean}; \
rm -f config.status config.log~ Makefile stamp-h1 ${SUBDIR_MAKEFILES} rm -f config.status config.log~ Makefile stamp-h1 ${SUBDIR_MAKEFILES}
distclean:
cd src && $(MAKE) distclean distclean_dirs = $(clean_dirs) leim lisp
cd oldXMenu && $(MAKE) distclean
cd lwlib && $(MAKE) distclean $(foreach dir,$(distclean_dirs),$(eval $(call submake_template,$(dir),distclean)))
cd lib && $(MAKE) distclean
cd lib-src && $(MAKE) distclean distclean: $(distclean_dirs:=_distclean)
cd nt && $(MAKE) distclean
cd doc/emacs && $(MAKE) distclean
cd doc/misc && $(MAKE) distclean
cd doc/lispref && $(MAKE) distclean
cd doc/lispintro && $(MAKE) distclean
cd leim && $(MAKE) distclean
cd lisp && $(MAKE) distclean
cd nextstep && $(MAKE) distclean
for dir in test/automated admin/grammars admin/unidata; do \ for dir in test/automated admin/grammars admin/unidata; do \
[ ! -d $$dir ] || (cd $$dir && $(MAKE) distclean); \ [ ! -d $$dir ] || $(MAKE) -C $$dir distclean; \
done done
${top_distclean} ${top_distclean}
### `bootstrap-clean' ### `bootstrap-clean'
### Delete everything that can be reconstructed by `make' and that ### Delete everything that can be reconstructed by `make' and that
### needs to be deleted in order to force a bootstrap from a clean state. ### needs to be deleted in order to force a bootstrap from a clean state.
bootstrap-clean: $(foreach dir,$(distclean_dirs),$(eval $(call submake_template,$(dir),bootstrap-clean)))
cd src && $(MAKE) bootstrap-clean
cd oldXMenu && $(MAKE) maintainer-clean bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
cd lwlib && $(MAKE) maintainer-clean
cd lib && $(MAKE) maintainer-clean
cd lib-src && $(MAKE) maintainer-clean
cd nt && $(MAKE) maintainer-clean
-cd doc/emacs && $(MAKE) maintainer-clean
-cd doc/misc && $(MAKE) maintainer-clean
-cd doc/lispref && $(MAKE) maintainer-clean
-cd doc/lispintro && $(MAKE) maintainer-clean
cd leim && $(MAKE) bootstrap-clean
cd lisp && $(MAKE) bootstrap-clean
cd nextstep && $(MAKE) maintainer-clean
for dir in test/automated admin/grammars admin/unidata; do \ for dir in test/automated admin/grammars admin/unidata; do \
[ ! -d $$dir ] || (cd $$dir && $(MAKE) bootstrap-clean); \ [ ! -d $$dir ] || $(MAKE) -C $$dir bootstrap-clean; \
done done
[ ! -f config.log ] || mv -f config.log config.log~ [ ! -f config.log ] || mv -f config.log config.log~
rm -rf ${srcdir}/info rm -rf ${srcdir}/info
...@@ -879,12 +859,14 @@ bootstrap-clean: ...@@ -879,12 +859,14 @@ bootstrap-clean:
top_maintainer_clean=\ top_maintainer_clean=\
${top_distclean}; \ ${top_distclean}; \
rm -fr autom4te.cache rm -fr autom4te.cache
maintainer-clean: bootstrap-clean
cd src && $(MAKE) maintainer-clean maintainer_clean_dirs = src leim lisp
cd leim && $(MAKE) maintainer-clean
cd lisp && $(MAKE) maintainer-clean $(foreach dir,$(maintainer_clean_dirs),$(eval $(call submake_template,$(dir),maintainer-clean)))
maintainer-clean: bootstrap-clean $(maintainer_clean_dirs:=_maintainer-clean)
for dir in test/automated admin/grammars admin/unidata; do \ for dir in test/automated admin/grammars admin/unidata; do \
[ ! -d $$dir ] || (cd $$dir && $(MAKE) maintainer-clean); \ [ ! -d $$dir ] || $(MAKE) -C $$dir maintainer-clean; \
done done
${top_maintainer_clean} ${top_maintainer_clean}
...@@ -892,8 +874,12 @@ maintainer-clean: bootstrap-clean ...@@ -892,8 +874,12 @@ maintainer-clean: bootstrap-clean
### says GCC supports it, and that's where the configuration part of ### says GCC supports it, and that's where the configuration part of
### the coding standards seem to come from. It's like distclean, but ### the coding standards seem to come from. It's like distclean, but
### it deletes backup and autosave files too. ### it deletes backup and autosave files too.
extraclean: ### Note that we abuse this in some subdirectories (eg leim),
for i in ${SUBDIR}; do (cd $$i; $(MAKE) extraclean); done ### to delete some generated files that are slow to rebuild.
$(foreach dir,$(SUBDIR),$(eval $(call submake_template,$(dir),extraclean)))
## FIXME this is busted because most of these do not have extraclean rules.
extraclean: $(SUBDIR:=_extraclean)
${top_maintainer_clean} ${top_maintainer_clean}
-rm -f config-tmp-* -rm -f config-tmp-*
-rm -f *~ \#* -rm -f *~ \#*
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-10 Glenn Morris <rgm@gnu.org> 2014-06-10 Glenn Morris <rgm@gnu.org>
* Makefile.in (INFO_EXT): Remove and replace by ".info" throughout. * Makefile.in (INFO_EXT): Remove and replace by ".info" throughout.
......
...@@ -181,7 +181,7 @@ emacs-xtra.dvi: $(EMACS_XTRA) ...@@ -181,7 +181,7 @@ emacs-xtra.dvi: $(EMACS_XTRA)
emacs-xtra.pdf: $(EMACS_XTRA) emacs-xtra.pdf: $(EMACS_XTRA)
$(ENVADD) $(TEXI2PDF) ${srcdir}/emacs-xtra.texi $(ENVADD) $(TEXI2PDF) ${srcdir}/emacs-xtra.texi
.PHONY: mostlyclean clean distclean maintainer-clean infoclean .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean infoclean
## Temp files. ## Temp files.
mostlyclean: mostlyclean:
...@@ -203,7 +203,7 @@ infoclean: ...@@ -203,7 +203,7 @@ infoclean:
$(buildinfodir)/emacs.info-[1-9] \ $(buildinfodir)/emacs.info-[1-9] \
$(buildinfodir)/emacs.info-[1-9][0-9] $(buildinfodir)/emacs.info-[1-9][0-9]
maintainer-clean: distclean infoclean bootstrap-clean maintainer-clean: distclean infoclean
.PHONY: dist .PHONY: dist
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-10 Glenn Morris <rgm@gnu.org> 2014-06-10 Glenn Morris <rgm@gnu.org>
* Makefile.in (INFO_EXT): Remove and replace by ".info" throughout. * Makefile.in (INFO_EXT): Remove and replace by ".info" throughout.
......
...@@ -101,7 +101,7 @@ emacs-lisp-intro.pdf: ${srcs} ...@@ -101,7 +101,7 @@ emacs-lisp-intro.pdf: ${srcs}
emacs-lisp-intro.html: ${srcs} emacs-lisp-intro.html: ${srcs}
$(MAKEINFO) $(MAKEINFO_OPTS) $(HTML_OPTS) -o $@ ${srcdir}/emacs-lisp-intro.texi $(MAKEINFO) $(MAKEINFO_OPTS) $(HTML_OPTS) -o $@ ${srcdir}/emacs-lisp-intro.texi
.PHONY: mostlyclean clean distclean maintainer-clean infoclean .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean infoclean
mostlyclean: mostlyclean:
rm -f *.aux *.log *.toc *.cp *.cps *.fn *.fns *.ky *.kys \ rm -f *.aux *.log *.toc *.cp *.cps *.fn *.fns *.ky *.kys \
...@@ -119,7 +119,7 @@ infoclean: ...@@ -119,7 +119,7 @@ infoclean:
$(buildinfodir)/eintr.info \ $(buildinfodir)/eintr.info \
$(buildinfodir)/eintr.info-[1-9] $(buildinfodir)/eintr.info-[1-9]
maintainer-clean: distclean infoclean bootstrap-clean maintainer-clean: distclean infoclean
.PHONY: dist .PHONY: dist
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-15 Eli Zaretskii <eliz@gnu.org> 2014-06-15 Eli Zaretskii <eliz@gnu.org>
* commands.texi (Accessing Mouse): Improve the wording of the * commands.texi (Accessing Mouse): Improve the wording of the
......
...@@ -153,7 +153,7 @@ elisp.html: $(srcs) ...@@ -153,7 +153,7 @@ elisp.html: $(srcs)
elisp.pdf: $(srcs) elisp.pdf: $(srcs)
$(ENVADD) $(TEXI2PDF) $(srcdir)/elisp.texi $(ENVADD) $(TEXI2PDF) $(srcdir)/elisp.texi
.PHONY: mostlyclean clean distclean maintainer-clean infoclean .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean infoclean
## [12] stuff is from two-volume.make. ## [12] stuff is from two-volume.make.
mostlyclean: mostlyclean:
...@@ -175,7 +175,7 @@ infoclean: ...@@ -175,7 +175,7 @@ infoclean:
$(buildinfodir)/elisp.info-[1-9] \ $(buildinfodir)/elisp.info-[1-9] \
$(buildinfodir)/elisp.info-[1-9][0-9] $(buildinfodir)/elisp.info-[1-9][0-9]
maintainer-clean: distclean infoclean bootstrap-clean maintainer-clean: distclean infoclean
.PHONY: dist .PHONY: dist
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-12 Vincent Belaïche <vincentb1@users.sourceforge.net> 2014-06-12 Vincent Belaïche <vincentb1@users.sourceforge.net>
* ses.texi: Adding documentation for SES local printer functions. * ses.texi: Adding documentation for SES local printer functions.
......
...@@ -209,7 +209,7 @@ ${buildinfodir}/tramp.info tramp.html: EXTRA_OPTS = -D emacs ...@@ -209,7 +209,7 @@ ${buildinfodir}/tramp.info tramp.html: EXTRA_OPTS = -D emacs
${buildinfodir}/tramp.info tramp.html: ${srcdir}/trampver.texi ${buildinfodir}/tramp.info tramp.html: ${srcdir}/trampver.texi
.PHONY: mostlyclean clean distclean maintainer-clean .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
mostlyclean: mostlyclean:
rm -f *.aux *.log *.toc *.c[mp] *.c[mp]s *.fn *.fns \ rm -f *.aux *.log *.toc *.c[mp] *.c[mp]s *.fn *.fns \
...@@ -235,7 +235,7 @@ infoclean: ...@@ -235,7 +235,7 @@ infoclean:
$(buildinfodir)/$${file}-[1-9][0-9]; \ $(buildinfodir)/$${file}-[1-9][0-9]; \
done done
maintainer-clean: distclean infoclean bootstrap-clean maintainer-clean: distclean infoclean
dist: dist:
rm -rf emacs-misc-${version} rm -rf emacs-misc-${version}
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-13 Glenn Morris <rgm@gnu.org> 2014-06-13 Glenn Morris <rgm@gnu.org>
* Makefile.in (../lib/libgnu.a): * Makefile.in (../lib/libgnu.a):
......
...@@ -255,7 +255,7 @@ $(DESTDIR)${archlibdir}: all ...@@ -255,7 +255,7 @@ $(DESTDIR)${archlibdir}: all
fi fi
.PHONY: install uninstall mostlyclean clean distclean maintainer-clean .PHONY: install uninstall mostlyclean clean distclean maintainer-clean
.PHONY: extraclean check tags .PHONY: bootstrap-clean extraclean check tags
install: $(DESTDIR)${archlibdir} install: $(DESTDIR)${archlibdir}
@echo @echo
...@@ -289,7 +289,7 @@ distclean: clean ...@@ -289,7 +289,7 @@ distclean: clean
-rm -f TAGS -rm -f TAGS
-rm -f Makefile blessmail -rm -f Makefile blessmail
maintainer-clean: distclean bootstrap-clean maintainer-clean: distclean
true true
extraclean: maintainer-clean extraclean: maintainer-clean
......
...@@ -16,3 +16,7 @@ include gnulib.mk ...@@ -16,3 +16,7 @@ include gnulib.mk
libgnu_a_SOURCES += openat-die.c save-cwd.c libgnu_a_SOURCES += openat-die.c save-cwd.c
endif endif
.PHONY: bootstrap-clean
bootstrap-clean: maintainer-clean
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (mostlyclean, clean, distclean, maintainer-clean):
Declare as PHONY.
(bootstrap-clean): New.
2014-06-13 Glenn Morris <rgm@gnu.org> 2014-06-13 Glenn Morris <rgm@gnu.org>
* Makefile.in ($(globals_h)): * Makefile.in ($(globals_h)):
......
...@@ -91,13 +91,16 @@ lwlib-Xm.o: $(src_h) lwlib-Xm.c lwlib-Xm.h lwlib.h lwlib-int.h lwlib-utils.h ...@@ -91,13 +91,16 @@ lwlib-Xm.o: $(src_h) lwlib-Xm.c lwlib-Xm.h lwlib.h lwlib-int.h lwlib-utils.h
xlwmenu.o: $(src_h) xlwmenu.c xlwmenu.h lwlib.h xlwmenuP.h \ xlwmenu.o: $(src_h) xlwmenu.c xlwmenu.h lwlib.h xlwmenuP.h \
$(srcdir)/../src/xterm.h $(srcdir)/../src/xterm.h
mostlyclean:
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
clean mostlyclean:
rm -f *.o liblw.a \#* rm -f *.o liblw.a \#*
clean: mostlyclean
distclean: clean distclean: clean
rm -f Makefile rm -f Makefile
maintainer-clean: distclean
bootstrap-clean maintainer-clean: distclean
rm -f TAGS rm -f TAGS
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-03-13 Glenn Morris <rgm@gnu.org> 2014-03-13 Glenn Morris <rgm@gnu.org>
* templates/Info.plist.in: Make it strictly valid xml. (Bug#17002) * templates/Info.plist.in: Make it strictly valid xml. (Bug#17002)
......
...@@ -52,7 +52,7 @@ ${ns_appbindir}/Emacs: ${ns_appdir} ${ns_check_file} ../src/emacs${EXEEXT} ...@@ -52,7 +52,7 @@ ${ns_appbindir}/Emacs: ${ns_appdir} ${ns_check_file} ../src/emacs${EXEEXT}
all: ${ns_appdir} ${ns_appbindir}/Emacs all: ${ns_appdir} ${ns_appbindir}/Emacs
.PHONY: clean distclean maintainer-clean .PHONY: clean distclean bootstrap-clean maintainer-clean
clean: clean:
rm -rf ${ns_appdir} rm -rf ${ns_appdir}
...@@ -64,6 +64,6 @@ distclean: clean ...@@ -64,6 +64,6 @@ distclean: clean
Cocoa/Emacs.base/Contents/Info.plist \ Cocoa/Emacs.base/Contents/Info.plist \
Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings
maintainer-clean: distclean bootstrap-clean maintainer-clean: distclean
### Makefile.in ends here ### Makefile.in ends here
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
2014-06-05 Dmitry Antipov <dmantipov@yandex.ru> 2014-06-05 Dmitry Antipov <dmantipov@yandex.ru>
* inc/ms-w32.h (POLL_FOR_INPUT): Define with HAVE_WINDOW_SYSTEM. * inc/ms-w32.h (POLL_FOR_INPUT): Define with HAVE_WINDOW_SYSTEM.
......
...@@ -162,7 +162,7 @@ $(DESTDIR)${archlibdir}: all ...@@ -162,7 +162,7 @@ $(DESTDIR)${archlibdir}: all
fi fi
.PHONY: install uninstall mostlyclean clean distclean maintainer-clean .PHONY: install uninstall mostlyclean clean distclean maintainer-clean
.PHONY: extraclean check tags .PHONY: bootstrap-clean extraclean check tags
install: $(DESTDIR)${archlibdir} install: $(DESTDIR)${archlibdir}
@echo @echo
...@@ -193,7 +193,7 @@ distclean: clean ...@@ -193,7 +193,7 @@ distclean: clean
-rm -f TAGS -rm -f TAGS
-rm -f Makefile -rm -f Makefile
maintainer-clean: distclean bootstrap-clean maintainer-clean: distclean
true true
extraclean: maintainer-clean extraclean: maintainer-clean
......
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (mostlyclean, clean, distclean, maintainer-clean, tags):
Declare as PHONY.
(boostrap-clean): New.
2013-10-24 Glenn Morris <rgm@gnu.org> 2013-10-24 Glenn Morris <rgm@gnu.org>
* Makefile.in (abs_top_srcdir): New, set by configure. * Makefile.in (abs_top_srcdir): New, set by configure.
......
...@@ -134,14 +134,17 @@ XDestAssoc.o: XDestAssoc.c X10.h ...@@ -134,14 +134,17 @@ XDestAssoc.o: XDestAssoc.c X10.h
XMakeAssoc.o: XMakeAssoc.c X10.h XMakeAssoc.o: XMakeAssoc.c X10.h
insque.o: insque.c insque.o: insque.c
FRC.mostlyclean: .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
mostlyclean: FRC.mostlyclean
mostlyclean:
rm -f libXMenu11.a ${OBJS} ${EXTRA} rm -f libXMenu11.a ${OBJS} ${EXTRA}
clean: mostlyclean clean: mostlyclean
distclean: clean
boostrap-clean maintainer-clean distclean: clean
rm -f Makefile rm -f Makefile
maintainer-clean: distclean
.PHONY: tags
tags: tags:
$(TAGS) -t *.[ch] $(TAGS) -t *.[ch]
.PHONY: tags
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment