From 7811f7f3d743aebafbe5daf2f5088d139b774459 Mon Sep 17 00:00:00 2001 From: eb Date: Wed, 16 Jan 2008 03:10:08 +0000 Subject: [PATCH] Merged eb/firas-doc -r7443:7444 into trunk. These changes allow doxygen to generate a unified output that includes both C++ and Python docs. There's still work to do to get this cleaned up, but it's a great start! git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@7445 221aa14e-8319-0410-a670-987f0aec2ac5 --- gnuradio-core/doc/Doxyfile.in | 326 ++++++++++++++++------ gnuradio-core/doc/other/Makefile.am | 15 +- gnuradio-core/doc/other/doxypy.py | 356 +++++++++++++++++++++++++ gnuradio-core/doc/other/group_defs.dox | 51 +++- 4 files changed, 651 insertions(+), 97 deletions(-) create mode 100755 gnuradio-core/doc/other/doxypy.py diff --git a/gnuradio-core/doc/Doxyfile.in b/gnuradio-core/doc/Doxyfile.in index 83229cd0..c6d998f2 100644 --- a/gnuradio-core/doc/Doxyfile.in +++ b/gnuradio-core/doc/Doxyfile.in @@ -1,4 +1,4 @@ -# Doxyfile 1.4.1 +# Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project @@ -14,6 +14,14 @@ # Project related configuration options #--------------------------------------------------------------------------- +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. @@ -45,24 +53,14 @@ CREATE_SUBDIRS = NO # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, -# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, -# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). @@ -135,11 +133,19 @@ SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. @@ -161,12 +167,11 @@ DETAILS_AT_TOP = YES INHERIT_DOCS = YES -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. -DISTRIBUTE_GROUP_DOC = NO +SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. @@ -189,13 +194,34 @@ ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to @@ -238,6 +264,13 @@ EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO +# If this flag is set to YES, the members of anonymous namespaces will be extracted +# and appear in the documentation as a namespace called 'anonymous_namespace{file}', +# where file will be replaced with the base name of the file that contains the anonymous +# namespace. By default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the @@ -370,17 +403,16 @@ SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. +# in the documentation. The default is NO. -# -eb -SHOW_DIRECTORIES = NO +SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output +# provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = @@ -428,7 +460,7 @@ WARN_NO_PARAMDOC = NO # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) -WARN_FORMAT = "$file:$line: $text" +WARN_FORMAT = "$file:$line: $text " # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written @@ -447,16 +479,23 @@ WARN_LOGFILE = INPUT = @top_srcdir@ +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.h \ - *.cc \ - *.dox + *.dox \ + *.py # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. @@ -468,28 +507,88 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = CVS .svn .libs .deps \ - @top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_filter.cc \ - @top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_general.cc \ - @top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_gengen.cc \ - @top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_io.cc \ - @top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_runtime.cc \ - @top_builddir@/gr-atsc/src/lib/atsc.cc \ - @top_builddir@/gr-audio-alsa/src/audio_alsa.cc \ - @top_builddir@/gr-audio-jack/src/audio_jack.cc \ - @top_builddir@/gr-audio-oss/src/audio_oss.cc \ - @top_builddir@/gr-audio-osx/src/audio_osx.cc \ - @top_builddir@/gr-audio-portaudio/src/audio_portaudio.cc \ - @top_builddir@/gr-audio-windows/src/audio_windows.cc \ - @top_builddir@/gr-comedi/src/comedi.cc \ - @top_builddir@/gr-gsm-fr-vocoder/src/lib/gsm_full_rate.cc \ - @top_builddir@/gr-howto-write-a-block/src/lib/howto.cc \ - @top_builddir@/gr-pager/src/pager_swig.cc \ - @top_builddir@/gr-radio-astronomy/src/lib/ra.cc \ - @top_builddir@/gr-trellis/src/lib/trellis.cc \ - @top_builddir@/gr-usrp/src/usrp1.cc \ - @top_builddir@/gr-video-sdl/src/video_sdl.cc - @top_srcdir@/usrp +# We split these by top_srcdir and top_builddir (this matters in a VPATH build) + +EXCLUDE = \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_filter.cc \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_filter.py \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_general.cc \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_general.py \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_gengen.cc \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_gengen.py \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_io.cc \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_io.py \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_runtime.cc \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_py_runtime.py \ + @abs_top_builddir@/gnuradio-core/src/lib/swig/gnuradio_swig_python.py \ + @abs_top_builddir@/gr-atsc/src/lib/atsc.cc \ + @abs_top_builddir@/gr-atsc/src/lib/atsc.py \ + @abs_top_builddir@/gr-audio-oss/src/audio_oss.py \ + @abs_top_builddir@/gr-audio-osx/src/test_audio_loop.py \ + @abs_top_builddir@/gr-cvsd-vocoder/src/lib/cvsd_vocoder.py \ + @abs_top_builddir@/gr-cvsd-vocoder/src/python/encdec.py \ + @abs_top_builddir@/gr-gsm-fr-vocoder/src/lib/gsm \ + @abs_top_builddir@/gr-gsm-fr-vocoder/src/lib/gsm_full_rate.py \ + @abs_top_builddir@/gr-gsm-fr-vocoder/src/python/encdec.py \ + @abs_top_builddir@/gr-pager/src/pager_swig.py \ + @abs_top_builddir@/gr-radar-mono/src/python/usrp_radar_mono.py \ + @abs_top_builddir@/gr-trellis/src/lib/trellis.py \ + @abs_top_builddir@/gr-usrp/src/usrp1.py \ + @abs_top_builddir@/gr-video-sdl/src/video_sdl.py \ + @abs_top_builddir@/usrp/host/swig \ + @abs_top_srcdir@/docs \ + @abs_top_srcdir@/dtools \ + @abs_top_srcdir@/gnuradio-core/doc/doxypy/doxypy.py \ + @abs_top_srcdir@/gnuradio-core/doc/xml \ + @abs_top_srcdir@/gnuradio-core/src/lib/bug_work_around_6.cc \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/assembly.h \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_all.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_fir_XXX.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_fir_filter_XXX.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_fir_sysconfig.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_fir_sysconfig_generic.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_fir_util.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_freq_xlating_fir_filter_XXX.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_interp_fir_filter_XXX.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_gr_rational_resampler_base_XXX.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/generate_utils.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/filter/sse_debug.h \ + @abs_top_srcdir@/gnuradio-core/src/lib/gengen/generate_all.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/gengen/generate_common.py \ + @abs_top_srcdir@/gnuradio-core/src/lib/missing/bug_work_around_8.cc \ + @abs_top_srcdir@/gnuradio-core/src/lib/runtime/gr_error_handler.cc \ + @abs_top_srcdir@/gnuradio-core/src/python/bin \ + @abs_top_srcdir@/gnuradio-core/src/python/build_utils.py \ + @abs_top_srcdir@/gnuradio-core/src/python/build_utils_codes.py \ + @abs_top_srcdir@/gnuradio-core/src/python/gnuradio/gr/gr_threading.py \ + @abs_top_srcdir@/gnuradio-core/src/python/gnuradio/gr/gr_threading_23.py \ + @abs_top_srcdir@/gnuradio-core/src/python/gnuradio/gr/gr_threading_24.py \ + @abs_top_srcdir@/gnuradio-core/src/tests \ + @abs_top_srcdir@/gnuradio-core/src/utils \ + @abs_top_srcdir@/gr-atsc/src/lib/gen_encoder.py \ + @abs_top_srcdir@/gr-atsc/src/python \ + @abs_top_srcdir@/gr-howto-write-a-block \ + @abs_top_srcdir@/gr-qtgui \ + @abs_top_srcdir@/gr-sounder/src/python/usrp_sounder.py \ + @abs_top_srcdir@/gr-trellis/doc \ + @abs_top_srcdir@/gr-trellis/src/lib/generate_all.py \ + @abs_top_srcdir@/gr-trellis/src/lib/generate_trellis.py \ + @abs_top_srcdir@/usrp/doc \ + @abs_top_srcdir@/usrp/firmware \ + @abs_top_srcdir@/usrp/fpga \ + @abs_top_srcdir@/usrp/host/apps \ + @abs_top_srcdir@/usrp/host/apps-inband \ + @abs_top_srcdir@/usrp/host/lib/inband \ + @abs_top_srcdir@/usrp/host/lib/legacy/ad9862.h \ + @abs_top_srcdir@/usrp/host/lib/legacy/check_data.py \ + @abs_top_srcdir@/usrp/host/lib/legacy/circular_buffer.h \ + @abs_top_srcdir@/usrp/host/lib/legacy/circular_linked_list.h \ + @abs_top_srcdir@/usrp/host/lib/legacy/dump_data.py \ + @abs_top_srcdir@/usrp/host/lib/legacy/gen_usrp_dbid.py \ + @abs_top_srcdir@/usrp/host/lib/legacy/usrp_dbid.py \ + @abs_top_srcdir@/usrp/host/misc \ + @abs_top_srcdir@/usrp/host/swig + # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -499,9 +598,33 @@ EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = moc_*.cc +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = \ + */.deps/* \ + */.libs/* \ + */.svn/* \ + */CVS/* \ + */__init__.py \ + */gr-atsc/src/lib/Gr* \ + */moc_*.cc \ + */omnithread/ot_* \ + */qa_*.cc \ + */qa_*.h \ + */qa_*.py + + + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = ad9862 \ + numpy \ + usrpm # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see @@ -546,13 +669,14 @@ INPUT_FILTER = # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. -FILTER_PATTERNS = +FILTER_PATTERNS = *.py=@top_srcdir@/gnuradio-core/doc/other/doxypy.py + -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). -FILTER_SOURCE_FILES = NO +FILTER_SOURCE_FILES = YES #--------------------------------------------------------------------------- # configuration options related to source browsing @@ -561,7 +685,9 @@ FILTER_SOURCE_FILES = NO # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. +# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH +# then you must also enable this option. If you don't then doxygen will produce +# a warning and turn it on anyway SOURCE_BROWSER = NO @@ -588,6 +714,21 @@ REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. @@ -672,6 +813,14 @@ HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be @@ -736,7 +885,6 @@ TREEVIEW_WIDTH = 250 # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. -# -eb GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. @@ -884,7 +1032,7 @@ MAN_LINKS = NO # generate an XML file that captures the structure of # the code including all documentation. -GENERATE_XML = YES +GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be @@ -909,7 +1057,6 @@ XML_DTD = # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. -# -eb XML_PROGRAMLISTING = NO #--------------------------------------------------------------------------- @@ -976,7 +1123,7 @@ MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. +# PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO @@ -1079,6 +1226,14 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = YES +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. @@ -1136,7 +1291,7 @@ INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected @@ -1144,6 +1299,14 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. @@ -1173,31 +1336,23 @@ DOT_PATH = DOTFILE_DIRS = -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the number +# of direct children of the root node in a graph is already larger than +# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -MAX_DOT_GRAPH_HEIGHT = 1024 +DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 @@ -1214,7 +1369,6 @@ DOT_TRANSPARENT = NO # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. -# -eb DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will diff --git a/gnuradio-core/doc/other/Makefile.am b/gnuradio-core/doc/other/Makefile.am index b6641af1..5e05d5d3 100644 --- a/gnuradio-core/doc/other/Makefile.am +++ b/gnuradio-core/doc/other/Makefile.am @@ -22,10 +22,11 @@ include $(top_srcdir)/Makefile.common EXTRA_DIST = \ - tv-channel-frequencies \ - vector_docstub.h \ - shared_ptr_docstub.h \ - omnithread.html \ - omnithread.pdf \ - omnithread.ps \ - group_defs.dox + doxypy.py \ + group_defs.dox \ + omnithread.html \ + omnithread.pdf \ + omnithread.ps \ + shared_ptr_docstub.h \ + tv-channel-frequencies \ + vector_docstub.h diff --git a/gnuradio-core/doc/other/doxypy.py b/gnuradio-core/doc/other/doxypy.py new file mode 100755 index 00000000..34353b6a --- /dev/null +++ b/gnuradio-core/doc/other/doxypy.py @@ -0,0 +1,356 @@ +#!/usr/bin/env python + +__applicationName__ = "doxypy" +__blurb__ = """ +doxypy is an input filter for Doxygen. It preprocesses python +files so that docstrings of classes and functions are reformatted +into Doxygen-conform documentation blocks. +""" + +__doc__ = __blurb__ + \ +""" +In order to make Doxygen preprocess files through doxypy, simply +add the following lines to your Doxyfile: + FILTER_SOURCE_FILES = YES + INPUT_FILTER = "python /path/to/doxypy.py" +""" + +__version__ = "0.3rc2" +__date__ = "18th December 2007" +__website__ = "http://code.foosel.org/doxypy" + +__author__ = ( + "Philippe 'demod' Neumann (doxypy at demod dot org)", + "Gina 'foosel' Haeussge (gina at foosel dot net)" +) + +__licenseName__ = "GPL v2" +__license__ = """This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +import sys +import re + +from optparse import OptionParser, OptionGroup + +class FSM(object): + """ FSM implements a finite state machine. Transitions are given as + 4-tuples, consisting of an origin state, a target state, a condition + for the transition (given as a reference to a function which gets called + with a given piece of input) and a pointer to a function to be called + upon the execution of the given transition. + """ + + def __init__(self, start_state=None, transitions=[]): + self.transitions = transitions + self.current_state = start_state + self.current_input = None + self.current_transition = None + + def setStartState(self, state): + self.current_state = state + + def addTransition(self, from_state, to_state, condition, callback): + self.transitions.append([from_state, to_state, condition, callback]) + + def makeTransition(self, input): + """ Makes a transition based on the given input. + @param input input to parse by the FSM + """ + for transition in self.transitions: + [from_state, to_state, condition, callback] = transition + if from_state == self.current_state: + match = condition(input) + if match: + self.current_state = to_state + self.current_input = input + self.current_transition = transition + callback(match) + return + + +class Doxypy(object): + def __init__(self): + self.start_single_comment_re = re.compile("^\s*(''')") + self.end_single_comment_re = re.compile("(''')\s*$") + + self.start_double_comment_re = re.compile("^\s*(\"\"\")") + self.end_double_comment_re = re.compile("(\"\"\")\s*$") + + self.single_comment_re = re.compile("^\s*(''').*(''')\s*$") + self.double_comment_re = re.compile("^\s*(\"\"\").*(\"\"\")\s*$") + + self.defclass_re = re.compile("^(\s*)(def .+:|class .+:)") + self.empty_re = re.compile("^\s*$") + self.hashline_re = re.compile("^\s*#.*$") + self.importline_re = re.compile("^\s*(import |from .+ import)") + + self.multiline_defclass_start_re = re.compile("^(\s*)(def|class)(\s.*)?$") + self.multiline_defclass_end_re = re.compile(":\s*$") + + ## Transition list format + # ["FROM", "TO", condition, action] + transitions = [ + ### FILEHEAD + + # single line comments + ["FILEHEAD", "FILEHEAD", self.single_comment_re.search, self.appendCommentLine], + ["FILEHEAD", "FILEHEAD", self.double_comment_re.search, self.appendCommentLine], + + # multiline comments + ["FILEHEAD", "FILEHEAD_COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD", self.end_single_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD_COMMENT_SINGLE", self.catchall, self.appendCommentLine], + ["FILEHEAD", "FILEHEAD_COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD", self.end_double_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD_COMMENT_DOUBLE", self.catchall, self.appendCommentLine], + + # other lines + ["FILEHEAD", "FILEHEAD", self.empty_re.search, self.appendFileheadLine], + ["FILEHEAD", "FILEHEAD", self.hashline_re.search, self.appendFileheadLine], + ["FILEHEAD", "FILEHEAD", self.importline_re.search, self.appendFileheadLine], + ["FILEHEAD", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], + ["FILEHEAD", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch], + ["FILEHEAD", "DEFCLASS_BODY", self.catchall, self.appendFileheadLine], + + ### DEFCLASS + + # single line comments + ["DEFCLASS", "DEFCLASS_BODY", self.single_comment_re.search, self.appendCommentLine], + ["DEFCLASS", "DEFCLASS_BODY", self.double_comment_re.search, self.appendCommentLine], + + # multiline comments + ["DEFCLASS", "COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], + ["COMMENT_SINGLE", "DEFCLASS_BODY", self.end_single_comment_re.search, self.appendCommentLine], + ["COMMENT_SINGLE", "COMMENT_SINGLE", self.catchall, self.appendCommentLine], + ["DEFCLASS", "COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], + ["COMMENT_DOUBLE", "DEFCLASS_BODY", self.end_double_comment_re.search, self.appendCommentLine], + ["COMMENT_DOUBLE", "COMMENT_DOUBLE", self.catchall, self.appendCommentLine], + + # other lines + ["DEFCLASS", "DEFCLASS", self.empty_re.search, self.appendDefclassLine], + ["DEFCLASS", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], + ["DEFCLASS", "DEFCLASS_BODY", self.catchall, self.stopCommentSearch], + + ### DEFCLASS_BODY + + ["DEFCLASS_BODY", "DEFCLASS", self.defclass_re.search, self.startCommentSearch], + ["DEFCLASS_BODY", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.startCommentSearch], + ["DEFCLASS_BODY", "DEFCLASS_BODY", self.catchall, self.appendNormalLine], + + ### DEFCLASS_MULTI + ["DEFCLASS_MULTI", "DEFCLASS", self.multiline_defclass_end_re.search, self.appendDefclassLine], + ["DEFCLASS_MULTI", "DEFCLASS_MULTI", self.catchall, self.appendDefclassLine], + ] + + self.fsm = FSM("FILEHEAD", transitions) + + self.output = [] + + self.comment = [] + self.filehead = [] + self.defclass = [] + self.indent = "" + + def __closeComment(self): + """ Appends any open comment block and triggering block to the output. """ + + if options.autobrief: + if len(self.comment) == 1 \ + or (len(self.comment) > 2 and self.comment[1].strip() == ''): + self.comment[0] = self.__docstringSummaryToBrief(self.comment[0]) + + if self.comment: + block = self.makeCommentBlock() + self.output.extend(block) + + if self.defclass: + self.output.extend(self.defclass) + + def __docstringSummaryToBrief(self, line): + """ Adds \\brief to the docstrings summary line. + + A \\brief is prepended, provided no other doxygen command is at the start of the line. + """ + stripped = line.strip() + if stripped and not stripped[0] in ('@', '\\'): + return "\\brief " + line + else: + return line + + def catchall(self, input): + """ The catchall-condition, always returns true. """ + return True + + def resetCommentSearch(self, match): + """ Restarts a new comment search for a different triggering line. + Closes the current commentblock and starts a new comment search. + """ + self.__closeComment() + self.startCommentSearch(match) + + def startCommentSearch(self, match): + """ Starts a new comment search. + Saves the triggering line, resets the current comment and saves + the current indentation. + """ + self.defclass = [self.fsm.current_input] + self.comment = [] + self.indent = match.group(1) + + def stopCommentSearch(self, match): + """ Stops a comment search. + Closes the current commentblock, resets the triggering line and + appends the current line to the output. + """ + self.__closeComment() + + self.defclass = [] + self.output.append(self.fsm.current_input) + + def appendFileheadLine(self, match): + """ Appends a line in the FILEHEAD state. + Closes the open comment block, resets it and appends the current line. + """ + self.__closeComment() + self.comment = [] + self.output.append(self.fsm.current_input) + + def appendCommentLine(self, match): + """ Appends a comment line. + The comment delimiter is removed from multiline start and ends as + well as singleline comments. + """ + (from_state, to_state, condition, callback) = self.fsm.current_transition + + # single line comment + if (from_state == "DEFCLASS" and to_state == "DEFCLASS_BODY") \ + or (from_state == "FILEHEAD" and to_state == "FILEHEAD"): + # remove comment delimiter from begin and end of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):line.rfind(activeCommentDelim)]) + + if (to_state == "DEFCLASS_BODY"): + self.__closeComment() + self.defclass = [] + # multiline start + elif from_state == "DEFCLASS" or from_state == "FILEHEAD": + # remove comment delimiter from begin of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):]) + # multiline end + elif to_state == "DEFCLASS_BODY" or to_state == "FILEHEAD": + # remove comment delimiter from end of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[0:line.rfind(activeCommentDelim)]) + if (to_state == "DEFCLASS_BODY"): + self.__closeComment() + self.defclass = [] + # in multiline comment + else: + # just append the comment line + self.comment.append(self.fsm.current_input) + + def appendNormalLine(self, match): + """ Appends a line to the output. """ + self.output.append(self.fsm.current_input) + + def appendDefclassLine(self, match): + """ Appends a line to the triggering block. """ + self.defclass.append(self.fsm.current_input) + + def makeCommentBlock(self): + """ Indents the current comment block with respect to the current + indentation level. + @returns a list of indented comment lines + """ + doxyStart = "##" + commentLines = self.comment + + commentLines = map(lambda x: "%s# %s" % (self.indent, x), commentLines) + l = [self.indent + doxyStart] + l.extend(commentLines) + + return l + + def parse(self, input): + """ Parses a python file given as input string and returns the doxygen- + compatible representation. + @param input the python code to parse + @returns the modified python code + """ + lines = input.split("\n") + + for line in lines: + self.fsm.makeTransition(line) + + if self.fsm.current_state == "DEFCLASS": + self.__closeComment() + + return "\n".join(self.output) + +def loadFile(filename): + """ Loads file "filename" and returns the content. + @param filename The name of the file to load + @returns the content of the file. + """ + f = open(filename, 'r') + + try: + content = f.read() + return content + finally: + f.close() + +def optParse(): + """ Parses commandline options. """ + parser = OptionParser(prog=__applicationName__, version="%prog " + __version__) + + parser.set_usage("%prog [options] filename") + parser.add_option("--autobrief", + action="store_true", dest="autobrief", + help="Use the docstring summary line as \\brief description" + ) + + ## parse options + global options + (options, filename) = parser.parse_args() + + if not filename: + print >>sys.stderr, "No filename given." + sys.exit(-1) + + return filename[0] + +def main(): + """ Opens the file given as first commandline argument and processes it, + then prints out the processed file. + """ + filename = optParse() + + try: + input = loadFile(filename) + except IOError, (errno, msg): + print >>sys.stderr, msg + sys.exit(-1) + + fsm = Doxypy() + output = fsm.parse(input) + print output + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/gnuradio-core/doc/other/group_defs.dox b/gnuradio-core/doc/other/group_defs.dox index 47cce21c..de64f359 100644 --- a/gnuradio-core/doc/other/group_defs.dox +++ b/gnuradio-core/doc/other/group_defs.dox @@ -1,6 +1,6 @@ /*! * \defgroup block Signal Processing Blocks - * These are the signal processing blocks, blah, blah blah... + * These are the signal processing blocks... * @{ */ @@ -22,10 +22,53 @@ * \defgroup converter Type Conversions */ +/*! + * \defgroup level Signal Level Control + */ + +/*! + * \defgroup clock Signal Clock Synchronization + */ + /*! @} */ -/*! \defgroup filter_design Filter Design */ -/*! \defgroup filter_primitive Filter Primitives */ +/*! \defgroup filter_design Digital Filter Design */ +/*! \defgroup graphical Graphical Utilities */ /*! \defgroup internal Implementation Details */ -/*! \defgroup qa Quality Assurance */ +/*! \defgroup hardware Hardware */ +/*! \defgroup encdec Voice Encoders and Decoders */ +/*! \defgroup coding Information Coding and Decoding */ +/*! \defgroup modulation Signal Modulation */ +/*! \defgroup demodulation Signal Demodulation */ +/*! \defgroup math Mathmatics */ +/*! \defgroup tools Tools */ +/*! \defgroup misc Miscellaneous */ +/*! + * \defgroup applications Applications + * These are some applications build using gnuradio... + * @{ + */ + +/*! + * \defgroup radar Radar + * Radar Applications... + */ + +/*! + * \defgroup atsc ATSC + * ATSC Applications... + */ + +/*! + * \defgroup pager Pager + * Pager Applications + */ + +/*! + * \defgroup sounder Sounder + * Channel Sounder + */ + +/*! @} */ +/*! \defgroup usrp USRP */ -- 2.30.2