]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/InfBuildData.py
BaseTools: the list and iterator translation
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / InfBuildData.py
index c606b1a404d50150533ed0ae81b706fa9161da2d..fc779a9d25981ac6fa2c966dfbdab77889188389 100644 (file)
@@ -12,6 +12,7 @@
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 #\r
 \r
+from __future__ import absolute_import\r
 from Common.DataType import *\r
 from Common.Misc import *\r
 from Common.caching import cached_property, cached_class_function\r
@@ -20,6 +21,44 @@ from .MetaFileParser import *
 from collections import OrderedDict\r
 from Workspace.BuildClassObject import ModuleBuildClassObject, LibraryClassObject, PcdClassObject\r
 \r
+## Get Protocol value from given packages\r
+#\r
+#   @param      CName           The CName of the GUID\r
+#   @param      PackageList     List of packages looking-up in\r
+#   @param      Inffile         The driver file\r
+#\r
+#   @retval     GuidValue   if the CName is found in any given package\r
+#   @retval     None        if the CName is not found in all given packages\r
+#\r
+def _ProtocolValue(CName, PackageList, Inffile = None):\r
+    for P in PackageList:\r
+        ProtocolKeys = list(P.Protocols.keys())\r
+        if Inffile and P._PrivateProtocols:\r
+            if not Inffile.startswith(P.MetaFile.Dir):\r
+                ProtocolKeys = [x for x in P.Protocols if x not in P._PrivateProtocols]\r
+        if CName in ProtocolKeys:\r
+            return P.Protocols[CName]\r
+    return None\r
+\r
+## Get PPI value from given packages\r
+#\r
+#   @param      CName           The CName of the GUID\r
+#   @param      PackageList     List of packages looking-up in\r
+#   @param      Inffile         The driver file\r
+#\r
+#   @retval     GuidValue   if the CName is found in any given package\r
+#   @retval     None        if the CName is not found in all given packages\r
+#\r
+def _PpiValue(CName, PackageList, Inffile = None):\r
+    for P in PackageList:\r
+        PpiKeys = list(P.Ppis.keys())\r
+        if Inffile and P._PrivatePpis:\r
+            if not Inffile.startswith(P.MetaFile.Dir):\r
+                PpiKeys = [x for x in P.Ppis if x not in P._PrivatePpis]\r
+        if CName in PpiKeys:\r
+            return P.Ppis[CName]\r
+    return None\r
+\r
 ## Module build information from INF file\r
 #\r
 #  This class is used to retrieve information stored in database and convert them\r
@@ -144,10 +183,6 @@ class InfBuildData(ModuleBuildClassObject):
     @cached_property\r
     def _Macros(self):\r
         RetVal = {}\r
-        # EDK_GLOBAL defined macros can be applied to EDK module\r
-        if self.AutoGenVersion < 0x00010005:\r
-            RetVal.update(GlobalData.gEdkGlobal)\r
-            RetVal.update(GlobalData.gGlobalDefines)\r
         return RetVal\r
 \r
     ## Get architecture\r
@@ -245,106 +280,50 @@ class InfBuildData(ModuleBuildClassObject):
         #\r
         # Retrieve information in sections specific to Edk.x modules\r
         #\r
