Yonghong:
  On error handling, could you check VOID* PCD length to make sure its size is 
16 when it is used in [Depex] section?

Thanks
Liming
>-----Original Message-----
>From: edk2-devel [mailto:[email protected]] On Behalf Of
>Yonghong Zhu
>Sent: Thursday, July 05, 2018 3:28 PM
>To: [email protected]
>Cc: Gao, Liming <[email protected]>
>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in
>the [DEPEX] section
>
>From: Yunhua Feng <[email protected]>
>
>V2: limit the PCD used in the [Depex] section should be used in the module
>
>The PCD item used in INF [Depex] section must be defined as FixedAtBuild
>type and VOID* datum type, and the size of the PCD must be 16 bytes.
>
>Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=443
>Cc: Liming Gao <[email protected]>
>Cc: Yonghong Zhu <[email protected]>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <[email protected]>
>---
> BaseTools/Source/Python/AutoGen/AutoGen.py        | 31
>++++++++++++++++++++---
> BaseTools/Source/Python/AutoGen/GenDepex.py       |  6 +++++
> BaseTools/Source/Python/Workspace/InfBuildData.py | 15 +++++++----
> BaseTools/Source/Python/build/BuildReport.py      |  6 +++++
> 4 files changed, 50 insertions(+), 8 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>index 6d76afd..7d4539e 100644
>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>@@ -2745,10 +2745,14 @@ class ModuleAutoGen(AutoGen):
>         ## Store the FixedAtBuild Pcds
>         #
>         self._FixedAtBuildPcds         = []
>         self.ConstPcd                  = {}
>
>+        ##Store the VOID* type FixedAtBuild Pcds
>+        #
>+        self._FixedPcdVoidTypeDict = {}
>+
>     def __repr__(self):
>         return "%s [%s]" % (self.MetaFile, self.Arch)
>
>     # Get FixedAtBuild Pcds of this Module
>     def _GetFixedAtBuildPcds(self):
>@@ -2758,11 +2762,20 @@ class ModuleAutoGen(AutoGen):
>             if Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
>                 continue
>             if Pcd not in self._FixedAtBuildPcds:
>                 self._FixedAtBuildPcds.append(Pcd)
>
>-        return self._FixedAtBuildPcds
>+        return self._FixedAtBuildPcds
>+
>+    def _GetFixedAtBuildVoidTypePcds(self):
>+        if self._FixedPcdVoidTypeDict:
>+            return self._FixedPcdVoidTypeDict
>+        for Pcd in self.ModulePcdList:
>+            if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType ==
>TAB_VOID:
>+                if '{}.{}'.format(Pcd.TokenSpaceGuidCName, Pcd.TokenCName) not
>in self._FixedPcdVoidTypeDict:
>+
>self._FixedPcdVoidTypeDict['{}.{}'.format(Pcd.TokenSpaceGuidCName,
>Pcd.TokenCName)] = Pcd.DefaultValue
>+        return self._FixedPcdVoidTypeDict
>
>     def _GetUniqueBaseName(self):
>         BaseName = self.Name
>         for Module in self.PlatformInfo.ModuleAutoGenList:
>             if Module.MetaFile == self.MetaFile:
>@@ -3029,11 +3042,11 @@ class ModuleAutoGen(AutoGen):
>             self._DepexDict = {}
>             if self.DxsFile or self.IsLibrary or 
> TAB_DEPENDENCY_EXPRESSION_FILE
>in self.FileTypes:
>                 return self._DepexDict
>
>             self._DepexDict[self.ModuleType] = []
>-
>+            self._GetFixedAtBuildVoidTypePcds()
>             for ModuleType in self._DepexDict:
>                 DepexList = self._DepexDict[ModuleType]
>                 #
>                 # Append depex from dependent libraries, if not "BEFORE", 
> "AFTER"
>expresion
>                 #
>@@ -3041,11 +3054,22 @@ class ModuleAutoGen(AutoGen):
>                     Inherited = False
>                     for D in M.Depex[self.Arch, ModuleType]:
>                         if DepexList != []:
>                             DepexList.append('AND')
>                         DepexList.append('(')
>-                        DepexList.extend(D)
>+                        #replace D with value if D is FixedAtBuild PCD
>+                        NewList = []
>+                        for item in D:
>+                            if '.' not in item:
>+                                NewList.append(item)
>+                            else:
>+                                if item not in self._FixedPcdVoidTypeDict:
>+                                    EdkLogger.error("build", FORMAT_INVALID, 
>"{} used in
>[Depex] section should be used as FixedAtBuild type and VOID* datum type
>in the module.".format(item))
>+                                else:
>+                                    Value = self._FixedPcdVoidTypeDict[item]
>+                                    NewList.append(Value)
>+                        DepexList.extend(NewList)
>                         if DepexList[-1] == 'END':  # no need of a END at 
> this time
>                             DepexList.pop()
>                         DepexList.append(')')
>                         Inherited = True
>                     if Inherited:
>@@ -4409,10 +4433,11 @@ class ModuleAutoGen(AutoGen):
>     BuildOptionIncPathList  = property(_GetBuildOptionIncPathList)
>     BuildCommand            = property(_GetBuildCommand)
>
>     FixedAtBuildPcds         = property(_GetFixedAtBuildPcds)
>     UniqueBaseName          = property(_GetUniqueBaseName)
>+    FixedVoidTypePcds       = property(_GetFixedAtBuildVoidTypePcds)
>
> # This acts like the main() function for the script, unless it is 'import'ed 
> into
>another script.
> if __name__ == '__main__':
>     pass
>
>diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py
>b/BaseTools/Source/Python/AutoGen/GenDepex.py
>index d3b1eae..c12b613 100644
>--- a/BaseTools/Source/Python/AutoGen/GenDepex.py
>+++ b/BaseTools/Source/Python/AutoGen/GenDepex.py
>@@ -20,10 +20,12 @@ from Common.LongFilePathSupport import
>OpenLongFilePath as open
> from io import BytesIO
> from struct import pack
> from Common.BuildToolError import *
> from Common.Misc import SaveFileOnChange
> from Common.Misc import GuidStructureStringToGuidString
>+from Common.Misc import GuidStructureByteArrayToGuidString
>+from Common.Misc import GuidStringToGuidStructureString
> from Common import EdkLogger as EdkLogger
> from Common.BuildVersion import gBUILD_VERSION
> from Common.DataType import *
>
> ## Regular expression for matching "DEPENDENCY_START ...
>DEPENDENCY_END"
>@@ -331,10 +333,14 @@ class DependencyExpression:
>     #   @retval array   The byte array representing the GUID value
>     #
>     def GetGuidValue(self, Guid):
>         GuidValueString = Guid.replace("{", "").replace("}", "").replace(" ", 
> "")
>         GuidValueList = GuidValueString.split(",")
>+        if len(GuidValueList) != 11 and len(GuidValueList) == 16:
>+            GuidValueString =
>GuidStringToGuidStructureString(GuidStructureByteArrayToGuidString(Guid))
>+            GuidValueString = GuidValueString.replace("{", "").replace("}",
>"").replace(" ", "")
>+            GuidValueList = GuidValueString.split(",")
>         if len(GuidValueList) != 11:
>             EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid GUID value
>string or opcode: %s" % Guid)
>         return pack("1I2H8B", *(int(value, 16) for value in GuidValueList))
>
>     ## Save the binary form of dependency expression in file
>diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py
>b/BaseTools/Source/Python/Workspace/InfBuildData.py
>index 165e03f..efb3de1 100644
>--- a/BaseTools/Source/Python/Workspace/InfBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
>@@ -909,16 +909,21 @@ class InfBuildData(ModuleBuildClassObject):
>                         if Module is None:
>                             EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, 
> "Module
>is not found in active platform",
>                                             ExtraData=Token, 
> File=self.MetaFile, Line=Record[-1])
>                         DepexList.append(Module.Guid)
>                     else:
>-                        # get the GUID value now
>-                        Value = ProtocolValue(Token, self.Packages, 
>self.MetaFile.Path)
>-                        if Value is None:
>-                            Value = PpiValue(Token, self.Packages, 
>self.MetaFile.Path)
>+                        # it use the Fixed PCD format
>+                        if '.' in Token:
>+                            Value = Token
>+                        else:
>+                            # get the GUID value now
>+                            Value = ProtocolValue(Token, self.Packages,
>self.MetaFile.Path)
>                             if Value is None:
>-                                Value = GuidValue(Token, self.Packages, 
>self.MetaFile.Path)
>+                                Value = PpiValue(Token, self.Packages, 
>self.MetaFile.Path)
>+                                if Value is None:
>+                                    Value = GuidValue(Token, self.Packages,
>self.MetaFile.Path)
>+
>                         if Value is None:
>                             PackageList = "\n\t".join(str(P) for P in 
> self.Packages)
>                             EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,
>                                             "Value of [%s] is not found in" % 
> Token,
>                                             ExtraData=PackageList, 
> File=self.MetaFile,
>Line=Record[-1])
>diff --git a/BaseTools/Source/Python/build/BuildReport.py
>b/BaseTools/Source/Python/build/BuildReport.py
>index 897167c..0dbbba0 100644
>--- a/BaseTools/Source/Python/build/BuildReport.py
>+++ b/BaseTools/Source/Python/build/BuildReport.py
>@@ -278,10 +278,16 @@ class DepexParser(object):
>                     GuidValue = 
> GuidStructureStringToGuidString(Package.Ppis[Ppi])
>                     self._GuidDb[GuidValue.upper()] = Ppi
>                 for Guid in Package.Guids:
>                     GuidValue = 
> GuidStructureStringToGuidString(Package.Guids[Guid])
>                     self._GuidDb[GuidValue.upper()] = Guid
>+            for Ma in Pa.ModuleAutoGenList:
>+                for Pcd in Ma.FixedVoidTypePcds:
>+                    PcdValue = Ma.FixedVoidTypePcds[Pcd]
>+                    if len(PcdValue.split(',')) == 16:
>+                        GuidValue = 
>GuidStructureByteArrayToGuidString(PcdValue)
>+                        self._GuidDb[GuidValue.upper()] = Pcd
>
>     ##
>     # Parse the binary dependency expression files.
>     #
>     # This function parses the binary dependency expression file and translate
>it
>--
>2.6.1.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>[email protected]
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to