]> rtime.felk.cvut.cz Git - l4.git/blob - l4/mk/doc.mk
8877a1af1639a37546116014c00ed3ef8e3d3f4e
[l4.git] / l4 / mk / doc.mk
1 # -*- Makefile -*-
2 #
3 # DROPS (Dresden Realtime OPerating System) Component
4 #
5 # Makefile-Template for doc directories
6 #
7 # install.inc is used, see there for further documentation
8
9 ifeq ($(origin _L4DIR_MK_DOC_MK),undefined)
10 _L4DIR_MK_DOC_MK=y
11
12 ROLE = doc.mk
13
14 include $(L4DIR)/mk/Makeconf
15 $(GENERAL_D_LOC): $(L4DIR)/mk/doc.mk
16
17 ifeq ($(IN_OBJ_DIR),)
18 ##################################################################
19 #
20 # Empty IN_OBJ_DIR means we are in the source directory and have 
21 # to first generate a Makefile in the build-dir.
22 #
23 ##################################################################
24
25 all install clean cleanall help:: $(OBJ_DIR)/Makefile.build
26         $(VERBOSE)PWD=$(OBJ_DIR) $(MAKE) -C $(OBJ_DIR) O=$(OBJ_BASE) -f Makefile.build $@
27
28
29 $(OBJ_DIR)/Makefile.build: $(SRC_DIR)/Makefile
30         $(VERBOSE)install -d $(dir $@)
31         $(VERBOSE)echo 'IN_OBJ_DIR=1'                 > $@
32         $(VERBOSE)echo 'L4DIR=$(L4DIR_ABS)'          >> $@
33         $(VERBOSE)echo 'SRC_DIR=$(SRC_DIR)'          >> $@
34         $(VERBOSE)echo 'OBJ_BASE=$(OBJ_BASE)'        >> $@
35         $(VERBOSE)echo 'PKGDIR_ABS=$(PKGDIR_ABS)'    >> $@
36         $(VERBOSE)echo 'vpath %.fig $(SRC_DIR)'      >> $@
37         $(VERBOSE)echo 'vpath %.tex $(SRC_DIR)'      >> $@
38         $(VERBOSE)echo 'include $(SRC_DIR)/Makefile' >> $@
39                                                                         
40 else
41 ###################################################################
42 #
43 # We are in the build directory and can process the documentation
44
45 ###################################################################
46
47 # default is to install all targets
48 INSTALL_TARGET_MASK ?= %
49
50 ifneq ($(TARGET),)
51 # if no SRC_DOX is given, but TARGET, extract it from TARGET
52 ifeq ($(origin SRC_DOX),undefined)
53 SRC_DOX            := $(filter $(addsuffix .cfg, $(TARGET)),$(wildcard *.cfg))
54 ifneq ($(SRC_DOX),)
55 $(error SRC_DOX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
56 endif
57 endif
58 # the same for SRC_TEX
59 ifeq ($(origin SRC_TEX),undefined)
60 SRC_TEX            := $(filter $(TARGET:.ps=.tex),$(wildcard *.tex)) \
61                       $(filter $(TARGET:.pdf=.tex),$(wildcard *.tex))
62                       $(filter $(TARGET:.dvi=.tex),$(wildcard *.tex))
63 ifneq ($(SRC_TEX),)
64 $(error SRC_TEX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
65 endif
66 endif
67 endif
68
69 TARGET_DOX      = $(SRC_DOX:.cfg=) $(SRC_DOX_REF:.cfg=) \
70                   $(SRC_DOX_GUIDE:.cfg=) $(SRC_DOX_INT:.cfg=)
71 INSTALL_TARGET_DOX ?= $(filter $(INSTALL_TARGET_MASK), $(TARGET_DOX))
72 TARGET_TEX      ?= $(SRC_TEX:.tex=.ps) $(SRC_TEX:.tex=.pdf)
73 DEPS            += $(foreach x,$(SRC_TEX:.tex=.dvi),$(dir $x).$(notdir $x).d)
74
75 # if no TARGET is given, generate it from all types of targets
76 TARGET          ?= $(TARGET_DOX) $(TARGET_TEX)
77 DEPS            += $(foreach file,$(TARGET),$(dir $(file)).$(notdir $(file)).d)
78
79 all:: $(TARGET)
80 $(TARGET): $(OBJ_DIR)/.general.d
81
82 ####################################################################
83 #
84 # Doxygen specific
85 #
86 ####################################################################
87 DOXY_FLAGS += $(DOXY_FLAGS_$@)
88
89 OUTPUTDIR = $(shell perl -n -e '/^\s*OUTPUT_DIRECTORY\s*=\s*(\S+)/ && print "$$1\n"' $(1))
90
91 # we refer to %/html sometimes. However, make fails on a rule of the form
92 # "% %/html:%.cfg", thus the workaround (others than static-pattern-rules
93 # won't work)
94 $(addprefix $(OBJ_DIR)/,$(addsuffix /html,$(TARGET_DOX))):$(OBJ_DIR)/%/html:$(OBJ_DIR)/%
95
96 # We can give an internal rule for doxygen, as the directory specified
97 # in the config-file should be the name of the config file with the
98 # .cfg removed.
99 # Use make DOXY_FAST=y to just build the HTML without graphics
100 # Use make DOXY_FULL=y to build HTMl with graphics and the PDF
101 # $(VERBOSE)$(ECHO) ENABLED_SECTIONS=WORKING_SUBPAGES >> $@.flags
102 $(OBJ_DIR)/% $(OBJ_DIR)/%/html:$(SRC_DIR)/%.cfg
103         #generate the flags-file
104         $(VERBOSE)$(MKDIR) $@
105         $(VERBOSE)$(ECHO) '@INCLUDE_PATH=/'                                 > $@.flags
106         $(VERBOSE)$(ECHO) '@INCLUDE=$(SRC_DIR)/$(notdir $<)'               >> $@.flags
107         $(VERBOSE)$(ECHO) $(DOXY_FLAGS)                                    >> $@.flags
108         $(VERBOSE)$(ECHO) OUTPUT_DIRECTORY=$(OBJ_DIR)/$(call OUTPUTDIR,$<) >> $@.flags
109         $(VERBOSE)if [ -n "$(DOXY_FAST)" ]; then $(ECHO) HAVE_DOT=NO;  $(ECHO) GENERATE_LATEX=NO;  fi   >> $@.flags
110         $(VERBOSE)if [ -n "$(DOXY_FULL)" ]; then $(ECHO) HAVE_DOT=YES; $(ECHO) GENERATE_LATEX=YES; fi   >> $@.flags
111         $(VERBOSE)if [ -n "$(DOXY_RELEASE)" ]; then \
112                     $(ECHO) HAVE_DOT=YES; \
113                     $(ECHO) GENERATE_LATEX=YES; \
114                     $(ECHO) SHOW_FILES=NO; \
115                     $(ECHO) SHOW_DIRECTORIES=NO; \
116                     $(ECHO) INTERNAL_DOCS=NO; \
117                     $(ECHO) GENERATE_TODOLIST=NO; \
118                     $(ECHO) GENERATE_TESTLIST=NO; \
119                     $(ECHO) GENERATE_BUGLIST=NO; \
120                     $(ECHO) HIDE_UNDOC_CLASSES=YES; \
121                   fi   >> $@.flags
122         $(VERBOSE)cd $(L4DIR)/pkg && \
123           for f in $(addsuffix /doc/files.cfg,*); \
124             do echo '@INCLUDE = $$(L4DIR)/pkg/'$$f; done >> $@.flags
125         $(VERBOSE)cd $(OBJ_BASE)/include && $(call MAKEDEP,doxygen) L4DIR=$(L4DIR) $(DOXYGEN) $@.flags
126         $(VERBOSE)for file in $(ADD_FILES_TO_HTML); do cp $$file $@/html; done
127         $(VERBOSE)( [ -r $@/latex/Makefile ] && \
128            echo | PWD=$@/latex $(MAKE) -C $@/latex ) || true
129         $(VERBOSE)if [ -d $@ ] ; then touch $@ ; fi
130
131 # Installation rules follow
132 #
133 # define LOCAL_INSTALLDIR prior to including install.inc, where the install-
134 # rules are defined. Same for INSTALLDIR.
135 INSTALLDIR_HTML         ?= $(DROPS_STDDIR)/doc/html
136 INSTALLFILE_HTML        ?= $(CP) -pR $(1) $(2)
137 INSTALLDIR_HTML_LOCAL   ?= $(OBJ_BASE)/doc/html
138 INSTALLFILE_HTML_LOCAL  ?= $(if $(call is_dir,$(2)), \
139                               find '$(dir $(1))' -name '$(notdir $(1))' | xargs $(LN) -t $(2) -sf, \
140                               find '$(dir $(1))' -name '$(notdir $(1))' | xargs -I '{}' $(LN) -sf '{}' $(2))
141
142 INSTALLDIR              = $(INSTALLDIR_HTML)
143 INSTALLFILE             = $(INSTALLFILE_HTML)
144 INSTALLDIR_LOCAL        = $(INSTALLDIR_HTML_LOCAL)
145 INSTALLFILE_LOCAL       = $(INSTALLFILE_HTML_LOCAL)
146
147 all::   $(TARGET) \
148         $(addprefix $(INSTALLDIR_LOCAL)/, $(addsuffix .title, $(INSTALL_TARGET_DOX)))
149
150 $(OBJ_DIR)/$(SRC_DOX_REF:.cfg=.title): BID_DOC_DOXTYPE=ref
151 $(OBJ_DIR)/$(SRC_DOX_GUIDE:.cfg=.title): BID_DOC_DOXTYPE=guide
152 $(OBJ_DIR)/$(SRC_DOX_INT:.cfg=.title): BID_DOC_DOXTYPE=int
153
154 # first line: type
155 # second line: title that will appear at the generated index page
156 $(OBJ_DIR)/%.title:$(SRC_DIR)/%.cfg $(OBJ_DIR)/.general.d
157         $(VERBOSE)$(ECHO) $(BID_DOC_DOXTYPE)>$@
158         $(VERBOSE)MAKEFLAGS= $(MAKE) -s -f $(L4DIR)/mk/makehelpers.inc -f $< \
159            BID_print VAR=PROJECT_NAME >>$@
160
161 # Install the title file locally
162 # The installed title file depends on the installed doku for message reasons
163 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f).title):$(INSTALLDIR_LOCAL)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR_LOCAL)/%
164         $(VERBOSE)$(call INSTALLFILE_LOCAL,$<,$@)
165         @$(call UPDATE_HTML_MESSAGE,$(INSTALLDIR_LOCAL))
166
167 # Install the docu locally, the title file will depend on
168 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f)):$(INSTALLDIR_LOCAL)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
169         @$(INSTALL_DOC_LOCAL_MESSAGE)
170         $(VERBOSE)$(INSTALL) -d $@
171         $(VERBOSE)$(call INSTALLFILE_LOCAL,$</html/*,$@) 
172
173 # Install the title file globally
174 # The installed title file depends on the installed doku for message reasons
175 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f).title):$(INSTALLDIR)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR)/%
176         $(VERBOSE)$(call INSTALLFILE,$<,$@)
177         @$(call UPDATE_HTML_MESSAGE,$(INSTALLDIR))
178
179 # Install the docu globally, the title file will depend on
180 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f)):$(INSTALLDIR)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
181         @$(INSTALL_DOC_MESSAGE)
182         $(if $(INSTALLFILE),$(VERBOSE)$(INSTALL) -d $@)
183         $(VERBOSE)$(call INSTALLFILE,$</html/*,$@)
184
185 install:: $(addprefix $(INSTALLDIR)/,$(addsuffix .title,$(INSTALL_TARGET_DOX)))
186 .PHONY: $(addprefix $(INSTALLDIR)/,$(INSTALL_TARGET_DOX) \
187                                    $(addsuffix .title,$(INSTALL_TARGET_DOX)))
188
189
190 #################################################################
191 #
192 # Latex specific
193 #
194 #################################################################
195
196 FIG2EPS_PROG ?= fig2dev -L eps
197 FIG2PDF_PROG ?= fig2dev -L pdf
198 FIG2PNG_PROG ?= fig2dev -L png
199
200 $(SRC_TEX:.tex=.dvi) $(TARGET): $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png) $(SRC_FIG:.fig=.eps)
201
202 %.eps: %.fig $(OBJ_DIR)/.general.d
203         @$(GEN_MESSAGE)
204         $(VERBOSE)$(FIG2EPS_PROG) $< $@
205
206 %.pdf: %.fig $(OBJ_DIR)/.general.d
207         @$(GEN_MESSAGE)
208         $(VERBOSE)$(FIG2PDF_PROG) $< $@
209
210 %.png: %.fig $(OBJ_DIR)/.general.d
211         @$(GEN_MESSAGE)
212         $(VERBOSE)$(FIG2PNG_PROG) $< $@
213
214 %.ps: %.dvi $(OBJ_DIR)/.general.d
215         @$(GEN_MESSAGE)
216         $(VERBOSE)$(call MAKEDEP,dvips) dvips -o $@ $<
217         $(VERBOSE)$(VIEWERREFRESH_PS)
218
219 %.pdf: %.tex $(OBJ_DIR)/.general.d
220         @$(GEN_MESSAGE)
221         $(VERBOSE)$(PDFLATEX) $< || \
222                 (($(GREP) 'TeX capacity exceeded' $*.log && \
223                 echo -e "\n\033[31mIncrease pool_size to 200000 in" \
224                 "/etc/texmf/texmf.cnf!\033[m\n" && false) || false)
225         $(VERBOSE)$(GREP) '\citation' $*.aux && \
226                 bibtex $* || true
227         $(VERBOSE)(export size=1; touch $@; \
228                 until [ $$size -eq `ls -o $@ | awk '{print $$4}'` ]; do\
229                   export size=`ls -o $@ | awk '{print $$4}'` ;\
230                   $(PDFLATEX) $< ;\
231                 done)
232 # one more time, just to be sure ...
233         $(VERBOSE)$(PDFLATEX) $<
234
235 %.dvi: %.tex $(OBJ_DIR)/.general.d
236         @$(GEN_MESSAGE)
237         $(VERBOSE)$(call MAKEDEP,$(LATEX)) $(LATEX) $<
238         $(VERBOSE)if grep -q '\indexentry' $*.idx; then makeindex $*; fi
239         $(VERBOSE)if grep -q '\citation' $*.aux; then bibtex $*; fi
240         # Do we really need to call latex unconditionally again? Isn't it
241         # sufficient to check the logfile for the "rerun" text?
242         $(VERBOSE)$(LATEX) $<
243         $(VERBOSE)latex_count=5 ; \
244         while egrep -s 'Rerun (LaTeX|to get cross-references right)' $*.log &&\
245                 [ $$latex_count -gt 0 ] ; do \
246                 $(LATEX) $< \
247                 let latex_count=$$latex_count-1 ;\
248         done
249         $(VERBOSE)$(VIEWERREFRESH_DVI)
250
251 SHOWTEX ?= $(firstword $(SRC_TEX))
252 SHOWDVI ?= $(SHOWTEX:.tex=.dvi)
253 SHOWPS  ?= $(SHOWTEX:.tex=.ps)
254 SHOWPDF ?= $(SHOWTEX:.tex=.pdf)
255
256 VIEWER_DVI        ?= xdvi
257 VIEWER_PS         ?= gv
258 VIEWER_PDF        ?= xpdf
259 VIEWERREFRESH_DVI ?= killall -USR1 xdvi xdvi.bin xdvi.real || true
260 VIEWERREFRESH_PS  ?= killall -HUP $(VIEWER_PS) || true
261
262 dvi:    $(SHOWDVI)
263 show showdvi: dvi
264         $(VERBOSE)$(VIEWER_DVI) $(SHOWDVI) &
265
266 ps:     $(SHOWPS)
267 showps: ps
268         $(VERBOSE)$(VIEWER_PS) $(SHOWPS) &
269
270 pdf:    $(SHOWPDF)
271 showpdf: pdf
272         $(VERBOSE)$(VIEWER_PDF) $(SHOWPDF) &
273
274 clean::
275         $(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
276                 $(addsuffix .title,$(TARGET_DOX)))
277         $(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
278                 $(addsuffix .flags,$(TARGET_DOX)))
279         $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, $(foreach ext, \
280                 aux bbl blg dvi idx ilg ind log lod ltf toc out, \
281                 $(SRC_TEX:.tex=.$(ext))) texput.log ))
282
283 cleanall:: clean
284         $(VERBOSE)$(RM) -r $(wildcard $(addprefix $(OBJ_DIR)/, \
285                 $(TARGET)) $(wildcard .*.d))
286         $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
287                 $(SRC_TEX:.tex=.ps) $(SRC_TEX:.tex=.pdf)))
288         $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
289                 $(SRC_FIG:.fig=.eps) $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png)))
290         $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
291                 Makefile Makefile.build))
292
293 .PHONY: all clean cleanall config help install oldconfig txtconfig
294 .PHONY: ps pdf dvi showps showpdf showdvi show
295
296 help::
297         @echo "Specify a target:"
298         @echo "all       - generate documentation and install locally"
299 ifneq (,$(INSTALL_TARGET_DOX))
300         @echo "install   - generate documentation and install globally"
301 endif
302         @echo "dvi       - compile the primary TeX file into dvi"
303         @echo "showdvi   - invoke the dvi viewer on the primary TeX file"
304         @echo "ps        - compile the primary TeX file into ps"
305         @echo "showps    - invoke the ps viewer on the primary TeX file"
306         @echo "pdf       - compile the primary TeX file into pdf"
307         @echo "showpdf   - invoke the pdf viewer on the primary TeX file"
308         @echo "clean     - delete generated intermediate files"
309         @echo "cleanall  - delete all generated files"
310         @echo "help      - this help"
311         @echo
312 ifneq (,$(SRC_TEX))
313         @echo "Primary TeX file: $(SHOWTEX)"
314         @echo "Other documentation to be built: $(filter-out $(SHOWPDF) $(SHOWPS) $(SHOWDVI),$(TARGET))"
315 else
316 ifneq (,$(TARGET_DOX))
317         @echo "Primary Doxygen file: $(addsuffix .cfg, $(TARGET_DOX))"
318 endif
319         @echo "Documentation to be built: $(TARGET)"
320 endif
321
322 -include $(DEPSVAR)
323
324 endif   # IN_OBJ_DIR
325
326 endif   # _L4DIR_MK_DOC_MK undefined