-        if self.AutoGenVersion >= 0x00010005:\r
-            if not self._ModuleType:\r
-                EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE,\r
-                                "MODULE_TYPE is not given", File=self.MetaFile)\r
-            if self._ModuleType not in SUP_MODULE_LIST:\r
-                RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
-                for Record in RecordList:\r
-                    Name = Record[1]\r
-                    if Name == "MODULE_TYPE":\r
-                        LineNo = Record[6]\r
-                        break\r
-                EdkLogger.error("build", FORMAT_NOT_SUPPORTED,\r
-                                "MODULE_TYPE %s is not supported for EDK II, valid values are:\n %s" % (self._ModuleType, ' '.join(l for l in SUP_MODULE_LIST)),\r
-                                File=self.MetaFile, Line=LineNo)\r
-            if (self._Specification is None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x0001000A):\r
-                if self._ModuleType == SUP_MODULE_SMM_CORE:\r
-                    EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.MetaFile)\r
-            if (self._Specification is None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x00010032):\r
-                if self._ModuleType == SUP_MODULE_MM_CORE_STANDALONE:\r
-                    EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_CORE_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
-                if self._ModuleType == SUP_MODULE_MM_STANDALONE:\r
-                    EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
-            if 'PCI_DEVICE_ID' in self._Defs and 'PCI_VENDOR_ID' in self._Defs \\r
-               and 'PCI_CLASS_CODE' in self._Defs and 'PCI_REVISION' in self._Defs:\r
-                self._BuildType = 'UEFI_OPTIONROM'\r
-                if 'PCI_COMPRESS' in self._Defs:\r
-                    if self._Defs['PCI_COMPRESS'] not in ('TRUE', 'FALSE'):\r
-                        EdkLogger.error("build", FORMAT_INVALID, "Expected TRUE/FALSE for PCI_COMPRESS: %s" % self.MetaFile)\r
-\r
-            elif 'UEFI_HII_RESOURCE_SECTION' in self._Defs \\r
-               and self._Defs['UEFI_HII_RESOURCE_SECTION'] == 'TRUE':\r
-                self._BuildType = 'UEFI_HII'\r
-            else:\r
-                self._BuildType = self._ModuleType.upper()\r
-\r
-            if self._DxsFile:\r
-                File = PathClass(NormPath(self._DxsFile), self._ModuleDir, Arch=self._Arch)\r
-                # check the file validation\r
-                ErrorCode, ErrorInfo = File.Validate(".dxs", CaseSensitive=False)\r
-                if ErrorCode != 0:\r
-                    EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,\r
-                                    File=self.MetaFile, Line=LineNo)\r
-                if not self._DependencyFileList:\r
-                    self._DependencyFileList = []\r
-                self._DependencyFileList.append(File)\r
+        if not self._ModuleType:\r
+            EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE,\r
+                            "MODULE_TYPE is not given", File=self.MetaFile)\r
+        if self._ModuleType not in SUP_MODULE_LIST:\r
+            RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
+            for Record in RecordList:\r
+                Name = Record[1]\r
+                if Name == "MODULE_TYPE":\r
+                    LineNo = Record[6]\r
+                    break\r
+            EdkLogger.error("build", FORMAT_NOT_SUPPORTED,\r
+                            "MODULE_TYPE %s is not supported for EDK II, valid values are:\n %s" % (self._ModuleType, ' '.join(l for l in SUP_MODULE_LIST)),\r
+                            File=self.MetaFile, Line=LineNo)\r
+        if (self._Specification is None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x0001000A):\r
+            if self._ModuleType == SUP_MODULE_SMM_CORE:\r
+                EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.MetaFile)\r
+        if (self._Specification is None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x00010032):\r
+            if self._ModuleType == SUP_MODULE_MM_CORE_STANDALONE:\r
+                EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_CORE_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
+            if self._ModuleType == SUP_MODULE_MM_STANDALONE:\r
+                EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
+        if 'PCI_DEVICE_ID' in self._Defs and 'PCI_VENDOR_ID' in self._Defs \\r
+           and 'PCI_CLASS_CODE' in self._Defs and 'PCI_REVISION' in self._Defs:\r
+            self._BuildType = 'UEFI_OPTIONROM'\r
+            if 'PCI_COMPRESS' in self._Defs:\r
+                if self._Defs['PCI_COMPRESS'] not in ('TRUE', 'FALSE'):\r
+                    EdkLogger.error("build", FORMAT_INVALID, "Expected TRUE/FALSE for PCI_COMPRESS: %s" % self.MetaFile)\r
+\r
+        elif 'UEFI_HII_RESOURCE_SECTION' in self._Defs \\r
+           and self._Defs['UEFI_HII_RESOURCE_SECTION'] == 'TRUE':\r
+            self._BuildType = 'UEFI_HII'\r
         else:\r
