Re: [edk2] [Patch] BaseTools: Support PCD flexible values format

2017-12-26 Thread Gao, Liming
Reviewed-by: Liming Gao <liming@intel.com>

>-Original Message-
>From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
>Yonghong Zhu
>Sent: Wednesday, December 27, 2017 1:24 PM
>To: edk2-devel@lists.01.org
>Cc: Feng, YunhuaX <yunhuax.f...@intel.com>
>Subject: [edk2] [Patch] BaseTools: Support PCD flexible values format
>
>https://bugzilla.tianocore.org/show_bug.cgi?id=541
>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.f...@intel.com>
>Signed-off-by: Yonghong Zhu <yonghong@intel.com>
>---
> BaseTools/Source/Python/AutoGen/AutoGen.py |  39 
> BaseTools/Source/Python/AutoGen/GenC.py|   2 +
> BaseTools/Source/Python/Common/Expression.py   | 246
>-
> BaseTools/Source/Python/Common/Misc.py | 203 +
> BaseTools/Source/Python/Workspace/DscBuildData.py  |  16 +-
> BaseTools/Source/Python/Workspace/InfBuildData.py  |   7 +
> .../Source/Python/Workspace/MetaFileParser.py  |  17 +-
> .../Source/Python/Workspace/WorkspaceCommon.py |   8 +-
> BaseTools/Source/Python/build/BuildReport.py   |   6 +
> 9 files changed, 430 insertions(+), 114 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>index cacd009..8be5bfc 100644
>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>@@ -269,10 +269,11 @@ class WorkspaceAutoGen(AutoGen):
> self.AutoGenObjectList = []
> self._BuildDir  = None
> self._FvDir = None
> self._MakeFileDir   = None
> self._BuildCommand  = None
>+self._GuidDict = {}
>
> # there's many relative directory operations, so ...
> os.chdir(self.WorkspaceDir)
>
> #
>@@ -417,24 +418,42 @@ class WorkspaceAutoGen(AutoGen):
> TokenSpaceGuidCNameList = []
> FoundFlag = False
> PcdDatumType = ''
> NewValue = ''
> for package in PGen.PackageList:
>+Guids = package.Guids
>+self._GuidDict.update(Guids)
>+for package in PGen.PackageList:
> for key in package.Pcds:
> PcdItem = package.Pcds[key]
> if HasTokenSpace:
> if (PcdItem.TokenCName, 
> PcdItem.TokenSpaceGuidCName)
>== (TokenCName, TokenSpaceGuidCName):
> PcdDatumType = PcdItem.DatumType
>+if pcdvalue.startswith('H'):
>+try:
>+pcdvalue = 
>ValueExpressionEx(pcdvalue[1:],
>PcdDatumType, self._GuidDict)(True)
>+except BadExpression, Value:
>+if Value.result > 1:
>+EdkLogger.error('Parser', 
>FORMAT_INVALID, 'PCD
>[%s.%s] Value "%s",  %s' %
>+
>(TokenSpaceGuidCName, TokenCName,
>pcdvalue, Value))
>+pcdvalue = 'H' + pcdvalue
> NewValue =
>BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, pcdvalue)
> FoundFlag = True
> else:
> if PcdItem.TokenCName == TokenCName:
> if not PcdItem.TokenSpaceGuidCName in
>TokenSpaceGuidCNameList:
> if len (TokenSpaceGuidCNameList) < 1:
>
>TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)
> PcdDatumType = PcdItem.DatumType
> TokenSpaceGuidCName =
>PcdItem.TokenSpaceGuidCName
>+if pcdvalue.startswith('H'):
>+try:
>+pcdvalue = 
>ValueExpressionEx(pcdvalue[1:],
>PcdDatumType, self._GuidDict)(True)
>+except BadExpression, Value:
>+EdkLogger.error('Parser', 
>FORMAT_INVALID, 'PCD
>[%s.%s] Value "%s", %s' %
>+
>(TokenSpaceGuidCName, TokenCName,
&g

[edk2] [Patch] BaseTools: Support PCD flexible values format

2017-12-26 Thread Yonghong Zhu
https://bugzilla.tianocore.org/show_bug.cgi?id=541

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng 
Signed-off-by: Yonghong Zhu 
---
 BaseTools/Source/Python/AutoGen/AutoGen.py |  39 
 BaseTools/Source/Python/AutoGen/GenC.py|   2 +
 BaseTools/Source/Python/Common/Expression.py   | 246 -
 BaseTools/Source/Python/Common/Misc.py | 203 +
 BaseTools/Source/Python/Workspace/DscBuildData.py  |  16 +-
 BaseTools/Source/Python/Workspace/InfBuildData.py  |   7 +
 .../Source/Python/Workspace/MetaFileParser.py  |  17 +-
 .../Source/Python/Workspace/WorkspaceCommon.py |   8 +-
 BaseTools/Source/Python/build/BuildReport.py   |   6 +
 9 files changed, 430 insertions(+), 114 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py 
b/BaseTools/Source/Python/AutoGen/AutoGen.py
index cacd009..8be5bfc 100644
--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
@@ -269,10 +269,11 @@ class WorkspaceAutoGen(AutoGen):
 self.AutoGenObjectList = []
 self._BuildDir  = None
 self._FvDir = None
 self._MakeFileDir   = None
 self._BuildCommand  = None
+self._GuidDict = {}
 
 # there's many relative directory operations, so ...
 os.chdir(self.WorkspaceDir)
 
 #
@@ -417,24 +418,42 @@ class WorkspaceAutoGen(AutoGen):
 TokenSpaceGuidCNameList = []
 FoundFlag = False
 PcdDatumType = ''
 NewValue = ''
 for package in PGen.PackageList:
+Guids = package.Guids
+self._GuidDict.update(Guids)
+for package in PGen.PackageList:
 for key in package.Pcds:
 PcdItem = package.Pcds[key]
 if HasTokenSpace:
 if (PcdItem.TokenCName, 
PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):
 PcdDatumType = PcdItem.DatumType
+if pcdvalue.startswith('H'):
+try:
+pcdvalue = 
ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)
+except BadExpression, Value:
+if Value.result > 1:
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %
+
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
+pcdvalue = 'H' + pcdvalue
 NewValue = 
BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, 
pcdvalue)
 FoundFlag = True
 else:
 if PcdItem.TokenCName == TokenCName:
 if not PcdItem.TokenSpaceGuidCName in 
TokenSpaceGuidCNameList:
 if len (TokenSpaceGuidCNameList) < 1:
 
TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)
 PcdDatumType = PcdItem.DatumType
 TokenSpaceGuidCName = 
PcdItem.TokenSpaceGuidCName
+if pcdvalue.startswith('H'):
+try:
+pcdvalue = 
ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)
+except BadExpression, Value:
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
+
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
+pcdvalue = 'H' + pcdvalue
 NewValue = 
BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, 
pcdvalue)
 FoundFlag = True
 else:
 EdkLogger.error(
 'build',
@@ -2444,10 +2463,30 @@ class PlatformAutoGen(AutoGen):
 ToPcd.MaxDatumSize = FromPcd.MaxDatumSize
 if FromPcd.DatumType not in [None, '']:
 ToPcd.DatumType = FromPcd.DatumType
 if FromPcd.SkuInfoList not in [None, '', []]: