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