-            if not self._ComponentType:\r
-                EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE,\r
-                                "COMPONENT_TYPE is not given", File=self.MetaFile)\r
-            self._BuildType = self._ComponentType.upper()\r
-            if self._ComponentType in COMPONENT_TO_MODULE_MAP_DICT:\r
-                self._ModuleType = COMPONENT_TO_MODULE_MAP_DICT[self._ComponentType]\r
-            if self._ComponentType == EDK_COMPONENT_TYPE_LIBRARY:\r
-                self._LibraryClass = [LibraryClassObject(self._BaseName, SUP_MODULE_LIST)]\r
-            # make use some [nmake] section macros\r
-            Macros = self._Macros\r
-            Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
-            Macros['PROCESSOR'] = self._Arch\r
-            RecordList = self._RawData[MODEL_META_DATA_NMAKE, self._Arch, self._Platform]\r
-            for Name, Value, Dummy, Arch, Platform, ID, LineNo in RecordList:\r
-                Value = ReplaceMacro(Value, Macros, True)\r
-                if Name == "IMAGE_ENTRY_POINT":\r
-                    if self._ModuleEntryPointList is None:\r
-                        self._ModuleEntryPointList = []\r
-                    self._ModuleEntryPointList.append(Value)\r
-                elif Name == "DPX_SOURCE":\r
-                    File = PathClass(NormPath(Value), self._ModuleDir, Arch=self._Arch)\r
-                    # check the file validation\r
-                    ErrorCode, ErrorInfo = File.Validate(".dxs", CaseSensitive=False)\r
-                    if ErrorCode != 0:\r
-                        EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,\r
-                                        File=self.MetaFile, Line=LineNo)\r
-                    if not self._DependencyFileList:\r
-                        self._DependencyFileList = []\r
-                    self._DependencyFileList.append(File)\r
-                else:\r
-                    ToolList = self._NMAKE_FLAG_PATTERN_.findall(Name)\r
-                    if len(ToolList) == 1:\r
-                        if self._BuildOptions is None:\r
-                            self._BuildOptions = OrderedDict()\r
+            self._BuildType = self._ModuleType.upper()\r
 \r
-                        if ToolList[0] in self._TOOL_CODE_:\r
-                            Tool = self._TOOL_CODE_[ToolList[0]]\r
-                        else:\r
-                            Tool = ToolList[0]\r
-                        ToolChain = "*_*_*_%s_FLAGS" % Tool\r
-                        # Edk.x only support MSFT tool chain\r
-                        # ignore not replaced macros in value\r
-                        ValueList = GetSplitList(' ' + Value, '/D')\r
-                        Dummy = ValueList[0]\r
-                        for Index in range(1, len(ValueList)):\r
-                            if ValueList[Index][-1] == '=' or ValueList[Index] == '':\r
-                                continue\r
-                            Dummy = Dummy + ' /D ' + ValueList[Index]\r
-                        Value = Dummy.strip()\r
-                        if (TAB_COMPILER_MSFT, ToolChain) not in self._BuildOptions:\r
-                            self._BuildOptions[TAB_COMPILER_MSFT, ToolChain] = Value\r
-                        else:\r
-                            OptionString = self._BuildOptions[TAB_COMPILER_MSFT, ToolChain]\r
-                            self._BuildOptions[TAB_COMPILER_MSFT, ToolChain] = OptionString + " " + Value\r
+        if self._DxsFile:\r
+            File = PathClass(NormPath(self._DxsFile), self._ModuleDir, Arch=self._Arch)\r
+            # check the file validation\r
+            ErrorCode, ErrorInfo = File.Validate(".dxs", CaseSensitive=False)\r
+            if ErrorCode != 0:\r
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,\r
+                                File=self.MetaFile, Line=LineNo)\r
+            if not self._DependencyFileList:\r
+                self._DependencyFileList = []\r
+            self._DependencyFileList.append(File)\r
 \r
     ## Retrieve file version\r
     @cached_property\r
