Re: [edk2] [PATCH] BaseTools: Fix build argument --pcd for flexible format bugs

2018-02-06 Thread Zhu, Yonghong
Reviewed-by: Yonghong Zhu  

Best Regards,
Zhu Yonghong


-Original Message-
From: Feng, YunhuaX 
Sent: Monday, February 05, 2018 11:43 AM
To: edk2-devel@lists.01.org
Cc: Zhu, Yonghong ; Gao, Liming 
Subject: [PATCH] BaseTools: Fix build argument --pcd for flexible format bugs

Build argument --pcd flexible format, like as:
1. VOID* type
gTokenSpaceGuid.Test=H"{flexible format}"
gTokenSpaceGuid.Test=L"string"
gTokenSpaceGuid.Test="string"
gTokenSpaceGuid.Test=L'string'
gTokenSpaceGuid.Test='string'
2. UINT8/UINT16/UINT32/UINT64 type
gTokenSpaceGuid.Test=H"{flexible format}"
gTokenSpaceGuid.Test=L"string"
gTokenSpaceGuid.Test="string"
gTokenSpaceGuid.Test=L'string'
gTokenSpaceGuid.Test='string'

In linux, single quotes need escape
gTokenSpaceGuid.Test=L\'string\'
gTokenSpaceGuid.Test=\'string\'

Cc: Liming Gao 
Cc: Yonghong Zhu 
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng 
---
 BaseTools/Source/Python/AutoGen/GenMake.py|  2 +
 BaseTools/Source/Python/Common/Misc.py|  4 +-
 BaseTools/Source/Python/Workspace/DscBuildData.py | 73 +--
 3 files changed, 72 insertions(+), 7 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py 
b/BaseTools/Source/Python/AutoGen/GenMake.py
index 7d3374a493..9df5d8e2d7 100644
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -1554,6 +1554,8 @@ class TopLevelMakefile(BuildFile):
 if pcdValue.startswith('H'):
 pcdValue = 'H' + '"' + pcdValue[1:] + '"'
 ExtraOption += " --pcd " + pcdName + '=' + pcdValue
+elif pcdValue.startswith("L'"):
+ExtraOption += "--pcd " + pcdName + '=' + 
+ pcdValue
 elif pcdValue.startswith('L'):
 pcdValue = 'L' + '"' + pcdValue[1:] + '"'
 ExtraOption += " --pcd " + pcdName + '=' + pcdValue 
diff --git a/BaseTools/Source/Python/Common/Misc.py 
b/BaseTools/Source/Python/Common/Misc.py
index d80f645d2e..b8c2ce1ddc 100644
--- a/BaseTools/Source/Python/Common/Misc.py
+++ b/BaseTools/Source/Python/Common/Misc.py
@@ -2353,10 +2353,10 @@ def PackRegistryFormatGuid(Guid):
 
 def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, 
Value):
 if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, 
TAB_UINT64,'BOOLEAN']:
-if Value.startswith('L'):
+if Value.startswith('L') or Value.startswith('"'):
 if not Value[1]:
 EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, 
when specify the Value in the command line, please use the following format: 
"string", L"string", H"{...}"')
-Value = Value[0] + '"' + Value[1:] + '"'
+Value = Value
 elif Value.startswith('H'):
 if not Value[1]:
 EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, 
when specify the Value in the command line, please use the following format: 
"string", L"string", H"{...}"') diff --git 
a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 1da4f03ab8..d9165f2ac7 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -999,10 +999,39 @@ class DscBuildData(PlatformBuildClassObject):
 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
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %
+(TokenSpaceGuidCName, 
TokenCName, pcdvalue, Value))
+if PcdDatumType == "VOID*":
+pcdvalue = 'H' + pcdvalue
+elif pcdvalue.startswith("L'"):
+try:
+pcdvalue = ValueExpressionEx(pcdvalue, 
PcdDatumType, self._GuidDict)(True)
+except BadExpression, Value:
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %
+(TokenSpaceGuidCName, 
TokenCName, pcdvalue, Value))
+if pcdvalue.startswith('{'):
+

