#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#
# Copyright (C) 1996-2007, 2009-2012 The University of Melbourne.
# Copyright (C) 2013-2017, 2019-2020, 2022-2023 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#

# Mmakefile - Mmake file for the Mercury documentation.

MAIN_TARGET=all

MERCURY_DIR=..
include $(MERCURY_DIR)/Mmake.common

#-----------------------------------------------------------------------------#

# Man pages are built automatically, by the `make_manpage' program,
# which runs the program with `--help' and then munges the result.
# This variable specifies which programs to create man pages for.

MANPAGE_PROGS = \
	c2init			\
	mdb			\
	mercury_config		\
	mgnuc			\
	ml			\
	mmc			\
	mmake			\
	mprof			\
	mprof_merge_runs	\
	mtags			\
	mtc

mmc.1: ../compiler/handle_options.m ../compiler/options.m

mprof.1: ../profiler/mercury_profile.m ../profiler/options.m

# This variable specifies the (top-level) TexInfo files.
# The mapping of these names to `.info' file names is not regular,
# so we also need to specify the names of the `.info' files.

TEXINFO_FILES = user_guide reference_manual library faq transition_guide
TEXINFO_INFO_FILES = mercury_ref.info mercury_user_guide.info \
	mercury_library.info mercury_faq.info mercury_trans_guide.info

# The following variables specify which programs should be used to
# to format the documentation.

TEXI2HTML="$(MAKEINFO)" --html --number-sections --no-split
TEXI2HTML_SPLIT="$(MAKEINFO)" --html --number-sections

ifeq ("$(MAKEINFO)","")
	HTML=warn_no_html
else
	HTML=html
endif

ifeq ("$(TEXI2DVI)","")
	DVI=warn_no_dvi
	PS=warn_no_ps
else
	DVI=dvi
	ifeq ("$(DVIPS)","")
		PS=warn_no_ps
	else
		PS=ps
	endif
endif

ifeq ("$(PDFTEX)","")
	PDF=warn_no_pdf
else
	PDF=pdf
endif

ifeq ("$(MAKEINFO)","")
	INFOPAGES=warn_no_info
	MDB_DOC=warn_no_mdb_doc
else
	ifeq ("$(INFO)","")
		MDB_DOC=warn_no_mdb_doc
	else
		MDB_DOC=mdb_doc mdb_command_list mdb_command_test.inp
	endif
	INFOPAGES=info
endif

#-----------------------------------------------------------------------------#

.SUFFIXES: .in .texi_pp .texi .dvi .dvi_log .ps .pdf .pdf_log .text

%.dvi: %.texi_pp
	-"$(TEXI2DVI)" $< < /dev/null > $*.dvi_log

%.ps: %.dvi
	"$(DVIPS)" -f < $< > $@

%.pdf: %.texi_pp %.dvi
	"$(PDFTEX)" $< < /dev/null > $*.pdf_log

%.text: %.texi_pp
	"$(MAKEINFO)" --no-headers -o $@ $<

M_ENV = \
	MERCURY_PROFILER=../profiler/mercury_profile \
	MERCURY_COMPILER=../compiler/mercury_compile \
	MERCURY_MKINIT=../util/mkinit \
	MCFLAGS=--no-mercury-stdlib-dir

%.1: ../scripts/% make_manpage
	$(M_ENV) $< --help 2>&1 | \
		awk -f make_manpage -v date=$(shell date "+%Y-%m-%d") > $@

%.man: %.1
	nroff -man $< > $@

# .help files just contain the output of running the command with `--help'.
# They are sometimes useful for debugging "make_manpage".
%.help: ../scripts/%
	$(M_ENV) $< --help > $@ 2>&1

SED_CMD = sed -e "s/<VERSION>/$(VERSION)/g" < $< > $@

%.texi_pp: %.texi ../VERSION
	$(SED_CMD)

mercury.html: mercury.html.in ../VERSION
	$(SED_CMD)

mercury.info: mercury.info.in ../VERSION
	$(SED_CMD)

#-----------------------------------------------------------------------------#

