You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/doc/counter_list/Makefile

332 lines
11 KiB

COREPATH=../..
#include $(COREPATH)/Makefile.defs
CFG2TXT=../scripts/cdefs2doc/dump_counters.pl
CFG2DOCBOOK=../scripts/cdefs2doc/dump_counters.pl
# output directory for generated txt files
txt_output_dir=.
# output directory for generated docbook xml files
docbook_output_dir=docbook
# list of files containing counter defs in the following format:
# <filename>:<cfg_grp_name>
# can be easily updated by adding the output of:
# make diff-list (which obeys grp_exclude and file_exclude)
# or completely regenerated by replacing files_list with the output of:
# make gen-files-list
files_list= \
$(COREPATH)/resolve.c:resolve \
$(COREPATH)/tcp_stats.c:tcp \
$(COREPATH)/sctp_stats.c:sctp \
$(COREPATH)/modules/db_mysql/mysql_mod.c:db_mysql
# list of excluded groups
grp_exclude=
# list of file prefixes to exclude (full path needed)
file_exclude=$(COREPATH)/modules_s/tls/ \
$(COREPATH)/obsolete
# special per file group overrides
# format= grp_filename=... ,where filename does not contain the extension
# e.g.:
# grp_f_tcp_stats=tcp
# grp_f_sctp_stats=sctp
# special per group group name overrides
# e.g.:
# grp_g_maxfwd=mf
grp_g_resolve=dns
grp_g_db_mysql=mysql
# override auto-detected group if set to 1 (else the group is used inside the
# file only if it cannot be autodetected)
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$(COREPATH) -I/usr/include/libxml2
# defines used by gcc
c_defs=-D__CPU_i386 -D__OS_linux -DSER_VER=2099099 -DPKG_MALLOC -DSHM_MEM \
-DSHM_MMAP -DDNS_IP_HACK -DUSE_MCAST -DUSE_TCP \
-DUSE_DNS_CACHE -DUSE_DNS_FAILOVER -DUSE_DST_BLACKLIST -DUSE_NAPTR \
-DUSE_TLS -DTLS_HOOKS -DFAST_LOCK -DCC_GCC_LIKE_ASM \
-DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD \
-DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H \
-DHAVE_SCHED_SETSCHEDULER -DHAVE_EPOLL -DUSE_SCTP -DNAME='\"ser\"' \
-DVERSION='\"2.99.99-pre3\"' -DARCH='\"i386\"' -DOS_QUOTED='\"linux\"'
# common makefile vars used in defs
LOCALBASE=/usr/local
SYSBASE=/usr
filter_files=$(filter-out $(addsuffix %,$(file_exclude)),\
$(filter-out $(addprefix %:,$(grp_exclude)),$(1)))
#filtered files list
flist=$(call filter_files,$(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) => counter_grp.txt)
get_target=counters_$(call get_grp,$(1))
# $(LF) definition (do not remove)
define LF
endef
# get all the lines containing DEFS or INCLUDES definitions from the Makefile.
# WARNING: does not work with all sed implementation (tested with GNU sed).
# It uses a hack to restore the LFs (LFs are removed by $(shell)): LFs are
# replaced with '^LF^' and then ^LF^ is subst'ed back to a real LF.
get_make_idefs=$(subst ^LF^,$(LF),$(shell sed \
-ne '/^[\t ]*\(DEFS\|INCLUDES\)[\t ]*[+:]\?=.*[^\]$$/H'\
-ne '/^[\t ]*\(DEFS\|INCLUDES\)[\t ]*[+:]\?=.*\\$$/,/\(^$$\)\|\([^\]$$\)/H'\
-ne '$${g;s/\n/^LF^/g;p}'\
< $(1)/Makefile ))
# get all the lines from the makefile containing variable definitions.
# It will also return conditionals and try to filter out possible rules.
# WARNING: does not work with all sed implementation (tested with GNU sed).
# It uses a hack to restore the LFs (LFs are removed by $(shell)): LFs are
# replaced with '^LF^' and then ^LF^ is subst'ed back to a real LF.
get_make_vars=$(subst ^LF^,$(LF),$(shell sed -n \
-e ': start' \
-e '/^\(ifeq\|ifneq\|else\|endif\)[\t ]*\($$\|.*[^\]$$\)/{H;b end}' \
-e '/^\(ifeq\|ifneq\|else\|endif\)[\t ]\+.*[\]$$/,/[^\]$$/{H;b end}' \
-e '/^[a-zA-Z._/$$][a-zA-Z0-9._()/$$ \t-]*:\([^=]\|$$\)/b eat_rule' \
-e '/^[\t ]*[A-Za-z._][A-Za-z0-9._-]*[\t ]*[+:]\?=.*[^\]$$/{H;b end}' \
-e '/^[\t ]*[A-Za-z._][A-Za-z0-9._-]*[\t ]*[+:]\?=.*\\$$/,/\(^$$\)\|\([^\]$$\)/{H;b end}' \
-e ': end' \
-e '$${g;s/\n/^LF^/g;p}'\
-e 'b' \
-e ': eat_rule' \
-e '$$b end' \
-e 'n' \
-e '/^[a-zA-Z._/$$][a-zA-Z0-9._()/$$ \t-]*:\([^=]\|$$\)/b eat_rule' \
-e '/^[\t]/b eat_rule' \
-e 'b start' \
< $(1)/Makefile ))
define mk_rules
$(call check_fname_grp, $(1))
#$$(info generating counter_$$(call get_grp,$(1)).txt: $$(call get_prereq,$(1)))
DEFS:=
INCLUDES:=
# extract all the includes and defs from the module makefile and
# evaluate them
$$(eval $$(call get_make_vars,$$(dir $$(call get_prereq,$(1)))))
# override COREPATH (we know better)
COREPATH=../..
# save the result in a per group e_idefs_<grp_name> var
$$(eval e_idefs_$$(call get_grp,$(1)):=$$(DEFS) $$(INCLUDES))
# debugging:
#$$(info eval: $$(call get_make_vars,$$(dir $$(call get_prereq,$(1)))))
#$$(info e_idefs_$$(call get_grp,$(1))=$$(e_idefs_$$(call get_grp,$(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 \
--defs="$(c_defs) $$(e_idefs_$$(call get_grp,$(1)))" \
> "$$@" || (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 \
--defs="$(c_defs) $$(e_idefs_$$(call get_grp,$(1)))" \
> "$$@" || (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
find_counter_files_cmd= find $(COREPATH) -type f -name "*.c" \
-exec grep "counter_def_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 _cnt, cnt_, _stats, stats_,
# _cnts, or cnts_ 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!^\([^ :]*\):\(.*\)_cnts\?[_]*!\1:\2!" \
-e "s!^\([^ :]*\):\(.*\)cnts\?[_]*!\1:\2!" \
-e "s!^\([^ :]*\):\(.*\)_stats[_]*!\1:\2!" \
-e "s!^\([^ :]*\):\(.*\)stats[_]*!\1:\2!"
# special vars for generating the list of files or updates
found_lst=$(shell $(find_counter_files_cmd) | $(gen_file_grp_cmd))
# filtered found lst
f_found_lst=$(call filter_files,$(found_lst))
diff_lst=$(filter-out $(flist),$(f_found_lst))
get_core_files=$(filter-out $(COREPATH)/modules% $(COREPATH)/lib%,$(1))
sort_files=$(sort $(call get_core_files,$(1)))\
$(sort $(filter-out $(call get_core_files,$(1)),$(1)))
# replace $(COREPATH) with the text "$(COREPATH)"
subst_corepath=$(patsubst $(patsubst %/,%,$(COREPATH))/%,\$$(COREPATH)/%,$(1))
# 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 counter 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)/counter_list.xml
.PHONY: clean
clean: clean_txt clean_docbook
@rm -f $(docbook_output_dir)/counter_list.xml
.PHONY: proper
proper:
@rm -f $(txt_output_dir)/counters_*.txt
@rm -f $(docbook_output_dir)/counters_*.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)/counter_list.xml: Makefile \
$(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 book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"' >>$@
@echo ' "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"' >>$@
@echo ' [ <!ENTITY % local.common.attrib' >>$@
@echo " \"xmlns:xi CDATA #FIXED 'http://www.w3.org/2001/XInclude'\">]">>$@
@echo '>' >>$@
@echo '<book id="counter_list"'\
'xmlns:xi="http://www.w3.org/2001/XInclude">' >>$@
@echo ' <title>Counter List</title>' >>$@
@echo ' <bookinfo><revhistory><revision>' >>$@
@echo ' <revnumber>'$(repo_ver)'</revnumber>' >>$@
@echo ' <date>'`date -R`'</date>' >>$@
@echo ' <revremark>' >>$@
@echo " Automatically generated by:">>$@
@echo " $(MAKE) -C doc/counter_list $(MAKECMDGOALS)" >>$@
@echo ' </revremark>' >>$@
@echo ' </revision></revhistory></bookinfo>' >>$@
@$(foreach f,$(flist),\
echo ' <xi:include'\
'href="'$(call get_target,$f).xml'"/>' \
>>$@ ; )
@echo '</book>' >>$@
# finds all the files containing cfg defs
.PHONY: find
find:
@$(find_counter_files_cmd)
# print the list of the autogenerated files
.PHONY: print-lst
print-lst:
@$(find_counter_files_cmd) | $(gen_file_grp_cmd)
#
.PHONY: gen-file-list
.PHONY: gen-files_list
.PHONY: gen_files_list
gen-file-list gen-files-list gen_files_list:
@$(foreach f,$(call subst_corepath,$(call sort_files,$(f_found_lst))),\
echo "$f \\";)
.PHONY: check-list
.PHONY: update-list
.PHONY: diff-list
check-list update-list diff-list:
@$(foreach f,$(call subst_corepath,$(call sort_files,$(diff_lst))),\
echo "$f \\";)
# try to generate the docs from all the sources
.PHONY: autogen
autogen:
@$(MAKE) all files_list="$(call sort_files,$(f_found_lst))"
$(foreach f,$(flist),$(eval $(call mk_rules,$(f))))