[edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section

Yonghong Zhu posted 1 patch 5 years, 9 months ago
Failed in applying to current master (apply log)
There is a newer version of this series
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(-)
[edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Posted by Yonghong Zhu 5 years, 9 months ago
From: Yunhua Feng <yunhuax.feng@intel.com>

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 <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
---
 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
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Posted by Gao, Liming 5 years, 9 months ago
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:edk2-devel-bounces@lists.01.org] On Behalf Of
>Yonghong Zhu
>Sent: Thursday, July 05, 2018 3:28 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>
>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in
>the [DEPEX] section
>
>From: Yunhua Feng <yunhuax.feng@intel.com>
>
>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 <liming.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>---
> 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
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Posted by Zhu, Yonghong 5 years, 9 months ago
In  GetGuidValue() function it already have this logic to handle it.

Best Regards,
Zhu Yonghong


-----Original Message-----
From: Gao, Liming 
Sent: Friday, July 06, 2018 9:55 AM
To: Zhu, Yonghong <yonghong.zhu@intel.com>; edk2-devel@lists.01.org
Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section

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:edk2-devel-bounces@lists.01.org] On Behalf Of 
>Yonghong Zhu
>Sent: Thursday, July 05, 2018 3:28 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>
>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD 
>use in the [DEPEX] section
>
>From: Yunhua Feng <yunhuax.feng@intel.com>
>
>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 <liming.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>---
> 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
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Posted by Gao, Liming 5 years, 9 months ago
Yes. It is too late. The error message says the byte value is wrong. But, it doesn't mention which PCD is wrong.  

>-----Original Message-----
>From: Zhu, Yonghong
>Sent: Friday, July 06, 2018 9:58 AM
>To: Gao, Liming <liming.gao@intel.com>; edk2-devel@lists.01.org
>Cc: Zhu, Yonghong <yonghong.zhu@intel.com>
>Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>use in the [DEPEX] section
>
>In  GetGuidValue() function it already have this logic to handle it.
>
>Best Regards,
>Zhu Yonghong
>
>
>-----Original Message-----
>From: Gao, Liming
>Sent: Friday, July 06, 2018 9:55 AM
>To: Zhu, Yonghong <yonghong.zhu@intel.com>; edk2-devel@lists.01.org
>Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>use in the [DEPEX] section
>
>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:edk2-devel-bounces@lists.01.org] On Behalf Of
>>Yonghong Zhu
>>Sent: Thursday, July 05, 2018 3:28 PM
>>To: edk2-devel@lists.01.org
>>Cc: Gao, Liming <liming.gao@intel.com>
>>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>>use in the [DEPEX] section
>>
>>From: Yunhua Feng <yunhuax.feng@intel.com>
>>
>>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 <liming.gao@intel.com>
>>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>>Contributed-under: TianoCore Contribution Agreement 1.1
>>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>>---
>> 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
>>edk2-devel@lists.01.org
>>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel