3 # DROPS (Dresden Realtime OPerating System) Component
5 # Makefile-Template for doc directories
7 # install.inc is used, see there for further documentation
9 ifeq ($(origin _L4DIR_MK_DOC_MK),undefined)
14 include $(L4DIR)/mk/Makeconf
15 $(GENERAL_D_LOC): $(L4DIR)/mk/doc.mk
18 ##################################################################
20 # Empty IN_OBJ_DIR means we are in the source directory and have
21 # to first generate a Makefile in the build-dir.
23 ##################################################################
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 $@
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' >> $@
41 ###################################################################
43 # We are in the build directory and can process the documentation
45 ###################################################################
47 # default is to install all targets
48 INSTALL_TARGET_MASK ?= %
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))
55 $(error SRC_DOX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
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))
64 $(error SRC_TEX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
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)
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)
80 $(TARGET): $(OBJ_DIR)/.general.d
82 ####################################################################
86 ####################################################################
87 DOXY_FLAGS += $(DOXY_FLAGS_$@)
89 OUTPUTDIR = $(shell perl -n -e '/^\s*OUTPUT_DIRECTORY\s*=\s*(\S+)/ && print "$$1\n"' $(1))
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
94 $(addprefix $(OBJ_DIR)/,$(addsuffix /html,$(TARGET_DOX))):$(OBJ_DIR)/%/html:$(OBJ_DIR)/%
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
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; \
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
131 # Installation rules follow
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))
142 INSTALLDIR = $(INSTALLDIR_HTML)
143 INSTALLFILE = $(INSTALLFILE_HTML)
144 INSTALLDIR_LOCAL = $(INSTALLDIR_HTML_LOCAL)
145 INSTALLFILE_LOCAL = $(INSTALLFILE_HTML_LOCAL)
148 $(addprefix $(INSTALLDIR_LOCAL)/, $(addsuffix .title, $(INSTALL_TARGET_DOX)))
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
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 >>$@
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))
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/*,$@)
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))
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/*,$@)
185 install:: $(addprefix $(INSTALLDIR)/,$(addsuffix .title,$(INSTALL_TARGET_DOX)))
186 .PHONY: $(addprefix $(INSTALLDIR)/,$(INSTALL_TARGET_DOX) \
187 $(addsuffix .title,$(INSTALL_TARGET_DOX)))
190 #################################################################
194 #################################################################
196 FIG2EPS_PROG ?= fig2dev -L eps
197 FIG2PDF_PROG ?= fig2dev -L pdf
198 FIG2PNG_PROG ?= fig2dev -L png
200 $(SRC_TEX:.tex=.dvi) $(TARGET): $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png) $(SRC_FIG:.fig=.eps)
202 %.eps: %.fig $(OBJ_DIR)/.general.d
204 $(VERBOSE)$(FIG2EPS_PROG) $< $@
206 %.pdf: %.fig $(OBJ_DIR)/.general.d
208 $(VERBOSE)$(FIG2PDF_PROG) $< $@
210 %.png: %.fig $(OBJ_DIR)/.general.d
212 $(VERBOSE)$(FIG2PNG_PROG) $< $@
214 %.ps: %.dvi $(OBJ_DIR)/.general.d
216 $(VERBOSE)$(call MAKEDEP,dvips) dvips -o $@ $<
217 $(VERBOSE)$(VIEWERREFRESH_PS)
219 %.pdf: %.tex $(OBJ_DIR)/.general.d
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 && \
227 $(VERBOSE)(export size=1; touch $@; \
228 until [ $$size -eq `ls -o $@ | awk '{print $$4}'` ]; do\
229 export size=`ls -o $@ | awk '{print $$4}'` ;\
232 # one more time, just to be sure ...
233 $(VERBOSE)$(PDFLATEX) $<
235 %.dvi: %.tex $(OBJ_DIR)/.general.d
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 \
247 let latex_count=$$latex_count-1 ;\
249 $(VERBOSE)$(VIEWERREFRESH_DVI)
251 SHOWTEX ?= $(firstword $(SRC_TEX))
252 SHOWDVI ?= $(SHOWTEX:.tex=.dvi)
253 SHOWPS ?= $(SHOWTEX:.tex=.ps)
254 SHOWPDF ?= $(SHOWTEX:.tex=.pdf)
259 VIEWERREFRESH_DVI ?= killall -USR1 xdvi xdvi.bin xdvi.real || true
260 VIEWERREFRESH_PS ?= killall -HUP $(VIEWER_PS) || true
264 $(VERBOSE)$(VIEWER_DVI) $(SHOWDVI) &
268 $(VERBOSE)$(VIEWER_PS) $(SHOWPS) &
272 $(VERBOSE)$(VIEWER_PDF) $(SHOWPDF) &
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 ))
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))
293 .PHONY: all clean cleanall config help install oldconfig txtconfig
294 .PHONY: ps pdf dvi showps showpdf showdvi show
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"
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"
313 @echo "Primary TeX file: $(SHOWTEX)"
314 @echo "Other documentation to be built: $(filter-out $(SHOWPDF) $(SHOWPS) $(SHOWDVI),$(TARGET))"
316 ifneq (,$(TARGET_DOX))
317 @echo "Primary Doxygen file: $(addsuffix .cfg, $(TARGET_DOX))"
319 @echo "Documentation to be built: $(TARGET)"
326 endif # _L4DIR_MK_DOC_MK undefined