ca86a8a92575d59cded9f2a751267d2e1492ce71
[sip-router] / doc / cfg_list / Makefile
1
2 COREPATH=../..
3
4 #include $(COREPATH)/Makefile.defs
5
6 CFG2TXT=../scripts/cdefs2doc/dump_cfg_defs.pl
7 CFG2DOCBOOK=../scripts/cdefs2doc/dump_cfg_defs.pl
8
9 # output directory for generated txt files
10 txt_output_dir=.
11 # output directory for generated docbook xml files
12 docbook_output_dir=docbook
13
14 # list of files containing cfg defs in the following format:
15 # <filename>:<cfg_grp_name> 
16 # can be easily updated by adding the output of:
17 #   make diff-list   (which obeys grp_exclude and file_exclude)
18 # or completely regenerated by replacing files_list with the output of:
19 #   make gen-files-list
20 files_list= \
21         $(COREPATH)/cfg_core.c:core \
22         $(COREPATH)/sctp_options.c:sctp \
23         $(COREPATH)/tcp_options.c:tcp \
24         $(COREPATH)/modules/tm/config.c:tm \
25         $(COREPATH)/modules_k/registrar/config.c:registrar \
26         $(COREPATH)/modules_k/siputils/config.c:siputils \
27         $(COREPATH)/modules_s/maxfwd/maxfwd.c:maxfwd \
28         $(COREPATH)/modules/carrierroute/config.c:carrierroute \
29         $(COREPATH)/modules/malloc_test/malloc_test.c:malloc_test \
30         $(COREPATH)/modules/tls/tls_cfg.c:tls \
31         $(COREPATH)/modules_k/dispatcher/config.c:dispatcher
32
33
34
35 # list of excluded groups
36 grp_exclude=pa
37 # list of file prefixes to exclude (full path needed)
38 file_exclude= $(COREPATH)/modules_s/tls/
39
40 # special per file group overrides
41 # format= grp_filename=... ,where filename does not contain the extension
42 # e.g.:
43 #     grp_f_tcp_options=tcp
44 #     grp_f_sctp_options=sctp
45
46 # special per group group name overrides
47 # e.g.:
48 #      grp_g_maxfwd=mf
49
50 # override auto-detected group if set to 1 (else the group is used inside the
51 # file only if it cannot be aut-odetected)
52 ifeq ($(group_override),1)
53 override force_grp=force-
54 else
55 override force_grp=
56 endif
57
58 # command used for gcc (contains extra includes)
59 gcc=gcc
60 #-I$(COREPATH)/lib -I$(COREPATH) -I/usr/include/libxml2
61
62 # defines used by gcc
63 c_defs=-D__CPU_i386 -D__OS_linux -DSER_VER=2099099 -DPKG_MALLOC -DSHM_MEM  \
64                 -DSHM_MMAP -DDNS_IP_HACK -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP \
65                 -DUSE_DNS_CACHE -DUSE_DNS_FAILOVER -DUSE_DST_BLACKLIST -DUSE_NAPTR \
66                 -DUSE_TLS -DTLS_HOOKS -DFAST_LOCK   -DCC_GCC_LIKE_ASM \
67                 -DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD \
68                 -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H \
69                 -DHAVE_SCHED_SETSCHEDULER -DHAVE_EPOLL -DUSE_SCTP -DNAME='\"ser\"' \
70                 -DVERSION='\"2.99.99-pre3\"' -DARCH='\"i386\"' -DOS_QUOTED='\"linux\"'
71
72
73 # common makefile vars used in defs
74 LOCALBASE=/usr/local
75 SYSBASE=/usr
76
77 filter_files=$(filter-out $(addsuffix %,$(file_exclude)),\
78                                 $(filter-out $(addprefix %:,$(grp_exclude)),$(1)))
79
80 #filtered files list
81 flist=$(call filter_files,$(files_list))
82
83 # throws an error if input is not in the format filename:grp
84 check_fname_grp=$(if $(filter-out 2,$(words $(subst :, ,$(1)))),\
85                                         $(error bad format "$(1)", it should be filename:grp))
86
87 # get prereq from file:grp (get_prereq(file:grp) => file)
88 get_prereq=$(firstword $(subst :, ,$(1)))
89
90 # get grp from file:grp (get_grp(file:grp) => grp)
91 get_listed_grp=$(word 2, $(subst :, ,$(1)))
92
93 # get base file name from file:grp: get_bname(file:grp) 
94 # => basename(file) without extension (e.g. get_bname(foo/bar.c:x) => bar)
95
96 get_bname=$(basename $(notdir $(call get_prereq,$(1))))
97
98 #get grp from file:grp, using the overrides
99 get_grp=$(strip $(if $(grp_f_$(call get_bname,$(1))), \
100                                         $(grp_f_$(call get_bname,$(1))),\
101                                         $(if $(grp_g_$(call get_listed_grp,$(1))),\
102                                                 $(grp_g_$(call get_listed_grp,$(1))),\
103                                                 $(call get_listed_grp,$(1))) ) )
104
105 # get target from file:grp (get_target(file:grp) => cfg_grp.txt)
106 get_target=cfg_$(call get_grp,$(1))
107
108
109 # $(LF) definition (do not remove)
110 define LF
111
112
113 endef
114
115 # get all the lines containing DEFS or INCLUDES definitions from the Makefile.
116 # WARNING: does not work with all sed implementation (tested with GNU sed).
117 # It uses a hack to restore the LFs (LFs are removed by $(shell)): LFs are
118 # replaced with '^LF^' and then ^LF^ is subst'ed back to a real LF.
119 get_make_idefs=$(subst ^LF^,$(LF),$(shell sed \
120  -ne '/^[\t ]*\(DEFS\|INCLUDES\)[\t ]*[+:]\?=.*[^\]$$/H'\
121  -ne '/^[\t ]*\(DEFS\|INCLUDES\)[\t ]*[+:]\?=.*\\$$/,/\(^$$\)\|\([^\]$$\)/H'\
122  -ne '$${g;s/\n/^LF^/g;p}'\
123 < $(1)/Makefile ))
124
125
126 # get all the lines from the makefile containing variable definitions.
127 # It will also return conditionals and try to filter out possible rules.
128 # WARNING: does not work with all sed implementation (tested with GNU sed).
129 # It uses a hack to restore the LFs (LFs are removed by $(shell)): LFs are
130 # replaced with '^LF^' and then ^LF^ is subst'ed back to a real LF.
131 get_make_vars=$(subst ^LF^,$(LF),$(shell sed -n \
132  -e ': start' \
133  -e '/^\(ifeq\|ifneq\|else\|endif\)[\t ]*\($$\|.*[^\]$$\)/{H;b end}' \
134  -e '/^\(ifeq\|ifneq\|else\|endif\)[\t ]\+.*[\]$$/,/[^\]$$/{H;b end}' \
135  -e '/^[a-zA-Z._/$$][a-zA-Z0-9._()/$$ \t-]*:\([^=]\|$$\)/b eat_rule' \
136  -e '/^[\t ]*[A-Za-z._][A-Za-z0-9._-]*[\t ]*[+:]\?=.*[^\]$$/{H;b end}' \
137  -e '/^[\t ]*[A-Za-z._][A-Za-z0-9._-]*[\t ]*[+:]\?=.*\\$$/,/\(^$$\)\|\([^\]$$\)/{H;b end}' \
138  -e ': end' \
139  -e '$${g;s/\n/^LF^/g;p}'\
140  -e 'b' \
141  -e ': eat_rule' \
142  -e '$$b end' \
143  -e 'n' \
144  -e '/^[a-zA-Z._/$$][a-zA-Z0-9._()/$$ \t-]*:\([^=]\|$$\)/b eat_rule' \
145  -e '/^[\t]/b eat_rule' \
146  -e 'b start' \
147 < $(1)/Makefile ))
148
149
150 define  mk_rules
151
152 $(call check_fname_grp, $(1))
153
154 #$$(info generating cfg_$$(call get_grp,$(1)).txt: $$(call get_prereq,$(1)))
155
156
157 DEFS:=
158 INCLUDES:=
159 # extract all the includes and defs from the module makefile and
160 # evaluate them
161 $$(eval $$(call get_make_vars,$$(dir $$(call get_prereq,$(1)))))
162 # override COREPATH (we know better)
163 COREPATH=../..
164 # save the result in a per group e_idefs_<grp_name> var
165 $$(eval e_idefs_$$(call get_grp,$(1)):=$$(DEFS) $$(INCLUDES))
166
167 # debugging:
168 #$$(info eval: $$(call get_make_vars,$$(dir $$(call get_prereq,$(1)))))
169 #$$(info e_idefs_$$(call get_grp,$(1))=$$(e_idefs_$$(call get_grp,$(1))))
170
171 $(txt_output_dir)/$$(call get_target,$(1)).txt: \
172                                                                 $$(call get_prereq,$(1)) Makefile $(CFG2TXT)
173         $(CFG2TXT) --file $$< --$(force_grp)grp=$$(call get_grp,$(1)) \
174                 --gcc="$(gcc)" --txt \
175                 --defs="$(c_defs) $$(e_idefs_$$(call get_grp,$(1)))" \
176                 > "$$@" || (rm -f "$$@"; exit 1)
177
178 $(docbook_output_dir)/$$(call get_target,$(1)).xml: \
179                                                                 $$(call get_prereq,$(1)) Makefile $(CFG2TXT)
180         $(CFG2DOCBOOK) --file $$< --$(force_grp)grp=$$(call get_grp,$(1)) \
181                 --gcc="$(gcc)" --docbook \
182                 --defs="$(c_defs) $$(e_idefs_$$(call get_grp,$(1)))" \
183                 > "$$@" || (rm -f "$$@"; exit 1)
184
185
186 clean_$$(call get_target,$(1)).txt:
187         rm -f "$(txt_output_dir)/$$(call get_target,$(1)).txt"
188
189 clean_$$(call get_target,$(1)).xml:
190         rm -f "$(docbook_output_dir)/$$(call get_target,$(1)).xml"
191
192 txt: $(txt_output_dir)/$$(call get_target,$(1)).txt
193
194 docbook: $(docbook_output_dir)/$$(call get_target,$(1)).xml
195
196 clean_txt: clean_$$(call get_target,$(1)).txt
197
198 clean_docbook: clean_$$(call get_target,$(1)).xml
199
200
201 endef
202
203 find_cfg_files_cmd= find $(COREPATH) -type f -name "*.c" \
204                 -exec grep "cfg_def_t[   ][a-zA-Z0-9_]*\[\][     ]*=" /dev/null {} \; \
205                 | cut -d: -f1
206
207 # shell command to generate a file:grp list from a list of files
208 # grp will be the modulename if the file is in a module directory or
209 # the file name with the extension and _cfg, cfg_ or _options stripped out of
210 # it.
211 # output: list of  " "filename":"grpname
212 gen_file_grp_cmd=\
213 sed -e "s!\(.*/modules[^/]*/\([^/][^/]*\)/.*\)! \1:\2!" \
214     -e "s!^\([^ ].*/\([^/.]*\)[^/]*$$\)!\1:\2!" \
215     -e "s!^\([^ :]*\):\(.*\)_cfg[_]*!\1:\2!" \
216     -e "s!^\([^ :]*\):\(.*\)cfg[_]*!\1:\2!" \
217     -e "s!^\([^ :]*\):\(.*\)_options[_]*!\1:\2!"
218
219 # special vars for generating the list of files or updates
220 found_lst=$(shell $(find_cfg_files_cmd) | $(gen_file_grp_cmd))
221 # filtered found lst
222 f_found_lst=$(call filter_files,$(found_lst))
223 diff_lst=$(filter-out $(flist),$(f_found_lst))
224
225
226 get_core_files=$(filter-out $(COREPATH)/modules% $(COREPATH)/lib%,$(1))
227 sort_files=$(sort $(call get_core_files,$(1)))\
228                         $(sort $(filter-out $(call get_core_files,$(1)),$(1)))
229
230 # replace $(COREPATH) with the text "$(COREPATH)"
231 subst_corepath=$(patsubst $(patsubst %/,%,$(COREPATH))/%,\$$(COREPATH)/%,$(1))
232
233
234 # help will be the default rule (on-purpose since without having a patched
235 # GCC:TranslationUnit module, make all won't work)
236 .PHONY: help
237 help:
238         @echo "To regenerate $(foreach f,$(flist),$(call get_target,$f).{txt,xml})"
239         @echo "type: $(MAKE) all ."
240         @echo "or to regenerate all the cfg documentation by searching all"
241         @echo " the source files for definitions, type: $(MAKE) autogen ."
242         @echo "NOTE: you need the GCC:TranslationUnit perl module with an "
243         @echo "extra patch applied (see $(CFG2TXT) --patch)."
244
245 .PHONY: txt
246 txt:
247
248 .PHONY: docbook
249 docbook:
250
251 .PHONY: clean_txt
252 clean_txt:
253
254 .PHONY: clean_docbook
255 clean_docbook:
256
257
258 .PHONY: all
259 all: txt $(docbook_output_dir)/cfg_var_list.xml
260
261 .PHONY: clean
262 clean: clean_txt clean_docbook
263         @rm -f $(docbook_output_dir)/cfg_var_list.xml
264
265 .PHONY: proper
266 proper:
267         @rm -f $(txt_output_dir)/cfg_*.txt
268         @rm -f $(docbook_output_dir)/cfg_*.xml
269
270 repo_ver="sip-router"\
271         "git-$(shell  git rev-parse --verify --short=6 HEAD 2>/dev/null)"
272 ifeq ($(repo_ver),git-)
273 repo_ver="sip-router unknown"
274 endif
275
276 $(docbook_output_dir)/cfg_var_list.xml: Makefile \
277                 $(foreach f,$(flist),$(docbook_output_dir)/$(call get_target,$f).xml)
278         @echo '<?xml version="1.0" encoding="UTF-8"?>' >$@
279         @echo '<!-- this file is autogenerated, do not edit! -->' >>$@
280         @echo '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"' >>$@
281         @echo ' "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"' >>$@
282         @echo ' [ <!ENTITY % local.common.attrib' >>$@
283         @echo "  \"xmlns:xi CDATA #FIXED 'http://www.w3.org/2001/XInclude'\">]">>$@
284         @echo '>' >>$@
285         @echo '<book id="cfg_var_list"'\
286                 'xmlns:xi="http://www.w3.org/2001/XInclude">' >>$@
287         @echo ' <title>Runtime Configuration Variables List</title>' >>$@
288         @echo ' <bookinfo><revhistory><revision>' >>$@
289         @echo '         <revnumber>'$(repo_ver)'</revnumber>' >>$@
290         @echo '         <date>'`date -R`'</date>' >>$@
291         @echo '         <revremark>' >>$@
292         @echo "                 Automatically generated by:">>$@
293         @echo "                 $(MAKE) -C doc/cfg_list $(MAKECMDGOALS)" >>$@
294         @echo '         </revremark>' >>$@
295         @echo ' </revision></revhistory></bookinfo>' >>$@
296         @$(foreach f,$(flist),\
297                 echo '          <xi:include'\
298                         'href="'$(call get_target,$f).xml'"/>' \
299                         >>$@ ; )
300         @echo '</book>' >>$@
301
302 # finds all the files containing cfg defs
303 .PHONY: find
304 find:
305         @$(find_cfg_files_cmd)
306
307 # print the list of the autogenerated files
308 .PHONY: print-lst
309 print-lst:
310         @$(find_cfg_files_cmd) | $(gen_file_grp_cmd)
311
312 #
313 .PHONY: gen-file-list
314 .PHONY: gen-files_list
315 .PHONY: gen_files_list
316 gen-file-list gen-files-list gen_files_list:
317         @$(foreach f,$(call subst_corepath,$(call sort_files,$(f_found_lst))),\
318                 echo "$f \\";)
319
320 .PHONY: check-list
321 .PHONY: update-list
322 .PHONY: diff-list
323 check-list update-list diff-list:
324         @$(foreach f,$(call subst_corepath,$(call sort_files,$(diff_lst))),\
325                 echo "$f \\";)
326
327
328 # try to generate the docs from all the sources
329 .PHONY: autogen
330 autogen:
331         @$(MAKE) all files_list="$(call sort_files,$(f_found_lst))"
332
333 $(foreach f,$(flist),$(eval $(call mk_rules,$(f))))