# Currently `mmake all' does not build the PostScript, PDF or plain-text
# versions of the documentation. Nor does it build the formatted versions
# of the man pages. But it might make sense to add them.
.PHONY: all
all: $(INFOPAGES) $(DVI) $(HTML) manpages $(MDB_DOC)
#all: ps pdf text formatted_manpages

#-----------------------------------------------------------------------------#

.PHONY: dvi
dvi: $(TEXINFO_FILES:%=%.dvi)

.PHONY: warn_no_dvi
warn_no_dvi:
	# Warning: Unable to build .dvi files.
	# This is probably due to a missing `texi2dvi'.

.PHONY: info
info: mercury.info $(TEXINFO_INFO_FILES)

.PHONY: warn_no_info
warn_no_info:
	# Warning: Unable to build .info files.
	# This is probably due to a missing `makeinfo'.

.PHONY: html
html: mercury.html $(TEXINFO_INFO_FILES:%.info=%.html)

.PHONY: warn_no_html
warn_no_html:
	# Warning: Unable to build .html files.
	# This is probably due to a missing `perl'.

.PHONY: ps
ps: $(TEXINFO_FILES:%=%.ps)

.PHONY: warn_no_ps
warn_no_ps:
	# Warning: Unable to build .ps files.
	# This is probably due to a missing `dvips' or `text2dvi'.

.PHONY: pdf
pdf: $(TEXINFO_FILES:%=%.pdf)

.PHONY: warn_no_pdf
warn_no_pdf:
	# Warning: Unable to build .pdf files.
	# This is probably due to a missing `pdftex'.

.PHONY: text
text: $(TEXINFO_FILES:%=%.text)

.PHONY: split_html
split_html: mercury.html $(TEXINFO_INFO_FILES:%.info=%/index.html)

.PHONY: manpages
manpages: $(MANPAGE_PROGS:%=%.1)

.PHONY: formatted_manpages
formatted_manpages: $(MANPAGE_PROGS:%=%.man)

.PHONY: help
help: $(MANPAGE_PROGS:%=%.help)

#-----------------------------------------------------------------------------#

mercury_user_guide.info: user_guide.texi_pp
	"$(MAKEINFO)" $<
mercury_ref.info: reference_manual.texi_pp
	"$(MAKEINFO)" $<
mercury_trans_guide.info: transition_guide.texi_pp
	"$(MAKEINFO)" $<
mercury_faq.info: faq.texi_pp
	"$(MAKEINFO)" $<
mercury_library.info: library.texi_pp
	"$(MAKEINFO)" $<

mercury_user_guide.html: user_guide.texi_pp
	$(TEXI2HTML) $<
mercury_ref.html: reference_manual.texi_pp
	$(TEXI2HTML) $<
mercury_trans_guide.html: transition_guide.texi_pp
	$(TEXI2HTML) $<
mercury_faq.html: faq.texi_pp
	$(TEXI2HTML) $<
mercury_library.html: library.texi_pp
	$(TEXI2HTML) $<

mercury_user_guide/index.html: user_guide.texi_pp
	$(TEXI2HTML_SPLIT) $<
mercury_ref/index.html: reference_manual.texi_pp
	$(TEXI2HTML_SPLIT) --split=chapter --no-headers $<
mercury_trans_guide/index.html: transition_guide.texi_pp
	$(TEXI2HTML_SPLIT) $<
mercury_faq/index.html: faq.texi_pp
	$(TEXI2HTML_SPLIT) $<
mercury_library/index.html: library.texi_pp
	$(TEXI2HTML_SPLIT) $<

#-----------------------------------------------------------------------------#

.PHONY: warn_no_mdb_doc
warn_no_mdb_doc:
	# Warning: Unable to build mdb documentation.
	# This is probably due to a missing `makeinfo' or `info'.
	cp mdb_doc_stub.txt mdb_doc

mdb_doc: generate_mdb_doc mercury_user_guide.info mdb_categories
	./generate_mdb_doc