@@ -523,7 +502,6 @@ class InfBuildData(ModuleBuildClassObject):
         RetVal = []\r
         RecordList = self._RawData[MODEL_EFI_BINARY_FILE, self._Arch, self._Platform]\r
         Macros = self._Macros\r
-        Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
         Macros['PROCESSOR'] = self._Arch\r
         for Record in RecordList:\r
             FileType = Record[0]\r
@@ -571,31 +549,13 @@ class InfBuildData(ModuleBuildClassObject):
             ToolChainFamily = Record[1]\r
             TagName = Record[2]\r
             ToolCode = Record[3]\r
-            if self.AutoGenVersion < 0x00010005:\r
-                Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
-                Macros['PROCESSOR'] = self._Arch\r
-                SourceFile = NormPath(Record[0], Macros)\r
-                if SourceFile[0] == os.path.sep:\r
-                    SourceFile = mws.join(GlobalData.gWorkspace, SourceFile[1:])\r
-                # old module source files (Edk)\r
-                File = PathClass(SourceFile, self._ModuleDir, self._SourceOverridePath,\r
-                                 '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
-                # check the file validation\r
-                ErrorCode, ErrorInfo = File.Validate(CaseSensitive=False)\r
-                if ErrorCode != 0:\r
-                    if File.Ext.lower() == '.h':\r
-                        EdkLogger.warn('build', 'Include file not found', ExtraData=ErrorInfo,\r
-                                       File=self.MetaFile, Line=LineNo)\r
-                        continue\r
-                    else:\r
-                        EdkLogger.error('build', ErrorCode, ExtraData=File, File=self.MetaFile, Line=LineNo)\r
-            else:\r
-                File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, '',\r
-                                 '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
-                # check the file validation\r
-                ErrorCode, ErrorInfo = File.Validate()\r
-                if ErrorCode != 0:\r
-                    EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+\r
+            File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, '',\r
+                             '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
+            # check the file validation\r
+            ErrorCode, ErrorInfo = File.Validate()\r
+            if ErrorCode != 0:\r
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
 \r
             RetVal.append(File)\r
         # add any previously found dependency files to the source list\r
@@ -613,7 +573,9 @@ class InfBuildData(ModuleBuildClassObject):
             Instance = Record[1]\r
             if Instance:\r
                 Instance = NormPath(Instance, self._Macros)\r
-            RetVal[Lib] = Instance\r
+                RetVal[Lib] = Instance\r
+            else:\r
+                RetVal[Lib] = None\r
         return RetVal\r
 \r
     ## Retrieve library names (for Edk.x style of modules)\r
@@ -642,7 +604,7 @@ class InfBuildData(ModuleBuildClassObject):
         RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
         for Record in RecordList:\r
             CName = Record[0]\r
-            Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
+            Value = _ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
             if Value is None:\r
                 PackageList = "\n\t".join(str(P) for P in self.Packages)\r
                 EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -666,7 +628,7 @@ class InfBuildData(ModuleBuildClassObject):
         RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
         for Record in RecordList:\r
             CName = Record[0]\r
-            Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
+            Value = _PpiValue(CName, self.Packages, self.MetaFile.Path)\r
             if Value is None:\r
                 PackageList = "\n\t".join(str(P) for P in self.Packages)\r
                 EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -712,47 +674,14 @@ class InfBuildData(ModuleBuildClassObject):
         Macros['PROCESSOR'] = GlobalData.gEdkGlobal.get('PROCESSOR', self._Arch)\r
         RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch, self._Platform]\r
         for Record in RecordList:\r