[edk2] [PATCH] BaseTools: Fix build argument --pcd for flexible format bugs

2018-02-04 Thread Feng, YunhuaX
Build argument --pcd flexible format, like as:
1. VOID* type
gTokenSpaceGuid.Test=H"{flexible format}"
gTokenSpaceGuid.Test=L"string"
gTokenSpaceGuid.Test="string"
gTokenSpaceGuid.Test=L'string'
gTokenSpaceGuid.Test='string'
2. UINT8/UINT16/UINT32/UINT64 type
gTokenSpaceGuid.Test=H"{flexible format}"
gTokenSpaceGuid.Test=L"string"
gTokenSpaceGuid.Test="string"
gTokenSpaceGuid.Test=L'string'
gTokenSpaceGuid.Test='string'

In linux, single quotes need escape
gTokenSpaceGuid.Test=L\'string\'
gTokenSpaceGuid.Test=\'string\'

Cc: Liming Gao 
Cc: Yonghong Zhu 
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng 
---
 BaseTools/Source/Python/AutoGen/GenMake.py|  2 +
 BaseTools/Source/Python/Common/Misc.py|  4 +-
 BaseTools/Source/Python/Workspace/DscBuildData.py | 73 +--
 3 files changed, 72 insertions(+), 7 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py 
b/BaseTools/Source/Python/AutoGen/GenMake.py
index 7d3374a493..9df5d8e2d7 100644
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -1554,6 +1554,8 @@ class TopLevelMakefile(BuildFile):
 if pcdValue.startswith('H'):
 pcdValue = 'H' + '"' + pcdValue[1:] + '"'
 ExtraOption += " --pcd " + pcdName + '=' + pcdValue
+elif pcdValue.startswith("L'"):
+ExtraOption += "--pcd " + pcdName + '=' + pcdValue
 elif pcdValue.startswith('L'):
 pcdValue = 'L' + '"' + pcdValue[1:] + '"'
 ExtraOption += " --pcd " + pcdName + '=' + pcdValue
diff --git a/BaseTools/Source/Python/Common/Misc.py 
b/BaseTools/Source/Python/Common/Misc.py
index d80f645d2e..b8c2ce1ddc 100644
--- a/BaseTools/Source/Python/Common/Misc.py
+++ b/BaseTools/Source/Python/Common/Misc.py
@@ -2353,10 +2353,10 @@ def PackRegistryFormatGuid(Guid):
 
 def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, 
Value):
 if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, 
TAB_UINT64,'BOOLEAN']:
-if Value.startswith('L'):
+if Value.startswith('L') or Value.startswith('"'):
 if not Value[1]:
 EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, 
when specify the Value in the command line, please use the following format: 
"string", L"string", H"{...}"')
-Value = Value[0] + '"' + Value[1:] + '"'
+Value = Value
 elif Value.startswith('H'):
 if not Value[1]:
 EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, 
when specify the Value in the command line, please use the following format: 
"string", L"string", H"{...}"')
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 1da4f03ab8..d9165f2ac7 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -999,10 +999,39 @@ class DscBuildData(PlatformBuildClassObject):
 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
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %
+(TokenSpaceGuidCName, 
TokenCName, pcdvalue, Value))
+if PcdDatumType == "VOID*":
+pcdvalue = 'H' + pcdvalue
+elif pcdvalue.startswith("L'"):
+try:
+pcdvalue = ValueExpressionEx(pcdvalue, 
PcdDatumType, self._GuidDict)(True)
+except BadExpression, Value:
+EdkLogger.error('Parser', 
FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %
+(TokenSpaceGuidCName, 
TokenCName, pcdvalue, Value))
+if pcdvalue.startswith('{'):
+pcdvalue = 'H' + pcdvalue
+elif pcdvalue.startswith("'"):
+try:
+pcdvalue = ValueExpressionEx(pcdvalue, 
PcdDatumType, self._GuidDict)(True)
+