Module: sip-router Branch: andrei/cdefs2doc Commit: 725c50b14e4a99da654a0dd2ee4804cda29217f9 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=725c50b1...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@iptel.org Date: Thu Feb 18 14:15:31 2010 +0100
doc: select_list: added makefiles for auto-gen.
Added a new directory (doc/select_list) complete with a makefile for auto-generating lists with all the select implemented in the code. make -C doc/select_list all will generate both .txt and .xml files. The .xml are in docbook format and are written to doc/select_list/docbook, complete with a file that includes them all (select_list.xml).
E.g.: to generate a .html file with all the selects: make -C doc/select_list all # generates the docbook make -C doc/select_list/docbook html
---
doc/select_list/Makefile | 229 ++++++++++++++++++++++++++++++++++++++ doc/select_list/docbook/Makefile | 5 + 2 files changed, 234 insertions(+), 0 deletions(-)
diff --git a/doc/select_list/Makefile b/doc/select_list/Makefile new file mode 100644 index 0000000..4962624 --- /dev/null +++ b/doc/select_list/Makefile @@ -0,0 +1,229 @@ + +COREPATH=../.. + +#include $(COREPATH)/Makefile.defs + +CFG2TXT=../scripts/cdefs2doc/dump_selects.pl +CFG2DOCBOOK=../scripts/cdefs2doc/dump_selects.pl + +# extra generators options +# use select_core.c to resolve possible chained select +CFG2TXT_EXTRA_OPTS=--core $(COREPATH)/select_core.c +CFG2DOCBOOK_EXTRA_OPTS=--core $(COREPATH)/select_core.c + +# output directory for generated txt files +txt_output_dir=. +# output directory for generated docbook xml files +docbook_output_dir=docbook + +# list of files contanining selects defs in the following format: +# <filename>:<sel_grp_name> +# can be easily filled/updated by pasting the output of: +# make print-lst |sed -e 's!^ ?../..(.*)!$(COREPATH)\1 \!' +files_list=$(COREPATH)/select_core.c:core \ + $(COREPATH)/modules_s/timer/timer.c:timer \ + $(COREPATH)/modules_s/nathelper/nathelper.c:nathelper \ + $(COREPATH)/modules_s/eval/eval.c:eval \ + $(COREPATH)/modules_s/rr/rr_mod.c:rr \ + $(COREPATH)/modules_s/textops/textops.c:textops \ + $(COREPATH)/modules_s/avp/avp.c:avp \ + $(COREPATH)/modules_s/db_ops/db_ops.c:db_ops \ + $(COREPATH)/modules/tm/select.c:tm \ + $(COREPATH)/modules/tls/tls_select.c:tls \ + $(COREPATH)/modules/xmlrpc/xmlrpc.c:xmlrpc \ + $(COREPATH)/modules/iptrtpproxy/iptrtpproxy.c:iptrtpproxy + +# list of excluded groups +grp_exclude=pa iptrtpproxy +# list of file prefixes to exclude (full path needed) +file_exclude= $(COREPATH)/modules_s/tls/ \ + $(COREPATH)/modules/iptrtpproxy/ + +# special per file group overrides +# format= grp_filename=... ,where filename does not contain the extension +# e.g.: +# grp_f_tcp_options=tcp +# grp_f_sctp_options=sctp + +# special per group group name overrides +# e.g.: +# grp_g_maxfwd=mf + +# override auto-detected group if set to 1 (else the group is used inside the +# file only if it cannot be aut-odetected) +ifeq ($(group_override),1) +override force_grp=force- +else +override force_grp= +endif + +# command used for gcc (contains extra includes) +gcc=gcc -I$(COREPATH)/lib -I/usr/include/libxml2 + +#filtered files list +flist=$(subst .h:,.c:, $(filter-out $(addsuffix %,$(file_exclude)),\ + $(filter-out $(addprefix %:,$(grp_exclude)),$(files_list)) ) ) + +# throws an error if input is not in the format filename:grp +check_fname_grp=$(if $(filter-out 2,$(words $(subst :, ,$(1)))),\ + $(error bad format "$(1)", it should be filename:grp)) + +# get prereq from file:grp (get_prereq(file:grp) => file) +get_prereq=$(firstword $(subst :, ,$(1))) + +# get grp from file:grp (get_grp(file:grp) => grp) +get_listed_grp=$(word 2, $(subst :, ,$(1))) + +# get base file name from file:grp: get_bname(file:grp) +# => basename(file) without extension (e.g. get_bname(foo/bar.c:x) => bar) +# +get_bname=$(basename $(notdir $(call get_prereq,$(1)))) + +#get grp from file:grp, using the overrides +get_grp=$(strip $(if $(grp_f_$(call get_bname,$(1))), \ + $(grp_f_$(call get_bname,$(1))),\ + $(if $(grp_g_$(call get_listed_grp,$(1))),\ + $(grp_g_$(call get_listed_grp,$(1))),\ + $(call get_listed_grp,$(1))) ) ) + +# get target from file:grp (get_target(file:grp) => select_grp) +get_target=select_$(call get_grp,$(1)) + +define mk_rules + +$(call check_fname_grp, $(1)) + +#$$(info generating select_$$(call get_grp,$(1)).txt: $$(call get_prereq,$(1))) + +$(txt_output_dir)/$$(call get_target,$(1)).txt: \ + $$(call get_prereq,$(1)) Makefile $(CFG2TXT) + $(CFG2TXT) --file $$< --$(force_grp)grp=$$(call get_grp,$(1)) \ + --gcc="$(gcc)" --txt $(CFG2TXT_EXTRA_OPTS) > "$$@" || \ + (rm -f "$$@"; exit 1) + +$(docbook_output_dir)/$$(call get_target,$(1)).xml: \ + $$(call get_prereq,$(1)) Makefile $(CFG2TXT) + $(CFG2DOCBOOK) --file $$< --$(force_grp)grp=$$(call get_grp,$(1)) \ + --gcc="$(gcc)" --docbook $(CFG2DOCBOOK_EXTRA_OPTS) > "$$@" || \ + (rm -f "$$@"; exit 1) + + +clean_$$(call get_target,$(1)).txt: + rm -f "$(txt_output_dir)/$$(call get_target,$(1)).txt" + +clean_$$(call get_target,$(1)).xml: + rm -f "$(docbook_output_dir)/$$(call get_target,$(1)).xml" + +txt: $(txt_output_dir)/$$(call get_target,$(1)).txt + +docbook: $(docbook_output_dir)/$$(call get_target,$(1)).xml + +clean_txt: clean_$$(call get_target,$(1)).txt + +clean_docbook: clean_$$(call get_target,$(1)).xml + + +endef + + +# help will be the default rule (on-purpose since without having a patched +# GCC:TranslationUnit module, make all won't work) +.PHONY: help +help: + @echo "To regenerate $(foreach f,$(flist),$(call get_target,$f).{txt,xml})" + @echo "type: $(MAKE) all ." + @echo "or to regenerate all the select lists by searching all" + @echo " the source files for definitions, type: $(MAKE) autogen ." + @echo "NOTE: you need the GCC:TranslationUnit perl module with an " + @echo "extra patch applied (see $(CFG2TXT) --patch)." + +.PHONY: txt +txt: + +.PHONY: docbook +docbook: + +.PHONY: clean_txt +clean_txt: + +.PHONY: clean_docbook +clean_docbook: + + +.PHONY: all +all: txt $(docbook_output_dir)/select_list.xml + +.PHONY: clean +clean: clean_txt clean_docbook + @rm -f $(docbook_output_dir)/select_list.xml + +.PHONY: proper +proper: + @rm -f $(txt_output_dir)/select_*.txt + @rm -f $(docbook_output_dir)/select_*.xml + +repo_ver="sip-router"\ + "git-$(shell git rev-parse --verify --short=6 HEAD 2>/dev/null)" +ifeq ($(repo_ver),git-) +repo_ver="sip-router unknown" +endif + +$(docbook_output_dir)/select_list.xml: \ + $(foreach f,$(flist),$(docbook_output_dir)/$(call get_target,$f).xml) + @echo '<?xml version="1.0" encoding="UTF-8"?>' >$@ + @echo '<!-- this file is autogenerated, do not edit! -->' >>$@ + @echo '<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"' >>$@ + @echo ' "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd%22%3E' >>$@ + @echo '<book id="select_list"'\ + 'xmlns:xi="http://www.w3.org/2001/XInclude%22%3E' >>$@ + @echo ' <title>Select List</title>' >>$@ + @echo ' <info><revhistory><revision>' >>$@ + @echo ' <revnumber>'$(repo_ver)'</revnumber>' >>$@ + @echo ' <revremark>' >>$@ + @echo " Automatically generated by:">>$@ + @echo " $(MAKE) -C doc/select_list $(MAKECMDGOALS)" >>$@ + @echo ' </revremark>' >>$@ + @echo ' </revision></revhistory></info>' >>$@ + @$(foreach f,$(flist),\ + echo ' <xi:include'\ + 'href="'$(call get_target,$f).xml'"/>' \ + >>$@ ; ) + @echo '</book>' >>$@ + +find_sel_files_cmd= find $(COREPATH) -type f -name "*.[ch]" \ + -exec grep "select_row_t[ ][a-zA-Z0-9_][a-zA-Z0-9_]*[][ ]*=" \ + /dev/null {} ; \ + | cut -d: -f1 + +# shell command to generate a file:grp list from a list of files +# grp will be the modulename if the file is in a module directory or +# the file name with the extension and _sel, sel_, select_, _select, +# _declaration or _table # stripped out of it. +# output: list of " "filename":"grpname +gen_file_grp_cmd=\ +sed -e "s!(.*/modules[^/]*/([^/][^/]*)/.*)! \1:\2!" \ + -e "s!^([^ ].*/([^/.]*)[^/]*$$)!\1:\2!" \ + -e "s!^([^ :]*):(.*)_select[_]*!\1:\2!" \ + -e "s!^([^ :]*):(.*)select[_]*!\1:\2!" \ + -e "s!^([^ :]*):(.*)_declaration[_]*!\1:\2!" \ + -e "s!^([^ :]*):(.*)_table[_]*!\1:\2!" \ + -e "s!^([^ :]*):(.*)_sel[_]*!:\1:\2!" \ + -e "s!^([^ :]*):(.*)sel[_]*!\1:\2!" + +# finds all the files containing select defs +.PHONY: find +find: + @$(find_sel_files_cmd) + +# print the list of the autogenerated files +.PHONY: print-lst +print-lst: + @$(find_sel_files_cmd) | $(gen_file_grp_cmd) + +# try to generate the docs from all the sources +.PHONY: autogen +autogen: + LST=`$(find_sel_files_cmd)| $(gen_file_grp_cmd) | xargs echo` && \ + [ -n "$$LST" ] && $(MAKE) all files_list="$$LST" + +$(foreach f,$(flist),$(eval $(call mk_rules,$(f)))) diff --git a/doc/select_list/docbook/Makefile b/doc/select_list/docbook/Makefile new file mode 100644 index 0000000..95cc961 --- /dev/null +++ b/doc/select_list/docbook/Makefile @@ -0,0 +1,5 @@ + +docs = select_list.xml +docbook_dir = ../../../docbook + +include $(docbook_dir)/Makefile