Makefile: improve install and clean targets

install:

Add install functionality for copying generated output into specified locations.
Theme and photos are two plugins available in this instance of pelican so add
dedicated install targets for them as well.

clean:

Distinguish between (navite) html and (added) plugins output, then make it possible
to selectively prune their own output files.
diff --git a/Makefile b/Makefile
index cc1ec0b..ead5917 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,8 @@
 BASEDIR=$(CURDIR)
 INPUTDIR=$(BASEDIR)/content
 OUTPUTDIR=$(BASEDIR)/output
+OUTPUTDIR_THEME=$(OUTPUTDIR)/theme
+OUTPUTDIR_PHOTOS=$(OUTPUTDIR)/photos
 CONFFILE=$(BASEDIR)/pelicanconf.py
 PUBLISHCONF=$(BASEDIR)/publishconf.py
 
@@ -27,10 +29,14 @@
 
 GITHUB_PAGES_BRANCH=gh-pages
 
-INSTALLDIR=
-UID="www-data"
-GID="www-data"
-MOD="664"
+INSTALLSUDO ?= 0
+ifeq ($(INSTALLSUDO),1)
+ SUDO := sudo -E
+endif
+INSTALLFLAGS := $(INSTALLFLAGS) -rXaA
+INSTALLDIR ?=
+INSTALLDIR_THEME ?=
+INSTALLDIR_PHOTOS ?=
 
 DEBUG ?= 0
 ifeq ($(DEBUG), 1)
@@ -47,7 +53,10 @@
 	@echo '                                                                          '
 	@echo 'Usage:                                                                    '
 	@echo '   make html                           (re)generate the web site          '
-	@echo '   make clean                          remove the generated files         '
+	@echo '   make clean-html                     remove all html files and folders  '
+	@echo '   make clean-theme                    remove output/theme                '
+	@echo '   make clean-photos                   remove output/photos               '
+	@echo '   make clean                          remove output folder               '
 	@echo '   make regenerate                     regenerate files upon modification '
 	@echo '   make publish                        generate using production settings '
 	@echo '   make serve [PORT=8000]              serve site at http://localhost:8000'
@@ -61,6 +70,10 @@
 	@echo '   make s3_upload                      upload the web site via S3         '
 	@echo '   make cf_upload                      upload the web site via Cloud Files'
 	@echo '   make github                         upload the web site via gh-pages   '
+	@echo '   make install-html                   copy *.html, html folders locally  '
+	@echo '   make install-theme                  copy output/theme locally          '
+	@echo '   make install-photos                 copy output/photos locally         '
+	@echo '   make install                        copy output/* locally              '
 	@echo '                                                                          '
 	@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html   '
 	@echo 'Set the RELATIVE variable to 1 to enable relative urls                    '
@@ -69,8 +82,18 @@
 html:
 	$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
 
+clean-html:
+	find "$(OUTPUTDIR)" -type f -name *.html -delete
+	find "$(OUTPUTDIR)" -type d -empty -delete
+
+clean-theme:
+	[ ! -d "$(OUTPUTDIR_THEME)" ] || rm -rf $(OUTPUTDIR_THEME)
+
+clean-photos:
+	[ ! -d "$(OUTPUTDIR_PHOTOS)" ] || rm -rf $(OUTPUTDIR_PHOTOS)
+
 clean:
-	[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
+	[ ! -d "$(OUTPUTDIR)" ] || rm -rf $(OUTPUTDIR)
 
 regenerate:
 	$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
@@ -126,18 +149,20 @@
 	ghp-import -m "Generate Pelican site" -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR)
 	git push origin $(GITHUB_PAGES_BRANCH)
 
-install:
-	@command [ -z "$(INSTALLDIR)" ] && echo "INSTALLDIR unset. i.e. make install INSTALLDIR=\"/path/to/dir\"" && exit 1 ||:
-	@command [ ! -d $(OUTPUTDIR) ] && echo "OUTPUTDIR unset. i.e. make html" && exit 1 ||:
-	@echo "Copying $(OUTPUTDIR) to $(INSTALLDIR)"
-	@command sudo cp -ra $(OUTPUTDIR)/* $(INSTALLDIR) ||:
-	@echo "Setting chown to $(UID):$(GID)"
-	@command sudo chown -R $(UID):$(GID) $(INSTALLDIR) ||:
-	@echo "Setting chmod $(MOD) to files"
-	@command find $(INSTALLDIR) -type f | sudo xargs -i{} chmod $(MOD) {} ||:
-	@echo "Installed files:"
-	@command find $(INSTALLDIR) -type f ||:
-	@echo "Done."
+install-html:
+	[ -d "$(OUTPUTDIR)" ] && [ -d "$(INSTALLDIR)" ] && \
+	$(SUDO) rsync $(INSTALLFLAGS) --exclude=$(notdir $(OUTPUTDIR_THEME)) \
+	--exclude=$(notdir $(OUTPUTDIR_PHOTOS)) $(OUTPUTDIR)/* $(INSTALLDIR)
+
+install-theme:
+	[ -d "$(OUTPUTDIR_THEME)" ] && [ -d "$(INSTALLDIR_THEME)" ] && \
+	$(SUDO) rsync $(INSTALLFLAGS) $(OUTPUTDIR_THEME) $(INSTALLDIR_THEME)/
+
+install-photos:
+	[ -d "$(OUTPUTDIR_PHOTOS)" ] && [ -d "$(INSTALLDIR_PHOTOS)" ] && \
+	$(SUDO) rsync $(INSTALLFLAGS) $(OUTPUTDIR_PHOTOS) $(INSTALLDIR_PHOTOS)/
+
+install: install-html install-theme install-photos
 
 
-.PHONY: html help clean regenerate serve serve-global devserver stopserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github install
+.PHONY: html help clean clean-html clean-theme clean-photos regenerate serve serve-global devserver stopserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github install install-html install-theme install-photos