# Documentation is built with xmlto, but some of the recipes in here are
# leftovers from building with Publican (https://fedorahosted.org/publican/)
#
# How this build works:
# * the main target is Wayland, documentation ends up in $(builddir)/Wayland/
# * hand-written chapters and CSS files are located in sources. These are
#   copied into $(builddir)/en-US/
# * ProtocolSpec.xml is generated from $(top_srcdir)/protocol/wayland.xml,
#   changed into docbook via XSLT and saved in $(builddir)/en-US/
# * ProtocolInterfaces.xml, same as above, uses a different XSLT
# * *API.xml is generated from the doxygen output and saved in
#   $(builddir)/en-US
# * run xmlto on $(builddir)/en-US, output to $(builddir)/Wayland/en-US

doxydir := $(top_builddir)/doc/doxygen
html_destdir := $(builddir)/Wayland/en-US/html

publican_sources = \
	$(srcdir)/sources/Wayland.ent \
	$(srcdir)/sources/Wayland.xml \
	$(srcdir)/sources/Book_Info.xml \
	$(srcdir)/sources/Author_Group.xml \
	$(srcdir)/sources/Foreword.xml \
	$(srcdir)/sources/Preface.xml \
	$(srcdir)/sources/Revision_History.xml \
	$(srcdir)/sources/Protocol.xml \
	$(srcdir)/sources/Xwayland.xml \
	$(srcdir)/sources/Compositors.xml \
	$(srcdir)/sources/images/icon.svg  \
	$(srcdir)/sources/images/wayland.png \
	$(srcdir)/sources/images/xwayland-architecture.png \
	$(srcdir)/sources/Client.xml \
	$(srcdir)/sources/Server.xml

processed_sources := \
	$(srcdir)/sources/Architecture.xml \
	$(srcdir)/sources/Introduction.xml

css_sources = \
	$(srcdir)/sources/css/brand.css \
	$(srcdir)/sources/css/common.css \
	$(srcdir)/sources/css/default.css \
	$(srcdir)/sources/css/epub.css \
	$(srcdir)/sources/css/print.css

img_sources = \
	$(srcdir)/sources/images/icon.svg \
	$(srcdir)/sources/images/wayland.png \
	$(srcdir)/sources/images/xwayland-architecture.png

doxygen_img_sources := \
	$(doxydir)/xml/wayland-architecture.png \
	$(doxydir)/xml/x-architecture.png

map_sources := \
	$(doxydir)/xml/x-architecture.map \
	$(doxydir)/xml/wayland-architecture.map

if HAVE_XMLTO
if HAVE_XSLTPROC
noinst_DATA = $(builddir)/Wayland $(publican_targets)
XMLTO_PARAM = \
	--skip-validation \
	--stringparam chunk.section.depth=0 \
	--stringparam toc.section.depth=1 \
	--stringparam html.stylesheet=css/default.css

# Listing various directories that might need to be created.
alldirs := $(builddir)/en-US $(builddir)/en-US/images $(html_destdir) $(html_destdir)/css $(html_destdir)/images


html_css_targets = $(addprefix $(html_destdir)/css/,$(notdir $(css_sources)))
html_img_targets = $(addprefix $(html_destdir)/images/,$(notdir $(img_sources)))
doxygen_img_targets := $(doxygen_img_sources:$(doxydir)/xml/%=$(html_destdir)/images/%)
map_targets := $(map_sources:$(doxydir)/xml/%=$(builddir)/en-US/images/%)
processed_targets := $(processed_sources:$(srcdir)/sources/%=$(builddir)/en-US/%)

$(builddir)/Wayland: $(publican_targets) $(html_css_targets) $(html_img_targets) $(processed_targets) $(doxygen_img_targets) | $(builddir)/en-US
	$(AM_V_GEN)$(XMLTO) $(XMLTO_PARAM) html $(builddir)/en-US/Wayland.xml -o $(html_destdir)
	@touch $@

$(html_destdir)/css/%: $(srcdir)/sources/css/% | $(html_destdir)/css
	$(AM_V_GEN)cp -f $< $@

$(html_destdir)/images/%: $(srcdir)/sources/images/% | $(html_destdir)/images
	$(AM_V_GEN)cp -f $< $@

$(html_destdir)/images/%: $(doxydir)/xml/% | $(html_destdir)/images
	$(AM_V_GEN)cp -f $< $@