-            if Record[0].find('EDK_SOURCE') > -1:\r
-                Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
-                File = NormPath(Record[0], self._Macros)\r
-                if File[0] == '.':\r
-                    File = os.path.join(self._ModuleDir, File)\r
-                else:\r
-                    File = os.path.join(GlobalData.gWorkspace, File)\r
-                File = RealPath(os.path.normpath(File))\r
-                if File:\r
-                    RetVal.append(File)\r
-\r
-                # TRICK: let compiler to choose correct header file\r
-                Macros['EDK_SOURCE'] = GlobalData.gEdkSource\r
-                File = NormPath(Record[0], self._Macros)\r
-                if File[0] == '.':\r
-                    File = os.path.join(self._ModuleDir, File)\r
-                else:\r
-                    File = os.path.join(GlobalData.gWorkspace, File)\r
-                File = RealPath(os.path.normpath(File))\r
-                if File:\r
-                    RetVal.append(File)\r
+            File = NormPath(Record[0], Macros)\r
+            if File[0] == '.':\r
+                File = os.path.join(self._ModuleDir, File)\r
             else:\r
-                File = NormPath(Record[0], Macros)\r
-                if File[0] == '.':\r
-                    File = os.path.join(self._ModuleDir, File)\r
-                else:\r
-                    File = mws.join(GlobalData.gWorkspace, File)\r
-                File = RealPath(os.path.normpath(File))\r
-                if File:\r
-                    RetVal.append(File)\r
-                if not File and Record[0].find('EFI_SOURCE') > -1:\r
-                    # tricky to regard WorkSpace as EFI_SOURCE\r
-                    Macros['EFI_SOURCE'] = GlobalData.gWorkspace\r
-                    File = NormPath(Record[0], Macros)\r
-                    if File[0] == '.':\r
-                        File = os.path.join(self._ModuleDir, File)\r
-                    else:\r
-                        File = os.path.join(GlobalData.gWorkspace, File)\r
-                    File = RealPath(os.path.normpath(File))\r
-                    if File:\r
-                        RetVal.append(File)\r
+                File = mws.join(GlobalData.gWorkspace, File)\r
+            File = RealPath(os.path.normpath(File))\r
+            if File:\r
+                RetVal.append(File)\r
         return RetVal\r
 \r
     ## Retrieve packages this module depends on\r
@@ -761,7 +690,6 @@ class InfBuildData(ModuleBuildClassObject):
         RetVal = []\r
         RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch, self._Platform]\r
         Macros = self._Macros\r
-        Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
         for Record in RecordList:\r
             File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             # check the file validation\r
@@ -791,6 +719,15 @@ class InfBuildData(ModuleBuildClassObject):
         RetVal.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
         return RetVal\r
 \r
+    @cached_property\r
+    def PcdsName(self):\r
+        PcdsName = set()\r
+        for Type in (MODEL_PCD_FIXED_AT_BUILD,MODEL_PCD_PATCHABLE_IN_MODULE,MODEL_PCD_FEATURE_FLAG,MODEL_PCD_DYNAMIC,MODEL_PCD_DYNAMIC_EX):\r
+            RecordList = self._RawData[Type, self._Arch, self._Platform]\r
+            for TokenSpaceGuid, PcdCName, _, _, _, _, _ in RecordList:\r
+                PcdsName.add((PcdCName, TokenSpaceGuid))\r
+        return PcdsName\r
+\r
     ## Retrieve build options specific to this module\r
     @cached_property\r
     def BuildOptions(self):\r
@@ -863,9 +800,9 @@ class InfBuildData(ModuleBuildClassObject):
                         Value = Token\r
                     else:\r
                         # get the GUID value now\r
-                        Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
+                        Value = _ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
                         if Value is None:\r
-                            Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
+                            Value = _PpiValue(Token, self.Packages, self.MetaFile.Path)\r
                             if Value is None:\r
                                 Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
 \r