]> git.proxmox.com Git - mirror_edk2.git/blame - 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
CommitLineData
7ccc9c95
YZ
1## @file\r
2#\r
3# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4#\r
5# This program and the accompanying materials are licensed and made available\r
6# under the terms and conditions of the BSD License which accompanies this\r
7# distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14import os\r
15\r
16from message import *\r
17\r
18class BaseDoxygeItem:\r
19 def __init__(self, name, tag=''):\r
20 self.mName = name\r
21 self.mTag = tag\r
22 self.mDescription = ''\r
23 self.mText = []\r
24\r
25 def AddDescription(self, desc):\r
26 self.mDescription = '%s%s' % (self.mDescription, desc)\r
27\r
28 def __str__(self):\r
29 return '\n'.join(self.mText)\r
30\r
31 def Generate(self):\r
32 """This interface need to be override"""\r
33\r
34class Section(BaseDoxygeItem):\r
35 def Generate(self):\r
36 """This interface need to be override"""\r
37 if len(self.mTag) != 0:\r
38 self.mText.append(' \section %s %s' % (self.mName, self.mTag))\r
39 else:\r
40 self.mText.append(' \section %s' % self.mName)\r
41\r
42 self.mText.append(self.mDescription)\r
43 return self.mText\r
44\r
45class Page(BaseDoxygeItem):\r
46 def __init__(self, name, tag=None, isSort=True):\r
47 BaseDoxygeItem.__init__(self, name, tag)\r
48 self.mSubPages = []\r
49 self.mIsMainPage = False\r
50 self.mSections = []\r
51 self.mIsSort = isSort\r
52\r
53 def GetSubpageCount(self):\r
54 return len(self.mSubPages)\r
55\r
56 def AddPage(self, subpage):\r
57 self.mSubPages.append(subpage)\r
58 return subpage\r
59\r
60 def AddPages(self, pageArray):\r
61 if pageArray == None:\r
62 return\r
63 for page in pageArray:\r
64 self.AddPage(page)\r
65\r
66 def AddSection(self, section):\r
67 self.mSections.append(section)\r
68 self.mSections.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
69\r
70 def Generate(self):\r
71 if self.mIsMainPage:\r
72 self.mText.append('/** \mainpage %s' % self.mName)\r
73 self.mIsSort = False\r
74 else:\r
75 self.mText.append('/** \page %s %s' % (self.mTag, self.mName))\r
76\r
77 if len(self.mDescription) != 0:\r
78 self.mText.append(self.mDescription)\r
79 endIndex = len(self.mText)\r
80\r
81 self.mSections.sort()\r
82 for sect in self.mSections:\r
83 self.mText += sect.Generate()\r
84\r
85 endIndex = len(self.mText)\r
86\r
87 if len(self.mSubPages) != 0:\r
88 self.mText.insert(endIndex, "<p> \section content_index INDEX")\r
89 endIndex = len(self.mText)\r
90 self.mText.insert(endIndex, '<ul>')\r
91 endIndex += 1\r
92 if self.mIsSort:\r
93 self.mSubPages.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
94 for page in self.mSubPages:\r
95 self.mText.insert(endIndex, '<li>\subpage %s \"%s\" </li>' % (page.mTag, page.mName))\r
96 endIndex += 1\r
97 self.mText += page.Generate()\r
98 self.mText.insert(endIndex, '</ul>')\r
99 endIndex += 1\r
100 self.mText.insert(endIndex, ' **/')\r
101 return self.mText\r
102\r
103class DoxygenFile(Page):\r
104 def __init__(self, name, file):\r
105 Page.__init__(self, name)\r
106 self.mFilename = file\r
107 self.mIsMainPage = True\r
108\r
109 def GetFilename(self):\r
110 return self.mFilename.replace('/', '\\')\r
111\r
112 def Save(self):\r
113 str = self.Generate()\r
114 try:\r
115 f = open(self.mFilename, 'w')\r
116 f.write('\n'.join(str))\r
117 f.close()\r
118 except IOError, e:\r
119 ErrorMsg ('Fail to write file %s' % self.mFilename)\r
120 return False\r
121\r
122 return True\r
123\r
124doxygenConfigTemplate = """\r
125DOXYFILE_ENCODING = UTF-8\r
126PROJECT_NAME = %(ProjectName)s\r
127PROJECT_NUMBER = %(ProjectVersion)s\r
128OUTPUT_DIRECTORY = %(OutputDir)s\r
129CREATE_SUBDIRS = YES\r
130OUTPUT_LANGUAGE = English\r
131BRIEF_MEMBER_DESC = YES\r
132REPEAT_BRIEF = YES\r
133ABBREVIATE_BRIEF = "The $name class " \\\r
134 "The $name widget " \\\r
135 "The $name file " \\\r
136 is \\\r
137 provides \\\r
138 specifies \\\r
139 contains \\\r
140 represents \\\r
141 a \\\r
142 an \\\r
143 the\r
144ALWAYS_DETAILED_SEC = NO\r
145INLINE_INHERITED_MEMB = NO\r
146FULL_PATH_NAMES = YES\r
147STRIP_FROM_PATH = %(StripPath)s\r
148STRIP_FROM_INC_PATH =\r
149SHORT_NAMES = YES\r
150JAVADOC_AUTOBRIEF = NO\r
151QT_AUTOBRIEF = NO\r
152MULTILINE_CPP_IS_BRIEF = NO\r
153DETAILS_AT_TOP = YES\r
154INHERIT_DOCS = YES\r
155SEPARATE_MEMBER_PAGES = NO\r
156TAB_SIZE = 1\r
157ALIASES =\r
158OPTIMIZE_OUTPUT_FOR_C = YES\r
159OPTIMIZE_OUTPUT_JAVA = NO\r
160BUILTIN_STL_SUPPORT = NO\r
161CPP_CLI_SUPPORT = NO\r
162SIP_SUPPORT = NO\r
163DISTRIBUTE_GROUP_DOC = YES\r
164SUBGROUPING = YES\r
165TYPEDEF_HIDES_STRUCT = NO\r
166\r
167EXTRACT_ALL = YES\r
168EXTRACT_PRIVATE = NO\r
169EXTRACT_STATIC = NO\r
170EXTRACT_LOCAL_CLASSES = NO\r
171EXTRACT_LOCAL_METHODS = NO\r
172EXTRACT_ANON_NSPACES = NO\r
173HIDE_UNDOC_MEMBERS = NO\r
174HIDE_UNDOC_CLASSES = NO\r
175HIDE_FRIEND_COMPOUNDS = NO\r
176HIDE_IN_BODY_DOCS = NO\r
177INTERNAL_DOCS = NO\r
178CASE_SENSE_NAMES = NO\r
179HIDE_SCOPE_NAMES = NO\r
180SHOW_INCLUDE_FILES = NO\r
181INLINE_INFO = YES\r
182SORT_MEMBER_DOCS = YES\r
183SORT_BRIEF_DOCS = NO\r
184SORT_BY_SCOPE_NAME = YES\r
185GENERATE_TODOLIST = YES\r
186GENERATE_TESTLIST = YES\r
187GENERATE_BUGLIST = YES\r
188GENERATE_DEPRECATEDLIST= YES\r
189ENABLED_SECTIONS =\r
190MAX_INITIALIZER_LINES = 30\r
191SHOW_USED_FILES = NO\r
192SHOW_DIRECTORIES = NO\r
193FILE_VERSION_FILTER =\r
194\r
195QUIET = NO\r
196WARNINGS = YES\r
197WARN_IF_UNDOCUMENTED = YES\r
198WARN_IF_DOC_ERROR = YES\r
199WARN_NO_PARAMDOC = YES\r
200WARN_FORMAT = "$file:$line: $text "\r
201WARN_LOGFILE = %(WarningFile)s\r
202\r
203INPUT = %(FileList)s\r
204INPUT_ENCODING = UTF-8\r
205FILE_PATTERNS = %(Pattern)s\r
206RECURSIVE = NO\r
207EXCLUDE = *.svn\r
208EXCLUDE_SYMLINKS = NO\r
209EXCLUDE_PATTERNS = .svn\r
210EXCLUDE_SYMBOLS =\r
211EXAMPLE_PATH = %(ExamplePath)s\r
212EXAMPLE_PATTERNS = *\r
213EXAMPLE_RECURSIVE = NO\r
214IMAGE_PATH =\r
215INPUT_FILTER =\r
216FILTER_PATTERNS =\r
217FILTER_SOURCE_FILES = NO\r
218\r
219SOURCE_BROWSER = NO\r
220INLINE_SOURCES = NO\r
221STRIP_CODE_COMMENTS = YES\r
222REFERENCED_BY_RELATION = YES\r
223REFERENCES_RELATION = YES\r
224REFERENCES_LINK_SOURCE = NO\r
225USE_HTAGS = NO\r
226VERBATIM_HEADERS = NO\r
227\r
228ALPHABETICAL_INDEX = NO\r
229COLS_IN_ALPHA_INDEX = 5\r
230IGNORE_PREFIX =\r
231\r
232GENERATE_HTML = YES\r
233HTML_OUTPUT = html\r
234HTML_FILE_EXTENSION = .html\r
235HTML_HEADER =\r
236HTML_FOOTER =\r
237HTML_STYLESHEET =\r
238HTML_ALIGN_MEMBERS = YES\r
239GENERATE_HTMLHELP = %(WhetherGenerateHtmlHelp)s\r
240HTML_DYNAMIC_SECTIONS = NO\r
241CHM_FILE = index.chm\r
242HHC_LOCATION =\r
243GENERATE_CHI = NO\r
244BINARY_TOC = NO\r
245TOC_EXPAND = NO\r
246DISABLE_INDEX = NO\r
247ENUM_VALUES_PER_LINE = 4\r
248GENERATE_TREEVIEW = %(WhetherGenerateTreeView)s\r
249TREEVIEW_WIDTH = 250\r
250\r
251GENERATE_LATEX = NO\r
252LATEX_OUTPUT = latex\r
253LATEX_CMD_NAME = latex\r
254MAKEINDEX_CMD_NAME = makeindex\r
255COMPACT_LATEX = NO\r
256PAPER_TYPE = a4wide\r
257EXTRA_PACKAGES =\r
258LATEX_HEADER =\r
259PDF_HYPERLINKS = YES\r
260USE_PDFLATEX = YES\r
261LATEX_BATCHMODE = NO\r
262LATEX_HIDE_INDICES = NO\r
263\r
264GENERATE_RTF = NO\r
265RTF_OUTPUT = rtf\r
266COMPACT_RTF = NO\r
267RTF_HYPERLINKS = NO\r
268RTF_STYLESHEET_FILE =\r
269RTF_EXTENSIONS_FILE =\r
270\r
271GENERATE_MAN = NO\r
272MAN_OUTPUT = man\r
273MAN_EXTENSION = .3\r
274MAN_LINKS = NO\r
275\r
276GENERATE_XML = NO\r
277XML_OUTPUT = xml\r
278XML_SCHEMA =\r
279XML_DTD =\r
280XML_PROGRAMLISTING = YES\r
281\r
282GENERATE_AUTOGEN_DEF = NO\r
283\r
284GENERATE_PERLMOD = NO\r
285PERLMOD_LATEX = NO\r
286PERLMOD_PRETTY = YES\r
287PERLMOD_MAKEVAR_PREFIX =\r
288\r
289ENABLE_PREPROCESSING = YES\r
290MACRO_EXPANSION = YES\r
291EXPAND_ONLY_PREDEF = YES\r
292SEARCH_INCLUDES = YES\r
293INCLUDE_PATH = %(IncludePath)s\r
294INCLUDE_FILE_PATTERNS = *.h\r
295PREDEFINED = %(PreDefined)s\r
296EXPAND_AS_DEFINED =\r
297SKIP_FUNCTION_MACROS = NO\r
298\r
299TAGFILES =\r
300GENERATE_TAGFILE =\r
301ALLEXTERNALS = NO\r
302EXTERNAL_GROUPS = YES\r
303PERL_PATH = /usr/bin/perl\r
304\r
305CLASS_DIAGRAMS = NO\r
306MSCGEN_PATH =\r
307HIDE_UNDOC_RELATIONS = YES\r
308HAVE_DOT = NO\r
309CLASS_GRAPH = YES\r
310COLLABORATION_GRAPH = YES\r
311GROUP_GRAPHS = YES\r
312UML_LOOK = NO\r
313TEMPLATE_RELATIONS = NO\r
314INCLUDE_GRAPH = YES\r
315INCLUDED_BY_GRAPH = YES\r
316CALL_GRAPH = NO\r
317CALLER_GRAPH = NO\r
318GRAPHICAL_HIERARCHY = YES\r
319DIRECTORY_GRAPH = YES\r
320DOT_IMAGE_FORMAT = png\r
321DOT_PATH =\r
322DOTFILE_DIRS =\r
323DOT_GRAPH_MAX_NODES = 50\r
324MAX_DOT_GRAPH_DEPTH = 1000\r
325DOT_TRANSPARENT = YES\r
326DOT_MULTI_TARGETS = NO\r
327GENERATE_LEGEND = YES\r
328DOT_CLEANUP = YES\r
329\r
330SEARCHENGINE = NO\r
331\r
332"""\r
333class DoxygenConfigFile:\r
334 def __init__(self):\r
335 self.mProjectName = ''\r
336 self.mOutputDir = ''\r
337 self.mFileList = []\r
338 self.mIncludeList = []\r
339 self.mStripPath = ''\r
340 self.mExamplePath = ''\r
341 self.mPattern = ['*.c', '*.h',\r
342 '*.asm', '*.s', '.nasm', '*.html', '*.dox']\r
343 self.mMode = 'HTML'\r
344 self.mWarningFile = ''\r
345 self.mPreDefined = []\r
346 self.mProjectVersion = 0.1\r
347\r
348 def SetChmMode(self):\r
349 self.mMode = 'CHM'\r
350\r
351 def SetHtmlMode(self):\r
352 self.mMode = 'HTML'\r
353\r
354 def SetProjectName(self, str):\r
355 self.mProjectName = str\r
356\r
357 def SetProjectVersion(self, str):\r
358 self.mProjectVersion = str\r
359\r
360 def SetOutputDir(self, str):\r
361 self.mOutputDir = str\r
362\r
363 def SetStripPath(self, str):\r
364 self.mStripPath = str\r
365\r
366 def SetExamplePath(self, str):\r
367 self.mExamplePath = str\r
368\r
369 def SetWarningFilePath(self, str):\r
370 self.mWarningFile = str.replace('\\', '/')\r
371\r
372 def FileExists(self, path):\r
373 if path == None:\r
374 return False\r
375 if len(path) == 0:\r
376 return False\r
377\r
378 for p in self.mFileList:\r
379 if path.lower() == p.lower():\r
380 return True\r
381\r
382 return False\r
383\r
384 def AddFile(self, path):\r
385 if path == None:\r
386 return\r
387\r
388 if len(path) == 0:\r
389 return\r
390 path = path.replace('\\', '/')\r
391 if not self.FileExists(path):\r
392 self.mFileList.append(path)\r
393\r
394 def AddIncludePath(self, path):\r
395 path = path.replace('\\', '/')\r
396 if path not in self.mIncludeList:\r
397 self.mIncludeList.append(path)\r
398\r
399 def AddPattern(self, pattern):\r
400 self.mPattern.append(pattern)\r
401\r
402 def AddPreDefined(self, macro):\r
403 self.mPreDefined.append(macro)\r
404\r
405 def Generate(self, path):\r
406 files = ' \\\n'.join(self.mFileList)\r
407 includes = ' \\\n'.join(self.mIncludeList)\r
408 patterns = ' \\\n'.join(self.mPattern)\r
409 if self.mMode.lower() == 'html':\r
410 sHtmlHelp = 'NO'\r
411 sTreeView = 'YES'\r
412 else:\r
413 sHtmlHelp = 'YES'\r
414 sTreeView = 'NO'\r
415\r
416 text = doxygenConfigTemplate % {'ProjectName':self.mProjectName,\r
417 'OutputDir':self.mOutputDir,\r
418 'StripPath':self.mStripPath,\r
419 'ExamplePath':self.mExamplePath,\r
420 'FileList':files,\r
421 'Pattern':patterns,\r
422 'WhetherGenerateHtmlHelp':sHtmlHelp,\r
423 'WhetherGenerateTreeView':sTreeView,\r
424 'IncludePath':includes,\r
425 'WarningFile':self.mWarningFile,\r
426 'PreDefined':' '.join(self.mPreDefined),\r
427 'ProjectVersion':self.mProjectVersion}\r
428 try:\r
429 f = open(path, 'w')\r
430 f.write(text)\r
431 f.close()\r
432 except IOError, e:\r
433 ErrorMsg ('Fail to generate doxygen config file %s' % path)\r
434 return False\r
435\r
436 return True\r
437\r
438########################################################################\r
439# TEST CODE\r
440########################################################################\r
441if __name__== '__main__':\r
442 df = DoxygenFile('Platform Document', 'm:\tree')\r
443 df.AddPage(Page('Module', 'module'))\r
444 p = df.AddPage(Page('Library', 'library'))\r
445 p.AddDescription(desc)\r
446 p.AddPage(Page('PCD', 'pcds'))\r
447\r
448 df.Generate()\r
449 print df\r