1# -*- makefile-gmake -*-
2
3dir := doc
4
5# You can set these variables from the command line.
6SPHINXOPTS    := -q
7SPHINXBUILD   = env LD_LIBRARY_PATH=${NOTMUCH_BUILDDIR}/lib sphinx-build
8DOCBUILDDIR      := $(dir)/_build
9
10# Internal variables.
11ALLSPHINXOPTS   := $(SPHINXOPTS) $(srcdir)/$(dir)
12APIMAN		:= $(DOCBUILDDIR)/man/man3/notmuch.3
13DOXYFILE	:= $(srcdir)/$(dir)/doxygen.cfg
14
15MAN1_RST := $(wildcard $(srcdir)/doc/man1/*.rst)
16MAN5_RST := $(wildcard $(srcdir)/doc/man5/*.rst)
17MAN7_RST := $(wildcard $(srcdir)/doc/man7/*.rst)
18MAN_RST_FILES := $(MAN1_RST) $(MAN5_RST) $(MAN7_RST)
19ALL_RST_FILES := $(MAN_RST_FILES) $(srcdir)/doc/notmuch-emacs.rst
20
21MAN1_ROFF := $(patsubst $(srcdir)/doc/%,$(DOCBUILDDIR)/man/%,$(MAN1_RST:.rst=.1))
22MAN5_ROFF := $(patsubst $(srcdir)/doc/%,$(DOCBUILDDIR)/man/%,$(MAN5_RST:.rst=.5))
23MAN7_ROFF := $(patsubst $(srcdir)/doc/%,$(DOCBUILDDIR)/man/%,$(MAN7_RST:.rst=.7))
24MAN_ROFF_FILES := $(MAN1_ROFF) $(MAN5_ROFF) $(MAN7_ROFF)
25
26MAN_GZIP_FILES := $(addsuffix .gz,${MAN_ROFF_FILES})
27
28MAN1_TEXI := $(patsubst $(srcdir)/doc/man1/%.rst,$(DOCBUILDDIR)/texinfo/%.texi,$(MAN1_RST))
29MAN5_TEXI := $(patsubst $(srcdir)/doc/man5/%.rst,$(DOCBUILDDIR)/texinfo/%.texi,$(MAN5_RST))
30MAN7_TEXI := $(patsubst $(srcdir)/doc/man7/%.rst,$(DOCBUILDDIR)/texinfo/%.texi,$(MAN7_RST))
31INFO_TEXI_FILES := $(MAN1_TEXI) $(MAN5_TEXI) $(MAN7_TEXI)
32ifeq ($(WITH_EMACS),1)
33	INFO_TEXI_FILES += $(DOCBUILDDIR)/texinfo/notmuch-emacs.texi
34endif
35
36INFO_INFO_FILES := $(INFO_TEXI_FILES:.texi=.info)
37
38.PHONY: sphinx-html sphinx-texinfo sphinx-info doc-prereqs
39
40.PHONY: install-man build-man apidocs install-apidocs
41
42%.gz: %
43	rm -f $@ && gzip --no-name --stdout $^ > $@
44
45ifeq ($(WITH_EMACS),1)
46$(DOCBUILDDIR)/.roff.stamp $(DOCBUILDDIR)/.html.stamp $(DOCBUILDDIR)/.texi.stamp : docstring.stamp
47endif
48
49ifeq ($(HAVE_PYTHON3_CFFI),1)
50doc-prereqs: python-cffi-bindings
51endif
52
53sphinx-html: $(DOCBUILDDIR)/.html.stamp
54
55$(DOCBUILDDIR)/.html.stamp: $(ALL_RST_FILES) doc-prereqs
56	$(SPHINXBUILD) -b html -d $(DOCBUILDDIR)/html_doctrees $(ALLSPHINXOPTS) $(DOCBUILDDIR)/html
57	touch $@
58
59sphinx-texinfo: $(DOCBUILDDIR)/.texi.stamp
60
61$(DOCBUILDDIR)/.texi.stamp: $(ALL_RST_FILES) doc-prereqs
62	$(SPHINXBUILD) -b texinfo -d $(DOCBUILDDIR)/texinfo_doctrees $(ALLSPHINXOPTS) $(DOCBUILDDIR)/texinfo
63	touch $@
64
65sphinx-info: sphinx-texinfo
66	$(MAKE) -C $(DOCBUILDDIR)/texinfo info
67
68# Use the man page converter that is available. We should never depend
69# on MAN_ROFF_FILES if a converter is not available.
70${MAN_ROFF_FILES}: $(DOCBUILDDIR)/.roff.stamp
71
72# By using $(DOCBUILDDIR)/.roff.stamp instead of ${MAN_ROFF_FILES}, we
73# convey to make that a single invocation of this recipe builds all
74# of the roff files.  This prevents parallel make from starting an
75# instance of this recipe for each roff file.
76$(DOCBUILDDIR)/.roff.stamp: ${MAN_RST_FILES}
77ifeq ($(HAVE_SPHINX),1)
78	$(SPHINXBUILD) -b man -d $(DOCBUILDDIR)/man_doctrees $(ALLSPHINXOPTS) $(DOCBUILDDIR)/man
79	for section in 1 5 7; do \
80	    mkdir -p $(DOCBUILDDIR)/man/man$${section}; \
81	    mv $(DOCBUILDDIR)/man/*.$${section} $(DOCBUILDDIR)/man/man$${section}; \
82	done
83else
84	@echo "Fatal: build dependency fail."
85	@false
86endif
87	touch $@
88
89install-man: install-apidocs
90
91ifeq ($(HAVE_DOXYGEN),1)
92MAN_GZIP_FILES += ${APIMAN}.gz
93apidocs: $(APIMAN)
94install-apidocs: ${APIMAN}.gz
95	mkdir -p "$(DESTDIR)$(mandir)/man3"
96	install -m0644 $(filter %.3.gz,$(MAN_GZIP_FILES)) $(DESTDIR)/$(mandir)/man3
97
98$(APIMAN): $(dir)/config.dox $(srcdir)/$(dir)/doxygen.cfg $(srcdir)/lib/notmuch.h
99	mkdir -p $(DOCBUILDDIR)/man/man3
100	doxygen $(DOXYFILE)
101	rm -f $(DOCBUILDDIR)/man/man3/_*.3
102	perl -pi -e 's/^[.]RI "\\fI/.RI "\\fP/' $(APIMAN)
103else
104apidocs:
105install-apidocs:
106endif
107
108# Do not try to build or install man pages if a man page converter is
109# not available.
110ifeq ($(HAVE_SPHINX),0)
111build-man:
112install-man:
113	@echo "No sphinx, will not install man pages."
114else
115build-man: ${MAN_GZIP_FILES}
116install-man: ${MAN_GZIP_FILES}
117	mkdir -m0755 -p "$(DESTDIR)$(mandir)/man1"
118	mkdir -m0755 -p "$(DESTDIR)$(mandir)/man5"
119	mkdir -m0755 -p "$(DESTDIR)$(mandir)/man7"
120	install -m0644 $(filter %.1.gz,$(MAN_GZIP_FILES)) $(DESTDIR)/$(mandir)/man1
121	install -m0644 $(filter %.5.gz,$(MAN_GZIP_FILES)) $(DESTDIR)/$(mandir)/man5
122	install -m0644 $(filter %.7.gz,$(MAN_GZIP_FILES)) $(DESTDIR)/$(mandir)/man7
123	cd $(DESTDIR)/$(mandir)/man1 && ln -sf notmuch.1.gz notmuch-setup.1.gz
124endif
125
126ifneq ($(HAVE_SPHINX)$(HAVE_MAKEINFO),11)
127build-info:
128	@echo "Missing sphinx or makeinfo, not building info pages"
129else
130build-info: sphinx-info
131endif
132
133ifneq ($(HAVE_SPHINX)$(HAVE_MAKEINFO)$(HAVE_INSTALL_INFO),111)
134install-info:
135	@echo "Missing prerequisites, not installing info pages"
136else
137install-info: build-info
138	mkdir -m0755 -p "$(DESTDIR)$(infodir)"
139	install -m0644 $(INFO_INFO_FILES) $(DESTDIR)$(infodir)
140	for file in $(INFO_INFO_FILES); do install-info $$file $(DESTDIR)$(infodir)/dir; done
141endif
142
143$(dir)/config.dox: version.stamp
144	echo "PROJECT_NAME = \"Notmuch $(VERSION)\"" > $@
145	echo "INPUT=${srcdir}/lib/notmuch.h" >> $@
146
147CLEAN := $(CLEAN) $(DOCBUILDDIR) $(DOCBUILDDIR)/.roff.stamp $(DOCBUILDDIR)/.texi.stamp
148CLEAN := $(CLEAN) $(DOCBUILDDIR)/.html.stamp
149CLEAN := $(CLEAN) $(MAN_GZIP_FILES) $(MAN_ROFF_FILES) $(dir)/conf.pyc $(dir)/config.dox
150