##// END OF EJS Templates
mergestate: reduce the number of attribute lookups...
mergestate: reduce the number of attribute lookups This code is called a lot during updates, this is a very small but also very easy thing to do.

File last commit:

r52914:2a875530 default
r52925:09a54892 default
Show More
Makefile
228 lines | 7.4 KiB | text/x-makefile | MakefileLexer
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