dsc.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. ## @file
  2. #
  3. # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
  4. #
  5. # SPDX-License-Identifier: BSD-2-Clause-Patent
  6. #
  7. from plugins.EdkPlugins.basemodel import ini
  8. import re, os
  9. from plugins.EdkPlugins.basemodel.message import *
  10. class DSCFile(ini.BaseINIFile):
  11. def GetSectionInstance(self, parent, name, isCombined=False):
  12. return DSCSection(parent, name, isCombined)
  13. def GetComponents(self):
  14. return self.GetSectionObjectsByName('Components')
  15. class DSCSection(ini.BaseINISection):
  16. def GetSectionINIObject(self, parent):
  17. type = self.GetType()
  18. if type.lower() == 'components':
  19. return DSCComponentObject(self)
  20. if type.lower() == 'libraryclasses':
  21. return DSCLibraryClassObject(self)
  22. if type.lower() == 'defines':
  23. return ini.BaseINISectionObject(self)
  24. if type.lower() == 'pcdsfeatureflag' or \
  25. type.lower() == 'pcdsfixedatbuild' or \
  26. type.lower() == 'pcdspatchableinmodule' or\
  27. type.lower() == 'pcdsdynamicdefault' or \
  28. type.lower() == 'pcdsdynamicex' or \
  29. type.lower() == 'pcdsdynamichii' or \
  30. type.lower() == 'pcdsdynamicvpd':
  31. return DSCPcdObject(self)
  32. return DSCSectionObject(self)
  33. def GetType(self):
  34. arr = self._name.split('.')
  35. return arr[0].strip()
  36. def GetArch(self):
  37. arr = self._name.split('.')
  38. if len(arr) == 1:
  39. return 'common'
  40. return arr[1]
  41. def GetModuleType(self):
  42. arr = self._name.split('.')
  43. if len(arr) < 3:
  44. return 'common'
  45. return arr[2]
  46. class DSCSectionObject(ini.BaseINISectionObject):
  47. def GetArch(self):
  48. return self.GetParent().GetArch()
  49. class DSCPcdObject(DSCSectionObject):
  50. def __init__(self, parent):
  51. ini.BaseINISectionObject.__init__(self, parent)
  52. self._name = None
  53. def Parse(self):
  54. line = self.GetLineByOffset(self._start).strip().split('#')[0]
  55. self._name = line.split('|')[0]
  56. self._value = line.split('|')[1]
  57. return True
  58. def GetPcdName(self):
  59. return self._name
  60. def GetPcdType(self):
  61. return self.GetParent().GetType()
  62. def GetPcdValue(self):
  63. return self._value
  64. class DSCLibraryClassObject(DSCSectionObject):
  65. def __init__(self, parent):
  66. ini.BaseINISectionObject.__init__(self, parent)
  67. def GetClass(self):
  68. line = self.GetLineByOffset(self._start)
  69. return line.split('#')[0].split('|')[0].strip()
  70. def GetInstance(self):
  71. line = self.GetLineByOffset(self._start)
  72. return line.split('#')[0].split('|')[1].strip()
  73. def GetArch(self):
  74. return self.GetParent().GetArch()
  75. def GetModuleType(self):
  76. return self.GetParent().GetModuleType()
  77. class DSCComponentObject(DSCSectionObject):
  78. def __init__(self, parent):
  79. ini.BaseINISectionObject.__init__(self, parent)
  80. self._OveridePcds = {}
  81. self._OverideLibraries = {}
  82. self._Filename = ''
  83. def __del__(self):
  84. self._OverideLibraries.clear()
  85. self._OverideLibraries.clear()
  86. ini.BaseINISectionObject.__del__(self)
  87. def AddOverideLib(self, libclass, libinstPath):
  88. if libclass not in self._OverideLibraries.keys():
  89. self._OverideLibraries[libclass] = libinstPath
  90. def AddOveridePcd(self, name, type, value=None):
  91. if type not in self._OveridePcds.keys():
  92. self._OveridePcds[type] = []
  93. self._OveridePcds[type].append((name, value))
  94. def GetOverideLibs(self):
  95. return self._OverideLibraries
  96. def GetArch(self):
  97. return self.GetParent().GetArch()
  98. def GetOveridePcds(self):
  99. return self._OveridePcds
  100. def GetFilename(self):
  101. return self.GetLineByOffset(self._start).split('#')[0].split('{')[0].strip()
  102. def SetFilename(self, fName):
  103. self._Filename = fName
  104. def Parse(self):
  105. if (self._start < self._end):
  106. #
  107. # The first line is inf path and could be ignored
  108. # The end line is '}' and could be ignored
  109. #
  110. curr = self._start + 1
  111. end = self._end - 1
  112. OverideName = ''
  113. while (curr <= end):
  114. line = self.GetLineByOffset(curr).strip()
  115. if len(line) > 0 and line[0] != '#':
  116. line = line.split('#')[0].strip()
  117. if line[0] == '<':
  118. OverideName = line[1:len(line)-1]
  119. elif OverideName.lower() == 'libraryclasses':
  120. arr = line.split('|')
  121. self._OverideLibraries[arr[0].strip()] = arr[1].strip()
  122. elif OverideName.lower() == 'pcds':
  123. ErrorMsg('EDES does not support PCD overide',
  124. self.GetFileName(),
  125. self.GetParent().GetLinenumberByOffset(curr))
  126. curr = curr + 1
  127. return True
  128. def GenerateLines(self):
  129. lines = []
  130. hasLib = False
  131. hasPcd = False
  132. if len(self._OverideLibraries) != 0:
  133. hasLib = True
  134. if len(self._OveridePcds) != 0:
  135. hasPcd = True
  136. if hasLib or hasPcd:
  137. lines.append((' %s {\n' % self._Filename))
  138. else:
  139. lines.append((' %s \n' % self._Filename))
  140. return lines
  141. if hasLib:
  142. lines.append(' <LibraryClasses>\n')
  143. for libKey in self._OverideLibraries.keys():
  144. lines.append(' %s|%s\n' % (libKey, self._OverideLibraries[libKey]))
  145. if hasPcd:
  146. for key in self._OveridePcds.keys():
  147. lines.append(' <%s>\n' % key)
  148. for name, value in self._OveridePcds[key]:
  149. if value is not None:
  150. lines.append(' %s|%s\n' % (name, value))
  151. else:
  152. lines.append(' %s\n' % name)
  153. if hasLib or hasPcd:
  154. lines.append(' }\n')
  155. return lines