diff options
author | Feng, YunhuaX </o=Intel/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=Feng, YunhuaX4e1> | 2018-02-26 16:42:30 +0800 |
---|---|---|
committer | Yonghong Zhu <yonghong.zhu@intel.com> | 2018-02-28 08:47:11 +0800 |
commit | ea927d2f3f2e34f4b26c10829f5887830cb0720e (patch) | |
tree | c7c28de62b6414ad06a61952dcd7f904407995fb /BaseTools/Source/Python/Workspace | |
parent | f0c69b614cf56df1e7908574111d92864ca3ee9c (diff) | |
download | edk2-ea927d2f3f2e34f4b26c10829f5887830cb0720e.tar.gz edk2-ea927d2f3f2e34f4b26c10829f5887830cb0720e.tar.bz2 edk2-ea927d2f3f2e34f4b26c10829f5887830cb0720e.zip |
BaseTools: Fix flexible PCD single quote and double quote bugs
1.The " and ' inside the string, must use escape character format
(\", \')
2.'string' and L'string' format in --pcd, it must be double quoted
first.
Some examples that to match --pcd format and DSC format
--pcd DSC format
L"ABC" L"ABC"
"AB\\\"C" "AB\"C"
"AB\\\'C" "AB\'C"
L"\'AB\\\"C\'" L'AB\"C'
"\'AB\\\'C\'" 'AB\'C'
H"{0, L\"AB\\\"B\", \'ab\\\"c\'}" {0, L"AB\"B", 'ab\"c'}
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>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
Diffstat (limited to 'BaseTools/Source/Python/Workspace')
-rw-r--r-- | BaseTools/Source/Python/Workspace/DscBuildData.py | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index f90da8e501..ea8d1847f7 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -991,6 +991,8 @@ class DscBuildData(PlatformBuildClassObject): NewValue = self.GetFieldValueFromComm(pcdvalue, TokenSpaceGuidCName, TokenCName, FieldName)
GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))
else:
+ # Replace \' to ', \\\' to \'
+ pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")
for key in self.DecPcds:
PcdItem = self.DecPcds[key]
if HasTokenSpace:
@@ -1002,7 +1004,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if PcdDatumType == "VOID*":
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith("L'"):
try:
@@ -1010,7 +1012,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if pcdvalue.startswith('{'):
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith("'"):
try:
@@ -1018,7 +1020,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if pcdvalue.startswith('{'):
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith('L'):
pcdvalue = 'L"' + pcdvalue[1:] + '"'
@@ -1031,8 +1033,12 @@ class DscBuildData(PlatformBuildClassObject): 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))
+ try:
+ pcdvalue = '"' + pcdvalue + '"'
+ 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))
NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
FoundFlag = True
else:
@@ -1048,7 +1054,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if PcdDatumType == "VOID*":
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith("L'"):
try:
@@ -1057,7 +1063,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if pcdvalue.startswith('{'):
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith("'"):
try:
@@ -1066,7 +1072,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value:
EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %
(TokenSpaceGuidCName, TokenCName, pcdvalue, Value))
- if pcdvalue.startswith('{'):
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:
pcdvalue = 'H' + pcdvalue
elif pcdvalue.startswith('L'):
pcdvalue = 'L"' + pcdvalue[1:] + '"'
@@ -1080,9 +1086,12 @@ class DscBuildData(PlatformBuildClassObject): 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))
+ try:
+ pcdvalue = '"' + pcdvalue + '"'
+ 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))
NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
FoundFlag = True
else:
|