Makefile
author Oleksandr Gavenko <gavenkoa@gmail.com>
Mon, 22 Feb 2016 12:46:36 +0200
changeset 1905 fba288d59662
parent 1902 1dd434abf745
child 1907 f4b078cbff20
permissions -rw-r--r--
Include only local subsections into TOC. This prevent duplication of TOC when build single page HTML document. Also this make unnecessary CSS hack to hide document title as top level section.


################################################################
# Standard GNU Makefile settings.

SHELL = /bin/sh
export PATH := /bin:/usr/bin:${PATH}

# Disable built in pattern rules.
MAKEFLAGS += -r
# Disable built in variables.
MAKEFLAGS += -R
# Disable built in suffix rules.
.SUFFIXES:
# Delete target file if command fails.
.DELETE_ON_ERROR:
# Default target.
.DEFAULT_GOAL = all

################################################################
# Platform definition.

host_os := linux
ifneq '' '$(WINDIR)'
  host_os := cygwin
endif
target_os := $(host_os)

################################################################
# Build tool definition/switches.

RST2HTML := rst2html
ifeq '$(host_os)' 'cygwin'
  RST2HTML := rst2html.py
endif

RST_WARNING_FLAGS := --halt warning
RST_RENDER_FLAGS := --strip-comments --embed-stylesheet --no-xml-declaration --math-output=MathJax
RST_FLAGS := $(RST_WARNING_FLAGS) $(RST_RENDER_FLAGS)

################################################################
# Proj dirs/files.

RST_FILES := $(filter-out HEADER.rst,$(wildcard *.rst))
TXT_FILES := $(wildcard *.txt)

HTML_DIR := tips-html
RST_HTML_FILES := $(patsubst %.rst,$(HTML_DIR)/%.html,$(RST_FILES))
HTML_FILES := $(RST_HTML_FILES) \
        $(HTML_DIR)/index.html $(HTML_DIR)/iframe.html
TXT__FILES := $(addprefix $(HTML_DIR)/,$(TXT_FILES))

CHM_FILES := $(addprefix $(HTML_DIR)/,chm.hhp chm.hhc chm.stp)

DIRS := $(HTML_DIR)

################################################################
# Deploy targets.

WWW_SRV_NAME := defun.work
WWW_SRV_USER := user
HG_SRV_NAME := hg.defun.work
HG_SRV_USER := user
LOCAL_DIR := /srv/www/tips

ifneq '' '$(filter deploy%,$(MAKECMDGOALS))'
  $(shell rm -f HEADER.rst)
endif

.PHONY: deploy
deploy: deploy2defun-web deploy2defun-hg deploy2sf-web deploy2sf-hg

# Will be accessible via: http://tips.defun.work/
.PHONY: deploy2defun-web
deploy2defun-web: html
	rsync --delete -avP -e ssh tips-html/ $(WWW_SRV_USER)@$(WWW_SRV_NAME):/srv/www/tips/

.PHONY: deploy2defun-hg
deploy2defun-hg:
	hg push ssh://$(HG_SRV_USER)@$(HG_SRV_NAME)//srv/hg/tips || [ $$? = 1 ]

# Will be accessible via: http://gavenkoa.users.sourceforge.net/tips-html/
.PHONY: deploy2sf-web
deploy2sf-web: html
	rsync --delete -avP -e ssh tips-html/ gavenkoa@frs.sourceforge.net:/home/user-web/g/ga/gavenkoa/htdocs/tips-html/

.PHONY: deploy2sf-hg
deploy2sf-hg:
	hg push ssh://gavenkoa@hg.code.sf.net/u/gavenkoa/tips || [ $$? = 1 ]

.PHONY: deploy2local
deploy2local: html
	rsync --delete -avP tips-html/ $(LOCAL_DIR)

################################################################
# Build targets.

.PHONY: all
all:

.PHONY: html
html: $(HTML_FILES) $(TXT__FILES)