mdb_command_list: generate_mdb_command_list mdb_doc
	./generate_mdb_command_list < mdb_doc > mdb_command_list
	-@if test `wc -l < mdb_command_list` -lt 100; then \
		echo "There was a problem when creating mdb_command_list"; \
		exit 1; \
	fi

mdb_command_test.inp: generate_mdb_command_test mdb_doc
	./generate_mdb_command_test < mdb_doc > mdb_command_test.inp
	-@if test `wc -l < mdb_command_test.inp` -lt 100; then \
		echo "There was a problem when creating mdb_command_test.inp"; \
		exit 1; \
	fi

#-----------------------------------------------------------------------------#

# The following rules automatically build the library documentation
# by extracting the module interfaces from the library source code.
# Note that some modules are just implementation details of the library,
# so they are not documented.

library-menu.texi_pp: ../VERSION $(LIBRARY_DIR)/*.m
	{ 								\
	echo "";							\
	for filename in `cat $(LIBRARY_DIR)/MODULES_DOC`; do		\
		echo "* `basename $$filename .m`::";			\
	done;								\
	} > library-menu.texi_pp

library-chapters.texi_pp: ../VERSION $(LIBRARY_DIR)/*.m
	for filename in `cat $(LIBRARY_DIR)/MODULES_DOC`; do		\
		file="`basename $$filename .m`"; 			\
		echo "@node $$file"; 					\
		echo "@chapter $$file"; 				\
		echo "@example"; 					\
		sed -n -e '/:- implementation/q' 			\
			-e '/UNDOC_PART_START/,/UNDOC_PART_END/d'	\
			-e '/NOTE_TO_IMPLEMENTORS/d'			\
			-e 's/^%----*----% *$$/%--------------------------------------------------%/' 	\
			-e 's/@/@@/g' 					\
			-e 's/{/@{/g' 					\
			-e 's/}/@}/g' 					\
			-e 'p' 						\
			$(LIBRARY_DIR)/"$$filename";			\
		echo "@end example"; 					\
		echo ""; 						\
	done > library-chapters.texi_pp

library.dvi_log library_toc.html library_1.html mercury_library.info \
		mercury_library.html mercury_library/index.html \
		library.dvi: \
	library-menu.texi_pp library-chapters.texi_pp

#-----------------------------------------------------------------------------#

.PHONY: dist
dist: tar

.PHONY: tar
tar: doc.text.tar.gz doc.ps.tar.gz

doc.text.tar.gz: text
	tar -cf - *.text | gzip > doc.text.tar.gz

doc.ps.tar.gz: ps
	tar -cf - *.ps | gzip > doc.ps.tar.gz

#-----------------------------------------------------------------------------#

# Currently `mmake all' does not build the PostScript or plain-text versions
# of the documentation. If they are added they should be installed here.
.PHONY: install
install: install_info install_html install_dvi install_manpages \
	install_mdb_doc
	# install_text install_ps

.PHONY: install_dirs
install_dirs:
	-test -d $(INSTALL_INFO_DIR) || mkdir -p $(INSTALL_INFO_DIR)
	-test -d $(INSTALL_HTML_DIR) || mkdir -p $(INSTALL_HTML_DIR)
	-test -d $(INSTALL_DVI_DIR) || mkdir -p $(INSTALL_DVI_DIR)
	-test -d $(INSTALL_TEXT_DIR) || mkdir -p $(INSTALL_TEXT_DIR)
	-test -d $(INSTALL_PS_DIR) || mkdir -p $(INSTALL_PS_DIR)
	-test -d $(INSTALL_PDF_DIR) || mkdir -p $(INSTALL_PDF_DIR)
	-test -d $(INSTALL_MAN_DIR)/man1 || \
		mkdir -p $(INSTALL_MAN_DIR)/man1
	-test -d $(INSTALL_MDB_DOC_DIR) || mkdir -p $(INSTALL_MDB_DOC_DIR)

.PHONY: install_info
install_info: $(INFOPAGES) install_dirs
	-cp *.info *.info-* $(INSTALL_INFO_DIR)
	# Update the .../info/dir file.
	-if test -x "$(INSTALL_INFO)" ; then				\
		$(INSTALL_INFO) $(INSTALL_INFO_DIR)/mercury.info;	\
	fi

.PHONY: warn_no_install_info
warn_no_install_info:
	# Warning: Unable to install .info files.
	# This is probably due to a missing `install-info'

.PHONY: install_html
install_html: $(HTML) install_dirs
	-cp *.html $(INSTALL_HTML_DIR)

.PHONY: install_dvi
install_dvi: $(DVI) install_dirs
	# It is possible that there are no .dvi files here,
	# if the TEXI2DVI command generates PDF directly.
	-cp *.dvi $(INSTALL_DVI_DIR)

.PHONY: install_text
install_text: text install_dirs
	cp *.txt $(INSTALL_TEXT_DIR)

.PHONY: install_ps
install_ps: $(PS) install_dirs
	-cp *.ps $(INSTALL_PS_DIR)

.PHONY: install_pdf
install_pdf: $(PDF) install_dirs
	-cp *.pdf $(INSTALL_PDF_DIR)

.PHONY: install_manpages
install_manpages: manpages install_dirs
	cp *.1 $(INSTALL_MAN_DIR)/man1

.PHONY: install_mdb_doc
install_mdb_doc: $(MDB_DOC) install_dirs
	-cp mdb_doc $(INSTALL_MDB_DOC_DIR)

# The uninstall rule here only removes the info files; the others
# are removed by the top-level uninstall rule.
.PHONY: uninstall
uninstall:
	-cd $(INSTALL_INFO_DIR); rm -f mercury*.info*
	-cd $(INSTALL_MAN_DIR)/man1; rm -f $(MANPAGE_PROGS:%=%.1)

#-----------------------------------------------------------------------------#

# This install is for installing the Mercury webpage, which goes to
# a different directory (supplied by the environment variable
# INSTALL_WEBPAGE_DIR).

.PHONY: install_webpage
install_webpage: library-chapters.texi_pp split_html ps pdf
	-test -d $(INSTALL_WEBPAGE_DIR) || mkdir -p $(INSTALL_WEBPAGE_DIR)
	( \
		. ../VERSION; \
		if test "$$VERSION" = DEV ; then \
			echo "Set the version before you build the website"; \
			exit 1; \
		fi; \
	)
	cp *.ps $(INSTALL_WEBPAGE_DIR)
	cp *.pdf $(INSTALL_WEBPAGE_DIR)
	for file in $(INSTALL_WEBPAGE_DIR)/*.ps ; do \
		gzip -f -9 $$file ; \
	done
	cp -r $(TEXINFO_INFO_FILES:%.info=%) $(INSTALL_WEBPAGE_DIR)

webpage.tar.gz:
	rm -rf webpage
	mmake INSTALL_WEBPAGE_DIR=webpage install_webpage
	tar -zcf webpage.tar.gz webpage/

#-----------------------------------------------------------------------------#

clean_local: clean_texi clean_manpages clean_webpage

.PHONY: distclean
distclean: clean_local clean_text_files

realclean_local: distclean

.PHONY: clean_texi
clean_texi:
	rm -f *.aux *.cp *.cps *.fn *.ky *.log *.pg *.toc *.tp *.vr
	rm -f *.dvi *.dvi_log *.pdf *.pdf_log *.ps *.ps_log *.text
	rm -f library*.html user_guide*.html reference_manual*.html
	rm -f faq*.html transition_guide*.html
	rm -f mercury.html mercury.info
	rm -f mercury_*.info*
	rm -f mercury_faq.html mercury_library.html mercury_ref.html \
		mercury_trans_guide.html mercury_user_guide.html
	rm -rf $(TEXINFO_INFO_FILES:%.info=%)

.PHONY: clean_text_files
clean_text_files:
	rm -f mdb_command_list mdb_command_test.inp mdb_doc
	rm -f library-menu.texi library-chapters.texi *.texi_pp

.PHONY: clean_manpages
clean_manpages:
	rm -f *.1

.PHONY: clean_webpage
clean_webpage:
	rm -rf webpage
	rm -f webpage.tar.gz

#-----------------------------------------------------------------------------#
