.PHONY: docs docsclean checkref checkref_en checkref_es checkref_fr
.PHONY: pdfdocs htmldocs install-doc install-doc-pdf install-doc-html

DOC_DIR=../docs
DOC_SRCDIR=../docs/src

LOC_HL_DIR=../docs/src/source-highlight
LOC_LANG_MAP=$(LOC_HL_DIR)/local/lang.map


MAN_SRCS = $(sort \
	$(wildcard $(DOC_DIR)/man/man1/*.1) \
	$(wildcard $(DOC_DIR)/man/man3/*.3*) \
	$(wildcard $(DOC_DIR)/man/man9/*.9) \
	$(GENERATED_MANPAGES))

ifneq ($(MANDB),)
default: $(DOC_DIR)/man/index.db
$(DOC_DIR)/man/index.db: $(MAN_SRCS)
	@echo "Updating 'whatis' database"
	$(Q)$(MANDB) $(DOC_DIR)/man
endif

ifeq ($(BUILD_DOCS),yes)
DOC_SRCS_EN := \
	code/code-notes.txt \
	code/style-guide.txt \
	code/nml-messages.txt \
	code/rs274.txt \
	code/contributing-to-linuxcnc.txt \
	common/emc-history.txt \
	common/glossary.txt \
	common/gpld-copyright.txt \
	common/overleaf.txt \
	config/core-components.txt \
	config/ini-config.txt \
	config/ini-homing.txt \
	config/integrator-concepts.txt \
	config/lathe-config.txt \
	config/moveoff.txt \
	config/pncconf.txt \
	config/python-interface.txt \
	config/stepconf.txt \
	config/stepper-diagnostics.txt \
	config/stepper.txt \
	config/stepper-quickstart.txt \
	drivers/ax5214h.txt \
	drivers/vfs11.txt \
	drivers/gm.txt \
	drivers/gs2.txt \
	drivers/hostmot2.txt \
	drivers/mb2hal.txt \
	drivers/motenc.txt \
	drivers/opto22.txt \
	drivers/pico-ppmc.txt \
	drivers/pluto-p.txt \
	drivers/servo-to-go.txt \
	drivers/shuttlexpress.txt \
	examples/gcode.txt \
	examples/gs2-example.txt \
	examples/mpg.txt \
	examples/pci-parallel-port.txt \
	examples/spindle.txt \
	gcode/coordinates.txt \
	gcode/g-code.txt \
	gcode/machining-center.txt \
	gcode/m-code.txt \
	gcode/o-code.txt \
	gcode/other-code.txt \
	gcode/overview.txt \
	gcode/rs274ngc.txt \
	gcode/tool-compensation.txt \
	getting-started/about-linuxcnc.txt \
	getting-started/getting-linuxcnc.txt \
	common/linux-faq.txt \
	getting-started/running-linuxcnc.txt \
	getting-started/system-requirements.txt \
	getting-started/updating-linuxcnc.txt \
	gui/axis.txt \
	gui/gladevcp.txt \
	gui/gmoccapy.txt \
	gui/gmoccapy-hu.txt \
	gui/gscreen.txt \
	gui/halui.txt \
	gui/image-to-gcode.txt \
	gui/keystick.txt \
	gui/mini.txt \
	gui/ngcgui.txt \
	gui/tklinuxcnc.txt \
	gui/tooledit.txt \
	gui/touchy.txt \
	gui/vismach.txt \
	hal/basic-hal.txt \
	hal/canonical-devices.txt \
	hal/comp.txt \
	hal/components.txt \
	hal/general-ref.txt \
	hal/hal-examples.txt \
	hal/halmodule.txt \
	hal/halshow.txt \
	hal/haltcl.txt \
	hal/halui-examples.txt \
	hal/intro.txt \
	hal/parallel-port.txt \
	gui/pyvcp.txt \
	gui/pyvcp-examples.txt \
	hal/rtcomps.txt \
	hal/tools.txt \
	hal/tutorial.txt \
	hal/twopass.txt \
	install/latency-test.txt \
	ladder/classic-ladder.txt \
	ladder/ladder-examples.txt \
	ladder/ladder-intro.txt \
	lathe/lathe-user.txt \
	motion/kinematics.txt \
	motion/pid-theory.txt \
	motion/tweaking-steppers.txt \
	remap/remap.txt \
	user/starting-linuxcnc.txt \
	user/user-concepts.txt \
	user/user-foreword.txt \
	user/user-intro.txt \
	Master_Getting_Started.txt \
	Master_Documentation.txt \
	Master_Developer.txt

DOC_SRCS_FR := \
	common/Glossary_fr.txt \
	common/GPLD_Copyright_fr.txt \
	common/Integrator_Concepts_fr.txt \
	common/outdated-notice_fr.txt \
	common/overleaf_fr.txt \
	common/Stepper_Diagnostics_fr.txt \
	config/linuxcnc2hal_fr.txt \
	config/ini_config_fr.txt \
	config/ini_homing_fr.txt \
	config/lathe_config_fr.txt \
	config/stepper_fr.txt \
	drivers/AX5214H_fr.txt \
	drivers/GS2_fr.txt \
	drivers/hostmot2_fr.txt \
	drivers/motenc_fr.txt \
	drivers/opto22_fr.txt \
	drivers/pico_ppmc_fr.txt \
	drivers/pluto_p_fr.txt \
	drivers/servo_to_go_fr.txt \
	examples/gcode_fr.txt \
	examples/gs2_example_fr.txt \
	examples/misc_fr.txt \
	examples/mpg_fr.txt \
	examples/pci_parallel_port_fr.txt \
	examples/spindle_fr.txt \
	gcode/coordinates_fr.txt \
	gcode/gcode_fr.txt \
	gcode/machining_center_fr.txt \
	gcode/m-code_fr.txt \
	gcode/o-code_fr.txt \
	gcode/other-code_fr.txt \
	gcode/overview_fr.txt \
	gcode/rs274ngc_fr.txt \
	gcode/tool_compensation_fr.txt \
	gui/axis_fr.txt \
	gui/gladevcp_fr.txt \
	gui/image-to-gcode_fr.txt \
	gui/keystick_fr.txt \
	gui/mini_fr.txt \
	gui/ngcgui_fr.txt \
	gui/tklinuxcnc_fr.txt \
	gui/tooledit_fr.txt\
	gui/touchy_fr.txt \
	hal/basic_hal_fr.txt \
	hal/comp_fr.txt \
	hal/components_fr.txt \
	hal/general_ref_fr.txt \
	hal/hal-examples_fr.txt \
	hal/halmodule_fr.txt \
	hal/halshow_fr.txt \
	hal/haltcl_fr.txt \
	hal/halui_fr.txt \
	hal/intro_fr.txt \
	hal/parallel_port_fr.txt \
	gui/pyvcp_fr.txt \
	gui/pyvcp_examples_fr.txt \
	hal/rtcomps_fr.txt \
	hal/tutorial_fr.txt \
	install/Latency_Test_fr.txt \
	ladder/classic_ladder_fr.txt \
	ladder/ladder_examples_fr.txt \
	ladder/ladder_intro_fr.txt \
	lathe/lathe-user_fr.txt \
	motion/kinematics_fr.txt \
	motion/pid_theory_fr.txt \
	motion/tweaking_steppers_fr.txt \
	user/user-concepts-fr.txt \
	user/user-foreword-fr.txt \
	user/user-intro-fr.txt \
	Master_Getting_Started_fr.txt \
	getting-started/index-fr.txt \
	Master_User_fr.txt \
	Master_HAL_fr.txt \
	Master_Integrator_fr.txt \

DOC_SRCS_ES := \
	getting-started/about-linuxcnc-es.txt \
	getting-started/getting-linuxcnc-es.txt \
	common/linux-faq-es.txt \
	getting-started/running-linuxcnc-es.txt \
	config/stepconf-es.txt \
	config/stepper-quickstart-es.txt \
	getting-started/system-requirements-es.txt \

DOC_SRCS = $(DOC_SRCS_EN) $(DOC_SRCS_FR) $(DOC_SRCS_ES)

DOC_SRCS_TXT := $(patsubst %.txt, %.txt, $(DOC_SRCS))

DOC_SRCS_ES_SMALL := $(filter-out Master_%,$(DOC_SRCS_ES))
DOC_SRCS_FR_SMALL := $(filter-out Master_%,$(DOC_SRCS_FR))
DOC_SRCS_EN_SMALL := $(filter-out Master_%,$(DOC_SRCS_EN))

DOC_SRCS_HTML := $(patsubst %.txt, %.html, $(filter-out Master_%, $(DOC_SRCS)))
DOC_TARGETS_HTML := $(addprefix $(DOC_DIR)/html/,$(DOC_SRCS_HTML)) #$(subst /,_,$(DOC_SRCS_HTML)))
DOC_TARGETS_XML := $(patsubst $(DOC_DIR)/html/%.html, objects/%.xml, $(DOC_TARGETS_HTML))

DOC_TARGETS_XML_ES := $(filter %_es.xml, $(DOC_TARGETS_XML))
DOC_TARGETS_XML_FR := $(filter %_fr.xml, $(DOC_TARGETS_XML))
DOC_TARGETS_XML_EN := $(filter-out $(DOC_TARGETS_XML_ES), $(filter-out $(DOC_TARGETS_XML_FR), $(DOC_TARGETS_XML)) )
DOC_TARGETS_HTML_ES := $(filter %_es.html, $(DOC_TARGETS_HTML))
DOC_TARGETS_HTML_FR := $(filter %_fr.html, $(DOC_TARGETS_HTML))
DOC_TARGETS_HTML_EN := $(filter-out $(DOC_TARGETS_HTML_ES), $(filter-out $(DOC_TARGETS_HTML_FR), $(DOC_TARGETS_HTML)) )

MAN_HTML_TARGETS = $(patsubst $(DOC_DIR)/man/%, $(DOC_DIR)/html/man/%.html, $(MAN_SRCS))

PDF_TARGETS_EN := $(addprefix $(DOC_DIR)/, \
	LinuxCNC_Getting_Started.pdf \
	LinuxCNC_Documentation.pdf \
	LinuxCNC_Developer_Manual.pdf \
	LinuxCNC_Manual_Pages.pdf \
	)

PDF_TARGETS_FR := $(addprefix $(DOC_DIR)/, \
	LinuxCNC_Getting_Started_fr.pdf \
	LinuxCNC_User_Manual_fr.pdf \
	LinuxCNC_HAL_Manual_fr.pdf \
	LinuxCNC_Integrator_Manual_fr.pdf \
	)

PDF_TARGETS_ES := $(addprefix $(DOC_DIR)/, \
	LinuxCNC_Getting_Started_es.pdf \
	LinuxCNC_Documentation_es.pdf \
	)

PDF_TARGETS := $(PDF_TARGETS_EN) $(PDF_TARGETS_FR) $(PDF_TARGETS_ES)

# It's better to keep the above on separate lines for troubleshooting by swapping

HTML_TARGETS := \
	$(DOC_TARGETS_HTML) \
	$(MAN_HTML_TARGETS) \
	$(DOC_DIR)/html/index.html \
	$(DOC_DIR)/html/index_es.html \
	$(DOC_DIR)/html/index_fr.html \

A2X = a2x --xsltproc-opts "--nonet \
			   --stringparam toc.section.depth 3 \
			   --stringparam toc.max.depth 2 \
			   --stringparam generate.section.toc.level 2 \
			   --stringparam generate.toc 'book toc,title chapter toc'" \
	  -a "scriptdir=$(DOC_SRCDIR)/" \
	  --asciidoc-opts "-f $(DOC_SRCDIR)/docbook.conf -f $(DOC_SRCDIR)/asciidoc-dont-replace-arrows.conf" \
	  --dblatex-opts "-P doc.publisher.show=0 -P latex.output.revhistory=0 -s $(DOC_SRCDIR)/emc2.sty \
			  -P latex.hyperparam=colorlinks,linkcolor=blue,filecolor=blue,urlcolor=blue,citecolor=blue \
                          $(A2X_LATEX_ENCODING)"

ifeq ($(TRIVIAL_BUILD),no)
-include $(patsubst %.txt, depends/%.d, $(DOC_SRCS_TXT))
Makefile: $(patsubst %.txt, depends/%.d, $(DOC_SRCS_TXT))
endif

GENERATED_MANPAGES += ../docs/man/man1/linuxcnc.1

../docs/man/man1/linuxcnc.1: ../docs/src/man/man1/linuxcnc.1.in config.status
	./config.status --file=$@:$<

docs: manpages
manpages: $(GENERATED_MANPAGES)

clean: clean-manpages
clean-manpages:
	-rm -f $(GENERATED_MANPAGES)


ifeq ($(BUILD_DOCS_PDF),yes)
docs: pdfdocs
install-doc: install-doc-pdf
endif
ifeq ($(BUILD_DOCS_HTML),yes)
docs: htmldocs
install-doc: install-doc-html
endif
pdfdocs: $(PDF_TARGETS)
htmldocs: .htmldoc-stamp checkref

.htmldoc-stamp: copy_asciidoc_files $(HTML_TARGETS) .html-images-stamp
	touch $@

.PHONY: copy_asciidoc_files
copy_asciidoc_files:
	cp -f /etc/asciidoc/stylesheets/*.css $(DOC_DIR)/html
	cp -f /etc/asciidoc/javascripts/*.js $(DOC_DIR)/html

checkref: checkref_en checkref_fr checkref_es

checkref_en: $(DOC_TARGETS_HTML_EN) $(DOC_DIR)/html/gcode.html .htmldoc-stamp
	@$(DOC_SRCDIR)/checkref English $^

checkref_fr: $(DOC_TARGETS_HTML_FR) $(DOC_DIR)/html/gcode_fr.html .htmldoc-stamp
	@$(DOC_SRCDIR)/checkref French $^

checkref_es: $(DOC_TARGETS_HTML_ES) .htmldoc-stamp
	@$(DOC_SRCDIR)/checkref Spanish $^

MAN_SRCS_NOSO = $(patsubst $(DOC_DIR)/man/%,%, \
			$(shell grep -L '^\.so ' $(sort $(MAN_SRCS))))

PDF_MAN_ORDER := man1/linuxcnc.1 $(filter-out %/linuxcnc.1, $(filter man1/%, $(MAN_SRCS_NOSO))) \
	man3/intro.3hal $(filter-out %/undocumented.3hal %/intro.3hal, $(filter man3/%.3hal, $(MAN_SRCS_NOSO))) \
	man3/undocumented.3hal man3/intro.3rtapi $(filter-out %/undocumented.3rtapi %/intro.3rtapi, $(filter man3/%.3rtapi, $(MAN_SRCS_NOSO))) \
	man3/undocumented.3rtapi $(filter man9/%, $(MAN_SRCS_NOSO)) 

$(DOC_DIR)/LinuxCNC_Manual_Pages.pdf: $(MAN_SRCS) objects/var-PDF_MAN_ORDER
	@echo Formatting manual pages as PDF
	(cd $(DOC_DIR)/man; groff -t -rC1 -rD1 -Tps -man $(PDF_MAN_ORDER)) \
		| ps2pdf - $@

$(DOC_DIR)/LinuxCNC_Getting_Started.pdf: $(DOC_SRCDIR)/Master_Getting_Started.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Getting_Started_es.pdf: $(DOC_SRCDIR)/Master_Getting_Started_es.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Getting_Started_fr.pdf: $(DOC_SRCDIR)/Master_Getting_Started_fr.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Documentation.pdf: $(DOC_SRCDIR)/Master_Documentation.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Documentation_es.pdf: $(DOC_SRCDIR)/Master_Documentation_es.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_User_Manual_fr.pdf: $(DOC_SRCDIR)/Master_User_fr.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_HAL_Manual_fr.pdf: $(DOC_SRCDIR)/Master_HAL_fr.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Integrator_Manual_fr.pdf: $(DOC_SRCDIR)/Master_Integrator_fr.pdf
	@ln -f $< $@
$(DOC_DIR)/LinuxCNC_Developer_Manual.pdf: $(DOC_SRCDIR)/Master_Developer.pdf
	@ln -f $< $@

$(DOC_DIR)/html/man/%.html: $(DOC_DIR)/man/%
	@echo Formatting $(notdir $<) as HTML
	@mkdir -p $(dir $@)
	@(cd $(DOC_DIR)/man; groff -Thtml -man $(patsubst $(DOC_DIR)/man/%,%,$<)) > $@

SA := <p><a onclick=\"return toggle('man_
SB := ')\"><img id=\"man_
SC := _image\" src=\"plus.png\" alt=\"plus\" style=\"border:0;margin-right:5px;vertical-align:middle\"/>

SD := <div id=\"man_
SE := \" style=\"-moz-column-width: 25ex; \
	-moz-column-gap: 4ex; \
	-webkit-column-width: \
	25ex; -webkit-column-gap: 4ex;\">

#
# This function appends a section to the "manpages" HTML fragment called
# index.incl, listing all the specified manpages.  It takes 2 arguments:
#     * the part of the manpage space, for example "1" or "3rtapi"
#     * the manpage section title
#
ADD_HTML_MANPAGES = \
	@echo "Adding manpages: man$(strip $(1)): $(strip $(2))"; \
	echo "$(SA)$(strip $(1))$(SB)$(strip $(1))$(SC)$(strip $(2))</a></p>" >> objects/index.incl; \
	echo "$(SD)$(strip $(1))$(SE)" >> objects/index.incl; \
	echo "<ul>" >> objects/index.incl; \
	for HTML_FILE in $(filter %.$(strip $(1)).html, $(MAN_HTML_TARGETS)); do \
		BASENAME=$$(basename $$HTML_FILE .html); \
		echo "<li><a href=\"$${HTML_FILE\#$(DOC_DIR)/html/}\">$${BASENAME%.*}</a></li>"; \
	done >> objects/index.incl; \
	echo "</ul></div>" >> objects/index.incl


objects/index.incl: $(GENERATED_MANPAGES) objects/var-MAN_HTML_TARGETS $(DOC_SRCDIR)/Submakefile
	rm -f $@
	$(call ADD_HTML_MANPAGES, 1, Commands and userspace components)
	$(call ADD_HTML_MANPAGES, 9, Realtime components and kernel modules)
	$(call ADD_HTML_MANPAGES, 3hal, API calls: HAL)
	$(call ADD_HTML_MANPAGES, 3rtapi, API calls: RTAPI)
	$(call ADD_HTML_MANPAGES, 3hm2,  API calls: Hostmot2)
	$(call ADD_HTML_MANPAGES, 3, API calls: General)
	
	# now make sure all manpages made it into the html index
	FAIL=0; \
	for F in $$(find $(DOC_DIR)/man/man? -type f); do \
		B=$$(basename $$F); \
		if ! grep -q $$B $@; then \
			echo stray manpage not added to index: $$B; \
			FAIL=1; \
		fi; \
	done; \
	if [ $$FAIL -ne 0 ]; then false; fi

$(DOC_DIR)/html/index_%.html: $(DOC_SRCDIR)/index_%.tmpl ../VERSION $(DOC_SRCDIR)/index.foot
	cat $(filter-out ../VERSION, $^) | \
		sed "s/@VERSION@/`cat ../VERSION`/" > $@	

$(DOC_DIR)/html/index.html: $(DOC_SRCDIR)/index.tmpl objects/index.incl $(DOC_SRCDIR)/index.foot ../VERSION $(DOC_SRCDIR)/Submakefile
	(cat $(DOC_SRCDIR)/index.tmpl objects/index.incl $(DOC_SRCDIR)/index.foot) | sed "s/@VERSION@/`cat ../VERSION`/" > $@	

$(DOC_SRCDIR)/%.pdf: $(DOC_SRCDIR)/%.txt
	$(ECHO) Building $@
	@rm -f $@
	$(A2X) -L -d book -vf pdf $< || (X=$$?; rm $@; exit $$X)
	@test -f $@

depends/%.d: $(DOC_SRCDIR)/%.txt $(DOC_SRCDIR)/asciideps
	$(ECHO) Depending $<
	@mkdir -p $(dir $@)
	$(Q)$(DOC_SRCDIR)/asciideps $< > $@.tmp
	@mv $@.tmp $@

objects/xref_es.xml: $(DOC_TARGETS_XML_ES) $(DOC_SRCDIR)/xref.py
	(cd objects; ../../docs/src/xref.py $(filter %.xml, $(patsubst objects/%,%,$^))) > $@
objects/xref_fr.xml: $(DOC_TARGETS_XML_FR) $(DOC_SRCDIR)/xref.py
	(cd objects; ../../docs/src/xref.py $(filter %.xml, $(patsubst objects/%,%,$^))) > $@
objects/xref.xml: $(DOC_TARGETS_XML_EN) $(DOC_SRCDIR)/xref.py
	(cd objects; ../../docs/src/xref.py $(filter %.xml, $(patsubst objects/%,%,$^))) > $@

objects/%.links-stamp: $(DOC_SRCDIR)/%.txt
	@mkdir -p `dirname $@`
	asciidoc -f $(DOC_SRCDIR)/attribute-colon.conf -a "scriptdir=$(DOC_SRCDIR)/" -d book -o- -b docbook $< | xsltproc $(DOC_SRCDIR)/links.xslt - > $@.tmp || (X=$$?; rm $@; exit $$X)
	sh move-if-change $@.tmp $(patsubst %-stamp,%,$@)
	touch $@

objects/%.links: objects/%.links-stamp
	@:

# Secondary is not working here.
# See http://www.gnu.org/software/make/manual/make.html#Chained-Rules
.PRECIOUS: objects/%.links-stamp

objects/xref_en.links: $(patsubst %.txt,objects/%.links,$(DOC_SRCS_EN_SMALL))
	$(PYTHON) $(DOC_SRCDIR)/links_db_gen.py objects/ $^ > $@

objects/xref_es.links: $(patsubst %.txt,objects/%.links,$(DOC_SRCS_ES_SMALL))
	$(PYTHON) $(DOC_SRCDIR)/links_db_gen.py objects/ $^ > $@

objects/xref_fr.links: $(patsubst %.txt,objects/%.links,$(DOC_SRCS_FR_SMALL))
	$(PYTHON) $(DOC_SRCDIR)/links_db_gen.py objects/ $^ > $@

$(DOC_TARGETS_HTML): $(DOC_DIR)/html/%.html: $(DOC_SRCDIR)/%.html
	@d=`dirname $*`; \
	mkdir -p $(shell dirname $@)
	@cp $< $@

.html-images-stamp: $(DOC_TARGETS_HTML)
	set -e; for HTML_FILE in $^; do \
		HTML_DIR=$$(basename $$(dirname $$HTML_FILE)); \
		for IMAGE_FILE in $$(xsltproc --novalid --nonet $(DOC_SRCDIR)/html-images.xslt $$HTML_FILE); do \
			IMAGE_DIR=$$(dirname $$IMAGE_FILE); \
			mkdir -p $(DOC_DIR)/html/$$HTML_DIR/$$IMAGE_DIR; \
			cp -f $(DOC_SRCDIR)/$$HTML_DIR/$$IMAGE_FILE $(DOC_DIR)/html/$$HTML_DIR/$$IMAGE_FILE; \
		done; \
		mkdir -p objects/image-cache; \
		HTML_LATEX_CACHE=objects/image-cache $(DOC_SRCDIR)/html-latex-images $$HTML_FILE || (X=$$?; rm $$HTML_FILE; exit $$X); \
	done
	touch $@

# Define a target-specific variable called STYLES_SCRIPTS_DIR, which has
# the relative path from this html target to the root of the generated
# document tree (docs/html in the git repo).  This is where the CSS files
# and javascript files will be installed.
$(DOC_SRCDIR)/%.html: STYLES_SCRIPTS=$(shell \
    D=$$(python -c "print '../' * '$*'.count('/')"); \
    if [ ! -z $$D ]; then \
        echo "-a 'scriptsdir=$$D' -a 'stylesdir=$$D'"; \
    fi \
)

$(patsubst %.txt,$(DOC_SRCDIR)/%.html,$(DOC_SRCS_EN_SMALL)): $(DOC_SRCDIR)/%.html: $(DOC_SRCDIR)/%.txt objects/xref_en.links $(LOC_LANG_MAP)
	asciidoc -f $(DOC_SRCDIR)/xhtml11.conf \
		 -f $(DOC_SRCDIR)/asciidoc-dont-replace-arrows.conf \
		 -f $(LOC_HL_DIR)/emc-langs-source-highlight.conf \
		 -a "source_highlight_dir=$(LOC_HL_DIR)/local" \
		 -a linkcss \
		 $(STYLES_SCRIPTS) \
	         -a "scriptdir=$(DOC_SRCDIR)/" \
	         -a "relindir=$(shell dirname $*)" \
	         -a "linksfile=objects/xref_en.links" \
		 -a stylesheet=linuxcnc.css \
		 -d book -a toc -a numbered -b xhtml11 $< || (X=$$?; rm $@; exit $$X)

$(patsubst %.txt,$(DOC_SRCDIR)/%.html,$(DOC_SRCS_FR_SMALL)): $(DOC_SRCDIR)/%.html: $(DOC_SRCDIR)/%.txt objects/xref_fr.links $(LOC_LANG_MAP)
	asciidoc -f $(DOC_SRCDIR)/xhtml11.conf \
		 -f $(DOC_SRCDIR)/asciidoc-dont-replace-arrows.conf \
		 -f $(LOC_HL_DIR)/emc-langs-source-highlight.conf \
		 -a "source_highlight_dir=$(LOC_HL_DIR)/local" \
		 -a linkcss \
		 $(STYLES_SCRIPTS) \
	         -a "scriptdir=$(DOC_SRCDIR)/" \
	         -a "relindir=$(shell dirname $*)" \
	         -a "linksfile=objects/xref_fr.links" \
		 -a stylesheet=linuxcnc.css \
		 -d book -a toc -a numbered -b xhtml11 $< || (X=$$?; rm $@; exit $$X)

$(patsubst %.txt,$(DOC_SRCDIR)/%.html,$(DOC_SRCS_ES_SMALL)): $(DOC_SRCDIR)/%.html: $(DOC_SRCDIR)/%.txt objects/xref_es.links $(LOC_LANG_MAP)
	asciidoc -f $(DOC_SRCDIR)/xhtml11.conf \
		 -f $(DOC_SRCDIR)/asciidoc-dont-replace-arrows.conf \
		 -a linkcss \
		 $(STYLES_SCRIPTS) \
	         -a "scriptdir=$(DOC_SRCDIR)/" \
	         -a "relindir=$(shell dirname $*)" \
	         -a "linksfile=objects/xref_es.links" \
		 -a stylesheet=linuxcnc.css \
		 -d book -a toc -a numbered -b xhtml11 $< || (X=$$?; rm $@; exit $$X)

default: docs
$(DOC_DIR)/html/xref_fr.html: objects/xref_fr.xml $(DOC_SRCDIR)/xref.xsl $(DOC_SRCDIR)/docs.xml $(DOC_SRCDIR)/terms.xml
	$(ECHO) Converting $< to HTML
	@xsltproc --stringparam docname "xref_fr" --stringparam language french --path objects -o $@ $(DOC_SRCDIR)/xref.xsl $<

$(DOC_DIR)/html/xref_es.html: objects/xref_es.xml $(DOC_SRCDIR)/xref.xsl $(DOC_SRCDIR)/docs.xml $(DOC_SRCDIR)/terms.xml
	$(ECHO) Converting $< to HTML
	@xsltproc --stringparam docname "xref_es" --stringparam language spanish --path objects -o $@ $(DOC_SRCDIR)/xref.xsl $<

default: docs

install-doc-pdf:
	$(DIR) $(DESTDIR)$(docsdir)
	$(FILE) $(PDF_TARGETS) $(DESTDIR)$(docsdir)

install-doc-html:
	$(DIR) $(DESTDIR)$(docsdir)
	cp -a $(DOC_DIR)/html $(DESTDIR)$(docsdir)
install-kernel-indep: install-doc

docclean:
	-rm -f $(DOC_DIR)/LinuxCNC_Getting_Started.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Getting_Started_es.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Getting_Started_fr.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Documentation.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Documentation_es.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_User_Manual_fr.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_HAL_Manual_fr.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Integrator_Manual_fr.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Developer_Manual.pdf
	-rm -f $(DOC_DIR)/LinuxCNC_Manual_Pages.pdf
	-rm -f $(DOC_SRCDIR)/*.d
	-rm -f $(DOC_SRCDIR)/*.pdf
	-rm -f $(DOC_SRCDIR)/*/*.html
	-rm -f $(DOC_DIR)/html/code/*.*
	-rm -f $(DOC_DIR)/html/common/images/*.*
	-rm -f $(DOC_DIR)/html/config/images/*.*
	-rm -f $(DOC_DIR)/html/drivers/images/*.*
	-rm -f $(DOC_DIR)/html/examples/images/*.*
	-rm -f $(DOC_DIR)/html/gcode/images/*.*
	-rm -f $(DOC_DIR)/html/getting-started/images/*.*
	-rm -f $(DOC_DIR)/html/gui/images/*.*
	-rm -f $(DOC_DIR)/html/hal/images/*.*
	-rm -f $(DOC_DIR)/html/install/images/*.*
	-rm -f $(DOC_DIR)/html/ladder/images/*.*
	-rm -f $(DOC_DIR)/html/lathe/images/*.*
	-rm -f $(DOC_DIR)/html/motion/images/*.*
	-rm -f $(DOC_DIR)/html/remap/images/*.*
	-rm -f $(DOC_DIR)/html/man/man1/*.*
	-rm -f $(DOC_DIR)/html/man/man3/*.*
	-rm -f $(DOC_DIR)/html/man/man9/*.*
	-rm -f $(DOC_TARGETS_HTML) $(DOC_DIR)/html/xref*.html $(DOC_DIR)/html/index*.html $(DOC_DIR)/*.png $(DOC_DIR)/man/*.png
	-rm -f .htmldoc-stamp
	-rm -f .html-images-stamp


MAN_DEPS := $(patsubst $(DOC_DIR)/man/%, depends/%.d, $(MAN_SRCS))
$(MAN_DEPS): depends/%.d: $(DOC_DIR)/man/%
	@echo Depending $(notdir $<)
	@mkdir -p $(dir $@)
	$(Q)echo -n "$(DOC_DIR)/html/man/$*.html: $<" > $@.tmp
	$(Q)grep '^\.so ' $< | awk '{printf " \\\n\t$(DOC_DIR)/man/%s", $$2}' >> $@.tmp
	$(Q)echo >> $@.tmp
	$(Q)mv -f $@.tmp $@

ifeq ($(TRIVIAL_BUILD),no)
-include $(MAN_DEPS)
Makefile: $(MAN_DEPS)
endif

%.png: %.dot
	dot -Tpng -o$@ $<

%.svg: %.dot
	dot -Tsvg -o$@ $<

%.png:; $(error Required image file $@ does not exist)
%.jpg:; $(error Required image file $@ does not exist)
%.svg:; $(error Required image file $@ does not exist)
%.dxf:; $(error Required image file $@ does not exist)
%.ps:; $(error Required image file $@ does not exist)
%.eps:; $(error Required image file $@ does not exist)

else
docclean:
	@:

docs:
	$(error Cannot build documents, missing AsciiDoc or some other required program, or explicitly disabled in configure)

endif
