SOURCES=$(notdir $(wildcard ../mercurial/helptext/*.[0-9].txt)) MAN=$(SOURCES:%.txt=%) HTML=$(SOURCES:%.txt=%.html) GENDOC=gendoc.py ../mercurial/commands.py ../mercurial/help.py \ ../mercurial/helptext/*.txt ../hgext/*.py ../hgext/*/__init__.py RUNRST=runrst PREFIX=/usr/local MANDIR=$(PREFIX)/share/man INSTALL=install -m 644 # Default to Python 3. # # Windows ships Python 3 as `python.exe`, which may not be on PATH. py.exe is. ifeq ($(OS),Windows_NT) PYTHON?=py -3 else PYTHON?=python3 endif RSTARGS= GENDOCARGS= GENDOCCMD=$(PYTHON) gendoc.py $(GENDOCARGS) # Output directories for individual help pages. MANOUT=man HTMLOUT=html BUILDDIR=build export HGENCODING=UTF-8 .PHONY: all man html install clean knownrefs # Generate a list of hg commands and extensions. commandlist.txt: $(GENDOC) ${GENDOCCMD} commandlist > $@.tmp mv $@.tmp $@ topiclist.txt: $(GENDOC) ${GENDOCCMD} topiclist > $@.tmp mv $@.tmp $@ extensionlist.txt: $(GENDOC) ${GENDOCCMD} extensionlist > $@.tmp mv $@.tmp $@ # Build target for running runrst more easily by hand knownrefs: commandlist.txt topiclist.txt extensionlist.txt BUILDFILES=commandlist.txt topiclist.txt extensionlist.txt # We want to generate a sub-Makefile that can build the RST/man/html doc for # each hg command. Here are templates that we'll use to generate this # sub-Makefile. HGCMDTPL=templates/cmdheader.txt TOPICTPL=templates/topicheader.txt EXTTPL=templates/extheader.txt define RuleAllCommandsTemplate HG_COMMANDS=$(1) all-commands: $$(HG_COMMANDS:%=$$(BUILDDIR)/hg-%.gendoc.txt) endef define RuleAllTopicsTemplate HG_TOPICS=$(1) all-topics: $$(HG_TOPICS:%=$$(BUILDDIR)/%.gendoc.txt) endef define RuleAllExtensionsTemplate HG_EXTENSIONS=$(1) all-extensions: $$(HG_EXTENSIONS:%=$$(BUILDDIR)/%.gendoc.txt) endef define RuleCommandTemplate $$(BUILDDIR)/hg-$C.gendoc.txt: $$(GENDOC) $$(HGCMDTPL) mkdir -p $$(@D) $${GENDOCCMD} cmd-$C > $$@.tmp mv $$@.tmp $$@ endef define RuleTopicTemplate $$(BUILDDIR)/topic-$T.gendoc.txt: $$(GENDOC) $$(TOPICTPL) mkdir -p $$(@D) $${GENDOCCMD} topic-$T > $$@.tmp mv $$@.tmp $$@ endef define RuleExtensionTemplate $$(BUILDDIR)/ext-$E.gendoc.txt: $$(GENDOC) $$(EXTTPL) mkdir -p $$(@D) $${GENDOCCMD} ext-$E > $$@.tmp mv $$@.tmp $$@ endef # Actually generate the sub-Makefile. # The $file function is only supported by GNU Make 4 and above. CommandsTopicsExtensions.mk: commandlist.txt topiclist.txt extensionlist.txt Makefile ifeq (4.0,$(firstword $(sort $(MAKE_VERSION) 4.0))) $(file > $@.tmp,# Generated by Makefile) $(file >> $@.tmp,$(call RuleAllCommandsTemplate,$(file < commandlist.txt))) $(file >> $@.tmp,$(call RuleAllTopicsTemplate,$(file < topiclist.txt))) $(file >> $@.tmp,$(call RuleAllExtensionsTemplate,$(file < extensionlist.txt))) $(foreach C,$(file < commandlist.txt),$(file >> $@.tmp,$(RuleCommandTemplate))) $(foreach T,$(file < topiclist.txt),$(file >> $@.tmp,$(RuleTopicTemplate))) $(foreach E,$(file < extensionlist.txt),$(file >> $@.tmp,$(RuleExtensionTemplate))) mv $@.tmp $@ else @echo "You are running make ${MAKE_VERSION} but you need make 4.0 or above" endif BUILDFILES+=CommandsTopicsExtensions.mk # Include the sub-Makefile that contains rules for generating each individual # command/help-topic/extension help page. This sub-Makefile is created by the # rule above (CommandsTopicsExtensions.mk) which in turn is created from the # plain-text lists of commands/help-topics/extensions. # # Any time the source code changes, these plain-text lists and this # sub-Makefile will get regenerated. Make will then restart itself to take # into account the rules inside the sub-Makefile. # # We want to avoid doing all this work for targets that we know don't need it # however. For example, running `make clean` would only generate these files # in order to delete them immediately. As a result, we don't include the # sub-Makefile (and therefore don't require generating it) if clean is one of # the targets. This might not do what we want when other targets are specified # but it's most likely what we want. ifeq (,$(filter clean,$(MAKECMDGOALS))) -include CommandsTopicsExtensions.mk endif # If the sub-Makefile is available, add all the hg commands, help-topics, and # extensions to the list of things to generate html and man pages for. # # Naming convention: # - commands: hg-foo (html and man) # - help topics: topic-foo (html), hgfoo (man) # - extensions: ext-foo (html), hgext-foo (man) # # Man pages for commands are in section 1 (user commands), topics and # extensions are in section 7 (miscellanea) # # NOTE: topics and extension are temporarily disabled for man pages because # they make docutils' RST converter crash. ifdef HG_COMMANDS HTML+=$(HG_COMMANDS:%=$(HTMLOUT)/hg-%.html) MAN+=$(HG_COMMANDS:%=$(MANOUT)/hg-%.1) endif ifdef HG_TOPICS HTML+=$(HG_TOPICS:%=$(HTMLOUT)/topic-%.html) #MAN+=$(HG_TOPICS:%=$(MANOUT)/hg%.7) endif ifdef HG_EXTENSIONS HTML+=$(HG_EXTENSIONS:%=$(HTMLOUT)/ext-%.html) #MAN+=$(HG_EXTENSIONS:%=$(MANOUT)/hgext-%.7) endif # Also add the HTML index page HTML+=$(HTMLOUT)/index.html all: man html man: $(MAN) html: $(HTML) # This logic is duplicated in setup.py:hgbuilddoc() common.txt $(SOURCES) $(SOURCES:%.txt=%.gendoc.txt): $(GENDOC) ${GENDOCCMD} "$(basename $@)" > $@.tmp mv $@.tmp $@ %: %.txt %.gendoc.txt common.txt $(RUNRST) $(PYTHON) runrst hgmanpage $(RSTARGS) --halt warning \ --strip-elements-with-class htmlonly $*.txt $* %.html: %.txt %.gendoc.txt common.txt $(RUNRST) $(PYTHON) runrst html $(RSTARGS) --halt warning \ --link-stylesheet --stylesheet-path style.css $*.txt $*.html # Rules for index page and individual command/help-topic/extension pages # Because the naming isn't the same between html and man pages, we need to # break down man pages rules a bit more. $(BUILDDIR)/index.gendoc.txt: $(GENDOC) mkdir -p $(@D) ${GENDOCCMD} index > $@.tmp mv $@.tmp $@ $(MANOUT)/hg-%.1: $(BUILDDIR)/hg-%.gendoc.txt common.txt $(RUNRST) mkdir -p $(@D) $(PYTHON) runrst hgmanpage --hg-individual-pages $(RSTARGS) --halt warning \ --strip-elements-with-class htmlonly $(BUILDDIR)/hg-$*.gendoc.txt $@ $(MANOUT)/hg%.7: $(BUILDDIR)/topic-%.gendoc.txt common.txt $(RUNRST) mkdir -p $(@D) $(PYTHON) runrst hgmanpage --hg-individual-pages $(RSTARGS) --halt warning \ --strip-elements-with-class htmlonly $(BUILDDIR)/topic-$*.gendoc.txt $@ $(MANOUT)/hgext-%.7: $(BUILDDIR)/ext-%.gendoc.txt common.txt $(RUNRST) mkdir -p $(@D) $(PYTHON) runrst hgmanpage --hg-individual-pages $(RSTARGS) --halt warning \ --strip-elements-with-class htmlonly $(BUILDDIR)/ext-$*.gendoc.txt $@ $(HTMLOUT)/%.html: $(BUILDDIR)/%.gendoc.txt common.txt $(RUNRST) mkdir -p $(@D) $(PYTHON) runrst html --hg-individual-pages $(RSTARGS) --halt warning \ --link-stylesheet --stylesheet-path style.css $(BUILDDIR)/$*.gendoc.txt $@ MANIFEST: man html # tracked files are already in the main MANIFEST $(RM) $@ for i in $(MAN) $(HTML); do \ echo "doc/$$i" >> $@ ; \ done install: man for i in $(MAN) ; do \ subdir=`echo $$i | sed -n 's/^.*\.\([0-9]\)$$/man\1/p'` ; \ mkdir -p "$(DESTDIR)$(MANDIR)"/$$subdir ; \ $(INSTALL) $$i "$(DESTDIR)$(MANDIR)"/$$subdir ; \ done # The clean target explicitly doesn't bother with the sub-Makefile, so we don't # know anything about all the command/topic/extension targets and files. # $(HTML) only has the basic topics, so we need to delete $(HTMLOUT)/*.html and # other similar files "by hand" here. clean: $(RM) $(MAN) $(HTML) common.txt $(SOURCES) MANIFEST *.gendoc.txt $(BUILDFILES) $(BUILDDIR)/*.gendoc.* $(HTMLOUT)/*.html