--- /dev/null
+## @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 plugins.EdkPlugins.basemodel.ini as ini\r
+import re, os\r
+from plugins.EdkPlugins.basemodel.message import *\r
+\r
+class INFFile(ini.BaseINIFile):\r
+ _libobjs = {}\r
+\r
+ def GetSectionInstance(self, parent, name, isCombined=False):\r
+ return INFSection(parent, name, isCombined)\r
+\r
+ def GetProduceLibraryClass(self):\r
+ obj = self.GetDefine("LIBRARY_CLASS")\r
+ if obj == None: return None\r
+\r
+ return obj.split('|')[0].strip()\r
+\r
+ def GetSectionObjectsByName(self, name, arch=None):\r
+ arr = []\r
+ sects = self.GetSectionByName(name)\r
+ for sect in sects:\r
+ # skip unmatched archtecture content\r
+ if not sect.IsArchMatch(arch):\r
+ continue\r
+\r
+ for obj in sect.GetObjects():\r
+ arr.append(obj)\r
+\r
+ return arr\r
+\r
+ def GetSourceObjects(self, arch=None, tool=None):\r
+ arr = []\r
+ sects = self.GetSectionByName('sources')\r
+ for sect in sects:\r
+ # skip unmatched archtecture content\r
+ if not sect.IsArchMatch(arch):\r
+ continue\r
+\r
+ for obj in sect.GetObjects():\r
+ if not obj.IsMatchFamily(tool):\r
+ continue\r
+ arr.append(obj)\r
+\r
+ return arr\r
+\r
+ def Parse(self):\r
+ if not ini.BaseINIFile.Parse(self):\r
+ return False\r
+ classname = self.GetProduceLibraryClass()\r
+ if classname != None:\r
+ libobjdict = INFFile._libobjs\r
+ if libobjdict.has_key(classname):\r
+ if self not in libobjdict[classname]:\r
+ libobjdict[classname].append(self)\r
+ else:\r
+ libobjdict[classname] = [self]\r
+\r
+ return True\r
+\r
+ def GetBaseName(self):\r
+ return self.GetDefine("BASE_NAME").strip()\r
+\r
+ def GetModuleRootPath(self):\r
+ return os.path.dirname(self.GetFilename())\r
+\r
+ def Clear(self):\r
+ classname = self.GetProduceLibraryClass()\r
+ if classname != None:\r
+ libobjdict = INFFile._libobjs\r
+ libobjdict[classname].remove(self)\r
+ if len(libobjdict[classname]) == 0:\r
+ del libobjdict[classname]\r
+ ini.BaseINIFile.Clear(self)\r
+\r
+\r
+class INFSection(ini.BaseINISection):\r
+ def GetSectionINIObject(self, parent):\r
+ type = self.GetType()\r
+\r
+ if type.lower() == 'libraryclasses':\r
+ return INFLibraryClassObject(self)\r
+ if type.lower() == 'sources':\r
+ return INFSourceObject(self)\r
+ if type.lower().find('pcd') != -1:\r
+ return INFPcdObject(self)\r
+ if type.lower() == 'packages':\r
+ return INFDependentPackageObject(self)\r
+ if type.lower() in ['guids', 'protocols', 'ppis']:\r
+ return INFGuidObject(self)\r
+ if type.lower() == 'defines':\r
+ return INFDefineSectionObject(self)\r
+ return INFSectionObject(self)\r
+\r
+ def GetType(self):\r
+ arr = self._name.split('.')\r
+ return arr[0].strip()\r
+\r
+ def GetArch(self):\r
+ arr = self._name.split('.')\r
+ if len(arr) == 1:\r
+ return 'common'\r
+ return arr[1]\r
+\r
+ def IsArchMatch(self, arch):\r
+ if arch == None or self.GetArch() == 'common':\r
+ return True\r
+\r
+ if self.GetArch().lower() != arch.lower():\r
+ return False\r
+\r
+ return True\r
+\r
+class INFSectionObject(ini.BaseINISectionObject):\r
+ def GetArch(self):\r
+ return self.GetParent().GetArch()\r
+\r
+class INFDefineSectionObject(INFSectionObject):\r
+ def __init__(self, parent):\r
+ INFSectionObject.__init__(self, parent)\r
+ self._key = None\r
+ self._value = None\r
+\r
+ def Parse(self):\r
+ assert (self._start == self._end), 'The object in define section must be in single line'\r
+\r
+ line = self.GetLineByOffset(self._start).strip()\r
+\r
+ line = line.split('#')[0]\r
+ arr = line.split('=')\r
+ if len(arr) != 2:\r
+ ErrorMsg('Invalid define section object',\r
+ self.GetFilename(),\r
+ self._start\r
+ )\r
+ return False\r
+\r
+ self._key = arr[0].strip()\r
+ self._value = arr[1].strip()\r
+\r
+ return True\r
+\r
+ def GetKey(self):\r
+ return self._key\r
+\r
+ def GetValue(self):\r
+ return self._value\r
+\r
+class INFLibraryClassObject(INFSectionObject):\r
+ _objs = {}\r
+ def __init__(self, parent):\r
+ INFSectionObject.__init__(self, parent)\r
+ self._classname = None\r
+\r
+ def GetClass(self):\r
+ return self._classname\r
+\r
+ def Parse(self):\r
+ self._classname = self.GetLineByOffset(self._start).split('#')[0].strip()\r
+ objdict = INFLibraryClassObject._objs\r
+ if objdict.has_key(self._classname):\r
+ objdict[self._classname].append(self)\r
+ else:\r
+ objdict[self._classname] = [self]\r
+ return True\r
+\r
+ def Destroy(self):\r
+ objdict = INFLibraryClassObject._objs\r
+ objdict[self._classname].remove(self)\r
+ if len(objdict[self._classname]) == 0:\r
+ del objdict[self._classname]\r
+\r
+ def GetName(self):\r
+ return self._classname\r
+\r
+ @staticmethod\r
+ def GetObjectDict():\r
+ return INFLibraryClassObject._objs\r
+\r
+class INFDependentPackageObject(INFSectionObject):\r
+ def GetPath(self):\r
+ return self.GetLineByOffset(self._start).split('#')[0].strip()\r
+\r
+class INFSourceObject(INFSectionObject):\r
+ _objs = {}\r
+ def __init__(self, parent):\r
+ INFSectionObject.__init__(self, parent)\r
+\r
+ self.mSourcename = None\r
+ self.mToolCode = None\r
+ self.mFamily = None\r
+ self.mTagName = None\r
+ self.mFeaturePcd = None\r
+ self.mFilename = None\r
+\r
+ def GetSourcePath(self):\r
+ return self.mSourcename\r
+\r
+ def GetSourceFullPath(self):\r
+ path = os.path.dirname(self.GetFilename())\r
+ path = os.path.join(path, self.GetSourcePath())\r
+ return os.path.normpath(path)\r
+\r
+ def GetToolCode(self):\r
+ return self.mToolCode\r
+\r
+ def GetFamily(self):\r
+ return self.mFamily\r
+\r
+ def GetTagName(self):\r
+ return self.mTagName\r
+\r
+ def GetFeaturePcd(self):\r
+ return self.mFeaturePcd\r
+\r
+ def Parse(self):\r
+ line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
+\r
+ arr = line.split('|')\r
+\r
+ self.mSourcename = arr[0].strip()\r
+ if len(arr) >= 2:\r
+ self.mFamily = arr[1].strip()\r
+ if len(arr) >= 3:\r
+ self.mTagName = arr[2].strip()\r
+ if len(arr) >= 4:\r
+ self.mToolCode = arr[3].strip()\r
+ if len(arr) >= 5:\r
+ self.mFeaturePcd = arr[4].strip()\r
+\r
+ self.mFilename = os.path.basename(self.GetSourceFullPath())\r
+ objdict = INFSourceObject._objs\r
+ if not objdict.has_key(self.mFilename):\r
+ objdict[self.mFilename] = [self]\r
+ else:\r
+ objdict[self.mFilename].append(self)\r
+\r
+ return True\r
+\r
+ def GetName(self):\r
+ return self.mFilename\r
+\r
+ def Destroy(self):\r
+ objdict = INFSourceObject._objs\r
+ objdict[self.mFilename].remove(self)\r
+ if len(objdict[self.mFilename]) == 0:\r
+ del objdict[self.mFilename]\r
+\r
+ def IsMatchFamily(self, family):\r
+ if family == None:\r
+ return True\r
+ if self.mFamily != None:\r
+ if family.strip().lower() == self.mFamily.lower():\r
+ return True\r
+ else:\r
+ return False\r
+ else:\r
+ fname = self.GetSourcePath()\r
+ if fname.endswith('.S') and family.lower() != 'gcc':\r
+ return False\r
+ if fname.endswith('.s') and (self.GetArch().lower() != 'ipf' and self.GetArch().lower() != 'common'):\r
+ return False\r
+ if fname.lower().endswith('.asm') and (family.lower() != 'msft' and family.lower() != 'intel'):\r
+ return False\r
+ return True\r
+\r
+ @staticmethod\r
+ def GetObjectDict():\r
+ return INFSourceObject._objs\r
+\r
+class INFPcdObject(INFSectionObject):\r
+ _objs = {}\r
+\r
+ def __init__(self, parent):\r
+ INFSectionObject.__init__(self, parent)\r
+\r
+ self.mPcdType = None\r
+ self.mDefaultValue = None\r
+ self.mPcdName = None\r
+\r
+ @staticmethod\r
+ def GetObjectDict():\r
+ return INFPcdObject._objs\r
+\r
+ def Parse(self):\r
+ line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
+\r
+ arr = line.split('|')\r
+ self.mPcdName = arr[0].strip()\r
+\r
+ if len(arr) >= 2:\r
+ self.mDefaultValue = arr[1].strip()\r
+\r
+ objdict = INFPcdObject._objs\r
+ if objdict.has_key(self.GetName()):\r
+ if self not in objdict[self.GetName()]:\r
+ objdict[self.GetName()].append(self)\r
+ else:\r
+ objdict[self.GetName()] = [self]\r
+ return True\r
+\r
+ def GetPcdName(self):\r
+ return self.mPcdName\r
+\r
+ def GetPcdType(self):\r
+ return self.GetParent().GetType()\r
+\r
+ def GetName(self):\r
+ return self.mPcdName.split('.')[1]\r
+\r
+ def Destroy(self):\r
+ objdict = INFPcdObject._objs\r
+ objdict[self.GetName()].remove(self)\r
+ if len(objdict[self.GetName()]) == 0:\r
+ del objdict[self.GetName()]\r
+\r
+class INFGuidObject(INFSectionObject):\r
+ def __init__(self, parent):\r
+ INFSectionObject.__init__(self, parent)\r
+ self._name = None\r
+\r
+ def Parse(self):\r
+ line = self.GetLineByOffset(self._start).strip().split('#')[0].split("|")[0]\r
+ self._name = line.strip()\r
+ return True\r
+\r
+ def GetName(self):\r
+ return self._name\r
+\r
+\r