$(HTML_DIR)/%.html: %.rst HEADER.rst rst.css rst.tmpl $(MAKEFILE_LIST) | $(HTML_DIR)
	$(RST2HTML) $(RST_FLAGS) --stylesheet=rst.css --template=rst.tmpl $*.rst $@

$(HTML_DIR)/iframe.html: $(RST_FILES) $(MAKEFILE_LIST) | $(HTML_DIR)
	{ \
echo '<html><head>'; \
echo '<meta charset="utf-8">'; \
echo '<style>'; \
echo 'a { text-decoration: none; color: hsl(240, 100%, 50%); }'; \
echo 'a:hover { opacity: .5; }'; \
echo '</style></head><body>'; \
echo '<ul style="padding-left: 1em;">'; \
for f in $(sort $(RST_FILES)); do \
  n=$${f%.rst}; \
  printf '<li><a target="_parent" href="%s.html">%s</a></li>\n' $$n $$n; \
done; \
echo '</ul>'; \
echo '</body></html>'; \
} >$@

HEADER.rst: $(MAKEFILE_LIST)
	{ \
echo '.. raw:: html'; \
echo; \
echo '  <div id="sidebar"><iframe src="iframe.html"></iframe></div>'; \
echo; \
echo '.. _About: README.html'; \
echo '.. _`Contacts`: http://resume.defun.work/'; \
echo '.. _`Oleksandr Gavenko`: http://resume.defun.work/'; \
echo '.. _`gavenkoa`: http://resume.defun.work/'; \
echo '.. _Licence: README.html#tips-licence'; \
echo; \
echo '.. container:: header'; \
echo; \
echo '  [ About_ | Licence_ | `Contacts`_ ]'; \
echo '.. container:: header small'; \
echo; \
echo '  Written by Oleksandr Gavenko (AKA gavenkoa), compiled at ``'`date +%F`'`` from rev ``'`hg id -i`'``.'; \
} >$@

$(HTML_DIR)/index.html: $(HTML_DIR)/README.html $(MAKEFILE_LIST) | $(HTML_DIR)
	cp $< $@

$(HTML_DIR)/%.html: %.html $(MAKEFILE_LIST) | $(HTML_DIR)
	cp $< $@

$(HTML_DIR)/%.txt: %.txt $(MAKEFILE_LIST) | $(HTML_DIR)
	cp $< $@

.PHONY: chm
chm: html $(CHM_FILES) $(HTML_DIR)/iframe.html
	cd $(HTML_DIR); for file in *.html; do sed -i '/<\?xml.*\?>/d' $$file; done

$(HTML_DIR)/%.stp: %.stp $(MAKEFILE_LIST) | $(HTML_DIR)
	cp $< $@

$(HTML_DIR)/chm.hhp: chm-hhp.sh $(MAKEFILE_LIST) | $(HTML_DIR)
	./chm-hhp.sh >$@

$(HTML_DIR)/chm.hhc: chm-hhc.sh $(MAKEFILE_LIST) | $(HTML_DIR)
	./chm-hhc.sh >$@

################################################################
# Init targets.

$(DIRS):
	mkdir -p $@

################################################################
# Clean targets.

.PHONY: distclean
distclean: clean

.PHONY: clean
clean:
	rm -r -f $(DIRS) HEADER.rst

################################################################
# Helper target.

.PHONY: help
help:
	@echo Supported targets:
	@sed -n -e '/^[[:alnum:]_-]*:/{s=^\(.*\):.*=  \1=;p;}' $(MAKEFILE_LIST)

.PHONY: check-format-policy
check-format-policy:
	\
for f in *.rst; do \
  if grep '.. -\*- coding: utf-8; -\*-' $$f >/dev/null; then :; else \
    echo $$f:1:" Has no 'coding: utf-8' directive."; \
  fi; \
  if grep '.. include:: HEADER.rst' $$f >/dev/null; then :; else \
    echo $$f:2:" Has no 'include:: HEADER.rst' directive."; \
  fi; \
  if grep '.. contents::' $$f >/dev/null; then :; else \
    echo $$f:7:" Has no 'contents::' directive."; \
  fi; \
done