]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/basemodel/doxygen.py
BaseTools: Add PackageDocumentTools into Scripts folder
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / basemodel / doxygen.py
diff --git a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/basemodel/doxygen.py b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/basemodel/doxygen.py
new file mode 100644 (file)
index 0000000..2d0cc9d
--- /dev/null
@@ -0,0 +1,449 @@
+## @file\r
+#\r
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License which accompanies this\r
+# distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import os\r
+\r
+from message import *\r
+\r
+class BaseDoxygeItem:\r
+    def __init__(self, name, tag=''):\r
+        self.mName = name\r
+        self.mTag  = tag\r
+        self.mDescription = ''\r
+        self.mText = []\r
+\r
+    def AddDescription(self, desc):\r
+        self.mDescription = '%s%s' % (self.mDescription, desc)\r
+\r
+    def __str__(self):\r
+        return '\n'.join(self.mText)\r
+\r
+    def Generate(self):\r
+        """This interface need to be override"""\r
+\r
+class Section(BaseDoxygeItem):\r
+    def Generate(self):\r
+        """This interface need to be override"""\r
+        if len(self.mTag) != 0:\r
+            self.mText.append(' \section %s %s' % (self.mName, self.mTag))\r
+        else:\r
+            self.mText.append(' \section %s' % self.mName)\r
+\r
+        self.mText.append(self.mDescription)\r
+        return self.mText\r
+\r
+class Page(BaseDoxygeItem):\r
+    def __init__(self, name, tag=None, isSort=True):\r
+        BaseDoxygeItem.__init__(self, name, tag)\r
+        self.mSubPages     = []\r
+        self.mIsMainPage   = False\r
+        self.mSections     = []\r
+        self.mIsSort       = isSort\r
+\r
+    def GetSubpageCount(self):\r
+        return len(self.mSubPages)\r
+\r
+    def AddPage(self, subpage):\r
+        self.mSubPages.append(subpage)\r
+        return subpage\r
+\r
+    def AddPages(self, pageArray):\r
+        if pageArray == None:\r
+            return\r
+        for page in pageArray:\r
+            self.AddPage(page)\r
+\r
+    def AddSection(self, section):\r
+        self.mSections.append(section)\r
+        self.mSections.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
+\r
+    def Generate(self):\r
+        if self.mIsMainPage:\r
+            self.mText.append('/** \mainpage %s' % self.mName)\r
+            self.mIsSort = False\r
+        else:\r
+            self.mText.append('/** \page %s %s' % (self.mTag, self.mName))\r
+\r
+        if len(self.mDescription) != 0:\r
+            self.mText.append(self.mDescription)\r
+        endIndex = len(self.mText)\r
+\r
+        self.mSections.sort()\r
+        for sect in self.mSections:\r
+            self.mText += sect.Generate()\r
+\r
+        endIndex = len(self.mText)\r
+\r
+        if len(self.mSubPages) != 0:\r
+            self.mText.insert(endIndex, "<p> \section content_index INDEX")\r
+            endIndex = len(self.mText)\r
+            self.mText.insert(endIndex, '<ul>')\r
+            endIndex += 1\r
+            if self.mIsSort:\r
+                self.mSubPages.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
+            for page in self.mSubPages:\r
+                self.mText.insert(endIndex, '<li>\subpage %s \"%s\" </li>' % (page.mTag, page.mName))\r
+                endIndex += 1\r
+                self.mText += page.Generate()\r
+            self.mText.insert(endIndex, '</ul>')\r
+            endIndex += 1\r
+        self.mText.insert(endIndex, ' **/')\r
+        return self.mText\r
+\r
+class DoxygenFile(Page):\r
+    def __init__(self, name, file):\r
+        Page.__init__(self, name)\r
+        self.mFilename  = file\r
+        self.mIsMainPage = True\r
+\r
+    def GetFilename(self):\r
+        return self.mFilename.replace('/', '\\')\r
+\r
+    def Save(self):\r
+        str = self.Generate()\r
+        try:\r
+            f = open(self.mFilename, 'w')\r
+            f.write('\n'.join(str))\r
+            f.close()\r
+        except IOError, e:\r
+            ErrorMsg ('Fail to write file %s' % self.mFilename)\r
+            return False\r
+\r
+        return True\r
+\r
+doxygenConfigTemplate = """\r
+DOXYFILE_ENCODING      = UTF-8\r
+PROJECT_NAME           = %(ProjectName)s\r
+PROJECT_NUMBER         = %(ProjectVersion)s\r
+OUTPUT_DIRECTORY       = %(OutputDir)s\r
+CREATE_SUBDIRS         = YES\r
+OUTPUT_LANGUAGE        = English\r
+BRIEF_MEMBER_DESC      = YES\r
+REPEAT_BRIEF           = YES\r
+ABBREVIATE_BRIEF       = "The $name class           " \\\r
+                         "The $name widget           " \\\r
+                         "The $name file           " \\\r
+                         is \\\r
+                         provides \\\r
+                         specifies \\\r
+                         contains \\\r
+                         represents \\\r
+                         a \\\r
+                         an \\\r
+                         the\r
+ALWAYS_DETAILED_SEC    = NO\r
+INLINE_INHERITED_MEMB  = NO\r
+FULL_PATH_NAMES        = YES\r
+STRIP_FROM_PATH        = %(StripPath)s\r
+STRIP_FROM_INC_PATH    =\r
+SHORT_NAMES            = YES\r
+JAVADOC_AUTOBRIEF      = NO\r
+QT_AUTOBRIEF           = NO\r
+MULTILINE_CPP_IS_BRIEF = NO\r
+DETAILS_AT_TOP         = YES\r
+INHERIT_DOCS           = YES\r
+SEPARATE_MEMBER_PAGES  = NO\r
+TAB_SIZE               = 1\r
+ALIASES                =\r
+OPTIMIZE_OUTPUT_FOR_C  = YES\r
+OPTIMIZE_OUTPUT_JAVA   = NO\r
+BUILTIN_STL_SUPPORT    = NO\r
+CPP_CLI_SUPPORT        = NO\r
+SIP_SUPPORT            = NO\r
+DISTRIBUTE_GROUP_DOC   = YES\r
+SUBGROUPING            = YES\r
+TYPEDEF_HIDES_STRUCT   = NO\r
+\r
+EXTRACT_ALL            = YES\r
+EXTRACT_PRIVATE        = NO\r
+EXTRACT_STATIC         = NO\r
+EXTRACT_LOCAL_CLASSES  = NO\r
+EXTRACT_LOCAL_METHODS  = NO\r
+EXTRACT_ANON_NSPACES   = NO\r
+HIDE_UNDOC_MEMBERS     = NO\r
+HIDE_UNDOC_CLASSES     = NO\r
+HIDE_FRIEND_COMPOUNDS  = NO\r
+HIDE_IN_BODY_DOCS      = NO\r
+INTERNAL_DOCS          = NO\r
+CASE_SENSE_NAMES       = NO\r
+HIDE_SCOPE_NAMES       = NO\r
+SHOW_INCLUDE_FILES     = NO\r
+INLINE_INFO            = YES\r
+SORT_MEMBER_DOCS       = YES\r
+SORT_BRIEF_DOCS        = NO\r
+SORT_BY_SCOPE_NAME     = YES\r
+GENERATE_TODOLIST      = YES\r
+GENERATE_TESTLIST      = YES\r
+GENERATE_BUGLIST       = YES\r
+GENERATE_DEPRECATEDLIST= YES\r
+ENABLED_SECTIONS       =\r
+MAX_INITIALIZER_LINES  = 30\r
+SHOW_USED_FILES        = NO\r
+SHOW_DIRECTORIES       = NO\r
+FILE_VERSION_FILTER    =\r
+\r
+QUIET                  = NO\r
+WARNINGS               = YES\r
+WARN_IF_UNDOCUMENTED   = YES\r
+WARN_IF_DOC_ERROR      = YES\r
+WARN_NO_PARAMDOC       = YES\r
+WARN_FORMAT            = "$file:$line: $text           "\r
+WARN_LOGFILE           = %(WarningFile)s\r
+\r
+INPUT                  = %(FileList)s\r
+INPUT_ENCODING         = UTF-8\r
+FILE_PATTERNS          = %(Pattern)s\r
+RECURSIVE              = NO\r
+EXCLUDE                = *.svn\r
+EXCLUDE_SYMLINKS       = NO\r
+EXCLUDE_PATTERNS       = .svn\r
+EXCLUDE_SYMBOLS        =\r
+EXAMPLE_PATH           = %(ExamplePath)s\r
+EXAMPLE_PATTERNS       = *\r
+EXAMPLE_RECURSIVE      = NO\r
+IMAGE_PATH             =\r
+INPUT_FILTER           =\r
+FILTER_PATTERNS        =\r
+FILTER_SOURCE_FILES    = NO\r
+\r
+SOURCE_BROWSER         = NO\r
+INLINE_SOURCES         = NO\r
+STRIP_CODE_COMMENTS    = YES\r
+REFERENCED_BY_RELATION = YES\r
+REFERENCES_RELATION    = YES\r
+REFERENCES_LINK_SOURCE = NO\r
+USE_HTAGS              = NO\r
+VERBATIM_HEADERS       = NO\r
+\r
+ALPHABETICAL_INDEX     = NO\r
+COLS_IN_ALPHA_INDEX    = 5\r
+IGNORE_PREFIX          =\r
+\r
+GENERATE_HTML          = YES\r
+HTML_OUTPUT            = html\r
+HTML_FILE_EXTENSION    = .html\r
+HTML_HEADER            =\r
+HTML_FOOTER            =\r
+HTML_STYLESHEET        =\r
+HTML_ALIGN_MEMBERS     = YES\r
+GENERATE_HTMLHELP      = %(WhetherGenerateHtmlHelp)s\r
+HTML_DYNAMIC_SECTIONS  = NO\r
+CHM_FILE               = index.chm\r
+HHC_LOCATION           =\r
+GENERATE_CHI           = NO\r
+BINARY_TOC             = NO\r
+TOC_EXPAND             = NO\r
+DISABLE_INDEX          = NO\r
+ENUM_VALUES_PER_LINE   = 4\r
+GENERATE_TREEVIEW      = %(WhetherGenerateTreeView)s\r
+TREEVIEW_WIDTH         = 250\r
+\r
+GENERATE_LATEX         = NO\r
+LATEX_OUTPUT           = latex\r
+LATEX_CMD_NAME         = latex\r
+MAKEINDEX_CMD_NAME     = makeindex\r
+COMPACT_LATEX          = NO\r
+PAPER_TYPE             = a4wide\r
+EXTRA_PACKAGES         =\r
+LATEX_HEADER           =\r
+PDF_HYPERLINKS         = YES\r
+USE_PDFLATEX           = YES\r
+LATEX_BATCHMODE        = NO\r
+LATEX_HIDE_INDICES     = NO\r
+\r
+GENERATE_RTF           = NO\r
+RTF_OUTPUT             = rtf\r
+COMPACT_RTF            = NO\r
+RTF_HYPERLINKS         = NO\r
+RTF_STYLESHEET_FILE    =\r
+RTF_EXTENSIONS_FILE    =\r
+\r
+GENERATE_MAN           = NO\r
+MAN_OUTPUT             = man\r
+MAN_EXTENSION          = .3\r
+MAN_LINKS              = NO\r
+\r
+GENERATE_XML           = NO\r
+XML_OUTPUT             = xml\r
+XML_SCHEMA             =\r
+XML_DTD                =\r
+XML_PROGRAMLISTING     = YES\r
+\r
+GENERATE_AUTOGEN_DEF   = NO\r
+\r
+GENERATE_PERLMOD       = NO\r
+PERLMOD_LATEX          = NO\r
+PERLMOD_PRETTY         = YES\r
+PERLMOD_MAKEVAR_PREFIX =\r
+\r
+ENABLE_PREPROCESSING   = YES\r
+MACRO_EXPANSION        = YES\r
+EXPAND_ONLY_PREDEF     = YES\r
+SEARCH_INCLUDES        = YES\r
+INCLUDE_PATH           = %(IncludePath)s\r
+INCLUDE_FILE_PATTERNS  = *.h\r
+PREDEFINED             = %(PreDefined)s\r
+EXPAND_AS_DEFINED      =\r
+SKIP_FUNCTION_MACROS   = NO\r
+\r
+TAGFILES               =\r
+GENERATE_TAGFILE       =\r
+ALLEXTERNALS           = NO\r
+EXTERNAL_GROUPS        = YES\r
+PERL_PATH              = /usr/bin/perl\r
+\r
+CLASS_DIAGRAMS         = NO\r
+MSCGEN_PATH            =\r
+HIDE_UNDOC_RELATIONS   = YES\r
+HAVE_DOT               = NO\r
+CLASS_GRAPH            = YES\r
+COLLABORATION_GRAPH    = YES\r
+GROUP_GRAPHS           = YES\r
+UML_LOOK               = NO\r
+TEMPLATE_RELATIONS     = NO\r
+INCLUDE_GRAPH          = YES\r
+INCLUDED_BY_GRAPH      = YES\r
+CALL_GRAPH             = NO\r
+CALLER_GRAPH           = NO\r
+GRAPHICAL_HIERARCHY    = YES\r
+DIRECTORY_GRAPH        = YES\r
+DOT_IMAGE_FORMAT       = png\r
+DOT_PATH               =\r
+DOTFILE_DIRS           =\r
+DOT_GRAPH_MAX_NODES    = 50\r
+MAX_DOT_GRAPH_DEPTH    = 1000\r
+DOT_TRANSPARENT        = YES\r
+DOT_MULTI_TARGETS      = NO\r
+GENERATE_LEGEND        = YES\r
+DOT_CLEANUP            = YES\r
+\r
+SEARCHENGINE           = NO\r
+\r
+"""\r
+class DoxygenConfigFile:\r
+    def __init__(self):\r
+        self.mProjectName  = ''\r
+        self.mOutputDir    = ''\r
+        self.mFileList     = []\r
+        self.mIncludeList  = []\r
+        self.mStripPath    = ''\r
+        self.mExamplePath  = ''\r
+        self.mPattern      = ['*.c', '*.h',\r
+                              '*.asm', '*.s', '.nasm', '*.html', '*.dox']\r
+        self.mMode         = 'HTML'\r
+        self.mWarningFile  = ''\r
+        self.mPreDefined   = []\r
+        self.mProjectVersion = 0.1\r
+\r
+    def SetChmMode(self):\r
+        self.mMode = 'CHM'\r
+\r
+    def SetHtmlMode(self):\r
+        self.mMode = 'HTML'\r
+\r
+    def SetProjectName(self, str):\r
+        self.mProjectName = str\r
+\r
+    def SetProjectVersion(self, str):\r
+        self.mProjectVersion = str\r
+\r
+    def SetOutputDir(self, str):\r
+        self.mOutputDir = str\r
+\r
+    def SetStripPath(self, str):\r
+        self.mStripPath = str\r
+\r
+    def SetExamplePath(self, str):\r
+        self.mExamplePath = str\r
+\r
+    def SetWarningFilePath(self, str):\r
+        self.mWarningFile = str.replace('\\', '/')\r
+\r
+    def FileExists(self, path):\r
+        if path == None:\r
+            return False\r
+        if len(path) == 0:\r
+            return False\r
+\r
+        for p in self.mFileList:\r
+            if path.lower() == p.lower():\r
+                return True\r
+\r
+        return False\r
+\r
+    def AddFile(self, path):\r
+        if path == None:\r
+            return\r
+\r
+        if len(path) == 0:\r
+            return\r
+        path = path.replace('\\', '/')\r
+        if not self.FileExists(path):\r
+            self.mFileList.append(path)\r
+\r
+    def AddIncludePath(self, path):\r
+        path = path.replace('\\', '/')\r
+        if path not in self.mIncludeList:\r
+            self.mIncludeList.append(path)\r
+\r
+    def AddPattern(self, pattern):\r
+        self.mPattern.append(pattern)\r
+\r
+    def AddPreDefined(self, macro):\r
+        self.mPreDefined.append(macro)\r
+\r
+    def Generate(self, path):\r
+        files    = ' \\\n'.join(self.mFileList)\r
+        includes = ' \\\n'.join(self.mIncludeList)\r
+        patterns = ' \\\n'.join(self.mPattern)\r
+        if self.mMode.lower() == 'html':\r
+            sHtmlHelp = 'NO'\r
+            sTreeView = 'YES'\r
+        else:\r
+            sHtmlHelp = 'YES'\r
+            sTreeView = 'NO'\r
+\r
+        text = doxygenConfigTemplate % {'ProjectName':self.mProjectName,\r
+                                        'OutputDir':self.mOutputDir,\r
+                                        'StripPath':self.mStripPath,\r
+                                        'ExamplePath':self.mExamplePath,\r
+                                        'FileList':files,\r
+                                        'Pattern':patterns,\r
+                                        'WhetherGenerateHtmlHelp':sHtmlHelp,\r
+                                        'WhetherGenerateTreeView':sTreeView,\r
+                                        'IncludePath':includes,\r
+                                        'WarningFile':self.mWarningFile,\r
+                                        'PreDefined':' '.join(self.mPreDefined),\r
+                                        'ProjectVersion':self.mProjectVersion}\r
+        try:\r
+            f = open(path, 'w')\r
+            f.write(text)\r
+            f.close()\r
+        except IOError, e:\r
+            ErrorMsg ('Fail to generate doxygen config file %s' % path)\r
+            return False\r
+\r
+        return True\r
+\r
+########################################################################\r
+#                  TEST                   CODE\r
+########################################################################\r
+if __name__== '__main__':\r
+    df = DoxygenFile('Platform Document', 'm:\tree')\r
+    df.AddPage(Page('Module', 'module'))\r
+    p = df.AddPage(Page('Library', 'library'))\r
+    p.AddDescription(desc)\r
+    p.AddPage(Page('PCD', 'pcds'))\r
+\r
+    df.Generate()\r
+    print df\r