pubdir = $(docdir)/Wayland/en-US

publican_targets = $(publican_sources:$(srcdir)/sources/%=$(builddir)/en-US/%) \
	$(builddir)/en-US/ProtocolSpec.xml \
	$(builddir)/en-US/ProtocolInterfaces.xml \
	$(builddir)/en-US/ClientAPI.xml \
	$(builddir)/en-US/ServerAPI.xml

# The Protocol.xml is purely generated and required before running publican
$(builddir)/en-US/ProtocolSpec.xml: $(top_srcdir)/protocol/wayland.xml $(srcdir)/protocol-to-docbook.xsl | $(builddir)/en-US
	$(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol-to-docbook.xsl \
		$(top_srcdir)/protocol/wayland.xml > $@

$(builddir)/en-US/ProtocolInterfaces.xml: $(top_srcdir)/protocol/wayland.xml $(srcdir)/protocol-interfaces-to-docbook.xsl | $(builddir)/en-US
	$(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol-interfaces-to-docbook.xsl \
		$(top_srcdir)/protocol/wayland.xml > $@

# * use doxygen's combine.xslt to merge the xml files into one single file
# * pipe that through the doxygen-to-publican stylesheet
$(builddir)/en-US/%API.xml: $(doxydir)/xml/%/index.xml $(srcdir)/doxygen-to-publican.xsl | $(builddir)/en-US
	$(AM_V_GEN)$(XSLTPROC) $(doxydir)/xml/$*/combine.xslt \
		$(doxydir)/xml/$*/index.xml | \
		$(XSLTPROC) --stringparam which $* \
		$(srcdir)/doxygen-to-publican.xsl - > $@

# Copy the sources source files into en-US destination
# This is required for out-of-source-tree build as publican does not allow us
# to specify the location of the source code.
$(builddir)/en-US/%: $(srcdir)/sources/% $(publican_sources) | $(builddir)/en-US/images
	$(AM_V_GEN)cp -f $< $@
	$(AM_V_at)chmod a+w $@

$(builddir)/en-US/images/%: $(doxydir)/xml/% | $(builddir)/en-US/images
	$(AM_V_GEN)cp -f $< $@
	$(AM_V_at)chmod a+w $@

# More specific rule to override explicitly listed targets and perform xslt
# modifications on them.
# Note that we can't use $< as all targets must be there
$(processed_targets): $(processed_sources) $(map_targets) $(srcdir)/merge-mapcoords.xsl | $(builddir)/en-US/images
	$(AM_V_GEN)$(XSLTPROC) --stringparam basedir $(builddir)/en-US \
		$(srcdir)/merge-mapcoords.xsl $(addprefix $(srcdir)/sources/,$(notdir $@)) > $@

# general rule to create one of the listed directories.
$(alldirs):
	$(AM_V_GEN)$(MKDIR_P) $@

CLEANFILES = $(publican_targets)

clean-local:
	$(AM_V_at)rm -fr $(builddir)/en-US
	$(AM_V_at)rm -fr $(builddir)/Wayland

install-data-local:
	test -z "$(pubdir)/html/css" || $(mkdir_p) "$(DESTDIR)$(pubdir)/html/css"
	test -z "$(pubdir)/html/images" || $(mkdir_p) "$(DESTDIR)$(pubdir)/html/images"
	list=`find $(builddir)/Wayland/en-US -type f`; \
	for p in $$list; do \
	  echo " $(INSTALL_DATA) '$$p' '$(DESTDIR)$(docdir)/$$p'"; \
	  $(INSTALL_DATA) "$$p" "$(DESTDIR)$(docdir)/$$p"; \
	done;

uninstall-local:
	@if test -n $(DESTDIR)$(docdir); then \
	  if test -d $(DESTDIR)$(docdir); then \
	    echo " rm -fr $(DESTDIR)$(docdir)/Wayland;"; \
	    rm -fr $(DESTDIR)$(docdir)/Wayland; \
	  fi; \
	fi;

endif
endif

EXTRA_DIST = \
	$(publican_sources) $(processed_sources) $(css_sources) $(img_sources) \
	protocol-to-docbook.xsl \
	protocol-interfaces-to-docbook.xsl \
	doxygen-to-publican.xsl \
	merge-mapcoords.xsl
