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; \
121 $(ECHO) HIDE_UNDOC_MEMBERS=YES; \
123 $(VERBOSE)cd $(L4DIR)/pkg && \
124 for f in $(addsuffix /doc/files.cfg,*); \
125 do echo '@INCLUDE = $$(L4DIR)/pkg/'$$f; done >> $@.flags
126 $(VERBOSE)cd $(OBJ_BASE)/include && $(call MAKEDEP,doxygen) L4DIR=$(L4DIR) $(DOXYGEN) $@.flags
127 $(VERBOSE)for file in $(ADD_FILES_TO_HTML); do cp $$file $@/html; done
128 $(VERBOSE)( [ -r $@/latex/Makefile ] && \
129 echo | PWD=$@/latex $(MAKE) -C $@/latex ) || true
130 $(VERBOSE)if [ -d $@ ] ; then touch $@ ; fi
132 # Installation rules follow
134 # define LOCAL_INSTALLDIR prior to including install.inc, where the install-
135 # rules are defined. Same for INSTALLDIR.
136 INSTALLDIR_HTML ?= $(DROPS_STDDIR)/doc/html
137 INSTALLFILE_HTML ?= $(CP) -pR $(1) $(2)
138 INSTALLDIR_HTML_LOCAL ?= $(OBJ_BASE)/doc/html
139 INSTALLFILE_HTML_LOCAL ?= $(if $(call is_dir,$(2)), \
140 find '$(dir $(1))' -name '$(notdir $(1))' | xargs $(LN) -t $(2) -sf, \
141 find '$(dir $(1))' -name '$(notdir $(1))' | xargs -I '{}' $(LN) -sf '{}' $(2))
143 INSTALLDIR = $(INSTALLDIR_HTML)
144 INSTALLFILE = $(INSTALLFILE_HTML)
145 INSTALLDIR_LOCAL = $(INSTALLDIR_HTML_LOCAL)
146 INSTALLFILE_LOCAL = $(INSTALLFILE_HTML_LOCAL)
149 $(addprefix $(INSTALLDIR_LOCAL)/, $(addsuffix .title, $(INSTALL_TARGET_DOX)))
151 $(OBJ_DIR)/$(SRC_DOX_REF:.cfg=.title): BID_DOC_DOXTYPE=ref
152 $(OBJ_DIR)/$(SRC_DOX_GUIDE:.cfg=.title): BID_DOC_DOXTYPE=guide
153 $(OBJ_DIR)/$(SRC_DOX_INT:.cfg=.title): BID_DOC_DOXTYPE=int
156 # second line: title that will appear at the generated index page
157 $(OBJ_DIR)/%.title:$(SRC_DIR)/%.cfg $(OBJ_DIR)/.general.d
158 $(VERBOSE)$(ECHO) $(BID_DOC_DOXTYPE)>$@
159 $(VERBOSE)MAKEFLAGS= $(MAKE) -s -f $(L4DIR)/mk/makehelpers.inc -f $< \
160 BID_print VAR=PROJECT_NAME >>$@
162 # Install the title file locally
163 # The installed title file depends on the installed doku for message reasons
164 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f).title):$(INSTALLDIR_LOCAL)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR_LOCAL)/%
165 $(VERBOSE)$(call INSTALLFILE_LOCAL,$<,$@)
166 @$(call UPDATE_HTML_MESSAGE,$(INSTALLDIR_LOCAL))
168 # Install the docu locally, the title file will depend on
169 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f)):$(INSTALLDIR_LOCAL)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
170 @$(INSTALL_DOC_LOCAL_MESSAGE)
171 $(VERBOSE)$(INSTALL) -d $@
172 $(VERBOSE)$(call INSTALLFILE_LOCAL,$</html/*,$@)
174 # Install the title file globally
175 # The installed title file depends on the installed doku for message reasons
176 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f).title):$(INSTALLDIR)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR)/%
177 $(VERBOSE)$(call INSTALLFILE,$<,$@)
178 @$(call UPDATE_HTML_MESSAGE,$(INSTALLDIR))
180 # Install the docu globally, the title file will depend on
181 $(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f)):$(INSTALLDIR)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
182 @$(INSTALL_DOC_MESSAGE)
183 $(if $(INSTALLFILE),$(VERBOSE)$(INSTALL) -d $@)
184 $(VERBOSE)$(call INSTALLFILE,$</html/*,$@)
186 install:: $(addprefix $(INSTALLDIR)/,$(addsuffix .title,$(INSTALL_TARGET_DOX)))
187 .PHONY: $(addprefix $(INSTALLDIR)/,$(INSTALL_TARGET_DOX) \
188 $(addsuffix .title,$(INSTALL_TARGET_DOX)))
191 #################################################################
195 #################################################################
197 FIG2EPS_PROG ?= fig2dev -L eps
198 FIG2PDF_PROG ?= fig2dev -L pdf
199 FIG2PNG_PROG ?= fig2dev -L png
201 $(SRC_TEX:.tex=.dvi) $(TARGET): $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png) $(SRC_FIG:.fig=.eps)
203 %.eps: %.fig $(OBJ_DIR)/.general.d
205 $(VERBOSE)$(FIG2EPS_PROG) $< $@
207 %.pdf: %.fig $(OBJ_DIR)/.general.d
209 $(VERBOSE)$(FIG2PDF_PROG) $< $@
211 %.png: %.fig $(OBJ_DIR)/.general.d
213 $(VERBOSE)$(FIG2PNG_PROG) $< $@
215 %.ps: %.dvi $(OBJ_DIR)/.general.d
217 $(VERBOSE)$(call MAKEDEP,dvips) dvips -o $@ $<
218 $(VERBOSE)$(VIEWERREFRESH_PS)
220 %.pdf: %.tex $(OBJ_DIR)/.general.d
222 $(VERBOSE)$(PDFLATEX) $< || \
223 (($(GREP) 'TeX capacity exceeded' $*.log && \
224 echo -e "\n\033[31mIncrease pool_size to 200000 in" \
225 "/etc/texmf/texmf.cnf!\033[m\n" && false) || false)
226 $(VERBOSE)$(GREP) '\citation' $*.aux && \
228 $(VERBOSE)(export size=1; touch $@; \
229 until [ $$size -eq `ls -o $@ | awk '{print $$4}'` ]; do\
230 export size=`ls -o $@ | awk '{print $$4}'` ;\
233 # one more time, just to be sure ...
234 $(VERBOSE)$(PDFLATEX) $<
236 %.dvi: %.tex $(OBJ_DIR)/.general.d
238 $(VERBOSE)$(call MAKEDEP,$(LATEX)) $(LATEX) $<
239 $(VERBOSE)if grep -q '\indexentry' $*.idx; then makeindex $*; fi
240 $(VERBOSE)if grep -q '\citation' $*.aux; then bibtex $*; fi
241 # Do we really need to call latex unconditionally again? Isn't it
242 # sufficient to check the logfile for the "rerun" text?
243 $(VERBOSE)$(LATEX) $<
244 $(VERBOSE)latex_count=5 ; \
245 while egrep -s 'Rerun (LaTeX|to get cross-references right)' $*.log &&\
246 [ $$latex_count -gt 0 ] ; do \
248 let latex_count=$$latex_count-1 ;\
250 $(VERBOSE)$(VIEWERREFRESH_DVI)
252 SHOWTEX ?= $(firstword $(SRC_TEX))
253 SHOWDVI ?= $(SHOWTEX:.tex=.dvi)
254 SHOWPS ?= $(SHOWTEX:.tex=.ps)
255 SHOWPDF ?= $(SHOWTEX:.tex=.pdf)
260 VIEWERREFRESH_DVI ?= killall -USR1 xdvi xdvi.bin xdvi.real || true
261 VIEWERREFRESH_PS ?= killall -HUP $(VIEWER_PS) || true
265 $(VERBOSE)$(VIEWER_DVI) $(SHOWDVI) &
269 $(VERBOSE)$(VIEWER_PS) $(SHOWPS) &
273 $(VERBOSE)$(VIEWER_PDF) $(SHOWPDF) &
276 $(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
277 $(addsuffix .title,$(TARGET_DOX)))
278 $(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
279 $(addsuffix .flags,$(TARGET_DOX)))
280 $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, $(foreach ext, \
281 aux bbl blg dvi idx ilg ind log lod ltf toc out, \
282 $(SRC_TEX:.tex=.$(ext))) texput.log ))
285 $(VERBOSE)$(RM) -r $(wildcard $(addprefix $(OBJ_DIR)/, \
286 $(TARGET)) $(wildcard .*.d))
287 $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
288 $(SRC_TEX:.tex=.ps) $(SRC_TEX:.tex=.pdf)))
289 $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
290 $(SRC_FIG:.fig=.eps) $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png)))
291 $(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
292 Makefile Makefile.build))
294 .PHONY: all clean cleanall config help install oldconfig txtconfig
295 .PHONY: ps pdf dvi showps showpdf showdvi show
298 @echo "Specify a target:"
299 @echo "all - generate documentation and install locally"
300 ifneq (,$(INSTALL_TARGET_DOX))
301 @echo "install - generate documentation and install globally"
303 @echo "dvi - compile the primary TeX file into dvi"
304 @echo "showdvi - invoke the dvi viewer on the primary TeX file"
305 @echo "ps - compile the primary TeX file into ps"
306 @echo "showps - invoke the ps viewer on the primary TeX file"
307 @echo "pdf - compile the primary TeX file into pdf"
308 @echo "showpdf - invoke the pdf viewer on the primary TeX file"
309 @echo "clean - delete generated intermediate files"
310 @echo "cleanall - delete all generated files"
311 @echo "help - this help"
314 @echo "Primary TeX file: $(SHOWTEX)"
315 @echo "Other documentation to be built: $(filter-out $(SHOWPDF) $(SHOWPS) $(SHOWDVI),$(TARGET))"
317 ifneq (,$(TARGET_DOX))
318 @echo "Primary Doxygen file: $(addsuffix .cfg, $(TARGET_DOX))"
320 @echo "Documentation to be built: $(TARGET)"
327 endif # _L4DIR_MK_DOC_MK undefined