Files
mercury/doc/Mmakefile
Zoltan Somogyi c4bb1a47b8 Fix indentation.
2025-12-14 18:54:28 +11:00

520 lines
16 KiB
Makefile

#-----------------------------------------------------------------------------#
# 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, 2025 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.
# NOTE: any changes in these names will need to be reflected in the website.
TEXINFO_FILES = \
mercury_user_guide \
mercury_reference_manual \
mercury_library_manual \
mercury_faq \
mercury_transition_guide
# The old names of the TEXINFO_INFO_FILES:
# mercury_user_guide.info
# mercury_ref.info
# mercury_library.info
# mercury_faq.info
# mercury_trans_guide.info
TEXINFO_INFO_FILES = $(patsubst %,%.info,$(TEXINFO_FILES))
# 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)
# mercury_user_guide.texi_pp @includes ug_invocation.texi, so all targets
# that want to process mercury_user_guide.texi must make ug_invocation.texi
# first. mercury_user_guide.texi_pp is the only such *direct* target;
# all the others go through it.
mercury_user_guide.texi_pp: ug_invocation.texi
# The rule for ug_invocation.texi_date compares any existing
# file ug_invocation.texi against its "new" intended contents, and
# leaves it unchanged, including its timestamp, if the "new" contents
# would be the same as the old. Then, after gmake executes @:,
# the silent do-nothing command, it will believe that ug_invocation.texi
# is up-to-date regardless of whether the rule for ug_invocation.texi_date
# updated it or not.
#
# This is the same scheme that scripts/Mmake.rules uses for e.g.
# .int and .date files. Both copies of this scheme lead to strange errors
# if the timestamp file exists but the file it is the timestamp OF has been
# deleted. This is not usually a problem though, first because making
# such deletions accidentally is rare, and second because an "mmake clean"
# fixes the issue by deleting the timestamp file as well.
ug_invocation.texi: ug_invocation.texi_date
@:
# If we are building the source distribution or if we are cross-compiling,
# then either we will not have a mercury_compile executable, or we may not be
# able to run it. In both cases, we just use the bootstrap compiler to generate
# ug_invocation.texi, assuming the bootstrap compiler is the same or a similar
# version.
ifdef BUILD_SRCDIST
UG_INVOCATION_DEP =
UG_INVOCATION_MC = $(MC)
else
ifeq ($(CROSS_COMPILING),yes)
UG_INVOCATION_DEP =
UG_INVOCATION_MC = $(MC)
else
# We do not specify the executable extension $(EXT_FOR_EXE) here because we
# need a way to refer to the compiler that works regardless of the grade in
# which it is compiled, and on all platforms. The extension that $(EXT_FOR_EXE)
# stands for
#
# - will not be present on the launcher scripts generated in the non-C grades,
# - will not be present on the executable in C grades on Unix-like systems, and
# - while it will be present on the executable in C grades on Windows,
# gmake on Windows contains code to add it for us, to both UG_INVOCATION_DEP
# and UG_INVOCATION_MC.
#
UG_INVOCATION_DEP = ../compiler/mercury_compile
UG_INVOCATION_MC = ../compiler/mercury_compile
endif
endif
ug_invocation.texi_date: $(UG_INVOCATION_DEP)
@echo checking whether ug_invocation.texi is up to date
@$(UG_INVOCATION_MC) --help-texinfo \
--no-mercury-stdlib-dir \
--config-file ../scripts/Mercury.config \
> ug_invocation.texi_new
@if cmp -s ug_invocation.texi ug_invocation.texi_new; then \
/bin/rm ug_invocation.texi_new; \
else \
mv -f ug_invocation.texi_new ug_invocation.texi; \
fi
@date > ug_invocation.texi_date
#-----------------------------------------------------------------------------#
# 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.
# XXX As of 2025 aug 11, making the pdfs by default breaks the construction
# of the source distribution, because testing.mercurylang.org is missing
# the necessary tools.
.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)
#-----------------------------------------------------------------------------#
%.info: %.texi_pp
"$(MAKEINFO)" --no-split $<
%.html: %.texi_pp
$(TEXI2HTML) $<
# XXX Why is one, and only one, of these files split by chapter?
mercury_user_guide/index.html: mercury_user_guide.texi_pp
$(TEXI2HTML_SPLIT) $<
mercury_reference_manual/index.html: mercury_reference_manual.texi_pp
$(TEXI2HTML_SPLIT) --split=chapter --no-headers $<
mercury_transition_guide/index.html: mercury_transition_guide.texi_pp
$(TEXI2HTML_SPLIT) $<
mercury_faq/index.html: mercury_faq.texi_pp
$(TEXI2HTML_SPLIT) $<
mercury_library_manual/index.html: mercury_library_manual.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 Mercury
# system, so they are not documented.
mercury_library_menu.texi_pp: ../VERSION $(LIBRARY_DIR)/*.m
{ \
echo ""; \
for filename in `cat $(LIBRARY_DIR)/MODULES_DOC`; do \
echo "* `basename $$filename .m`::"; \
done; \
} > mercury_library_menu.texi_pp
mercury_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 > mercury_library_chapters.texi_pp
mercury_library_manual.dvi_log \
mercury_library_manual.info \
mercury_library_manual.html \
mercury_library_manual/index.html \
mercury_library_manual.dvi: \
mercury_library_menu.texi_pp mercury_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_pdf 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.
#
# XXX What is the reason for this split, or indeed for any other split?
#
# XXX We also remove man pages here.
.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: mercury_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 mercury_library_manual*.html
rm -f mercury_user_guide*.html mercury_reference_manual*.html
rm -f mercuy_faq*.html mercuy_transition_guide*.html
rm -f mercury.html mercury.info
rm -f mercury_*.info*
rm -f mercury_faq.html mercury_library_manual.html \
mercury_reference_manual.html \
mercury_transition_guide.html mercury_user_guide.html
rm -f ug_invocation.texi_date ug_invocation.texi
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 mercury_library_menu.texi mercury_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
#-----------------------------------------------------------------------------#