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