]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Fix a bug override Pcd by DSC Components section
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 0da3efbb43e00360f2356e802aca30130232de03..66402c52b7364064d4c83ad1af84a1d49be141b7 100644 (file)
@@ -679,8 +679,9 @@ class DscBuildData(PlatformBuildClassObject):
                 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
                     TokenList = GetSplitValueList(Setting)\r
                     DefaultValue = TokenList[0]\r
-                    if len(TokenList) > 1:\r
-                        MaxDatumSize = TokenList[1]\r
+                    # the format is PcdName| Value | VOID* | MaxDatumSize\r
+                    if len(TokenList) > 2:\r
+                        MaxDatumSize = TokenList[2]\r
                     else:\r
                         MaxDatumSize = ''\r
                     TypeString = self._PCD_TYPE_STRING_[Type]\r
@@ -808,7 +809,7 @@ class DscBuildData(PlatformBuildClassObject):
                 PkgSet.update(ModuleData.Packages)\r
 \r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
-\r
+            self._GuidDict.update(GlobalData.gPlatformPcds)\r
 \r
         if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
             EdkLogger.error('build', PARSER_ERROR,\r
@@ -991,6 +992,8 @@ class DscBuildData(PlatformBuildClassObject):
                     NewValue = self.GetFieldValueFromComm(pcdvalue, TokenSpaceGuidCName, TokenCName, FieldName)\r
                     GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))\r
                 else:\r
+                    # Replace \' to ', \\\' to \'\r
+                    pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
                     for key in self.DecPcds:\r
                         PcdItem = self.DecPcds[key]\r
                         if HasTokenSpace:\r
@@ -1002,7 +1005,7 @@ class DscBuildData(PlatformBuildClassObject):
                                     except BadExpression, Value:\r
                                         EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                                         (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if PcdDatumType == "VOID*":\r
+                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
                                         pcdvalue = 'H' + pcdvalue\r
                                 elif pcdvalue.startswith("L'"):\r
                                     try:\r
@@ -1010,7 +1013,7 @@ class DscBuildData(PlatformBuildClassObject):
                                     except BadExpression, Value:\r
                                         EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                                         (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if pcdvalue.startswith('{'):\r
+                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
                                         pcdvalue = 'H' + pcdvalue\r
                                 elif pcdvalue.startswith("'"):\r
                                     try:\r
@@ -1018,7 +1021,7 @@ class DscBuildData(PlatformBuildClassObject):
                                     except BadExpression, Value:\r
                                         EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                                         (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if pcdvalue.startswith('{'):\r
+                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
                                         pcdvalue = 'H' + pcdvalue\r
                                 elif pcdvalue.startswith('L'):\r
                                     pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
@@ -1031,8 +1034,12 @@ class DscBuildData(PlatformBuildClassObject):
                                     try:\r
                                         pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
                                     except BadExpression, Value:\r
-                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                        try:\r
+                                            pcdvalue = '"' + pcdvalue + '"'\r
+                                            pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                        except BadExpression, Value:\r
+                                            EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                            (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
                                 NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                 FoundFlag = True\r
                         else:\r
@@ -1048,7 +1055,7 @@ class DscBuildData(PlatformBuildClassObject):
                                             except BadExpression, Value:\r
                                                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
                                                                 (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if PcdDatumType == "VOID*":\r
+                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:\r
                                                 pcdvalue = 'H' + pcdvalue\r
                                         elif pcdvalue.startswith("L'"):\r
                                             try:\r
@@ -1057,7 +1064,7 @@ class DscBuildData(PlatformBuildClassObject):
                                             except BadExpression, Value:\r
                                                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                                                 (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if pcdvalue.startswith('{'):\r
+                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
                                                 pcdvalue = 'H' + pcdvalue\r
                                         elif pcdvalue.startswith("'"):\r
                                             try:\r
@@ -1066,7 +1073,7 @@ class DscBuildData(PlatformBuildClassObject):
                                             except BadExpression, Value:\r
                                                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                                                 (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if pcdvalue.startswith('{'):\r
+                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
                                                 pcdvalue = 'H' + pcdvalue\r
                                         elif pcdvalue.startswith('L'):\r
                                             pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
@@ -1080,9 +1087,12 @@ class DscBuildData(PlatformBuildClassObject):
                                             try:\r
                                                 pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
                                             except BadExpression, Value:\r
-                                                EdkLogger.error('Parser', FORMAT_INVALID,\r
-                                                                'PCD [%s.%s] Value "%s",  %s' %\r
-                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                                try:\r
+                                                    pcdvalue = '"' + pcdvalue + '"'\r
+                                                    pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                                except BadExpression, Value:\r
+                                                    EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                                    (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
                                         NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                         FoundFlag = True\r
                                     else:\r
@@ -1944,6 +1954,8 @@ class DscBuildData(PlatformBuildClassObject):
                         message_itmes = Message.split(":")\r
                         Index = 0\r
                         if "PcdValueInit.c" not in Message:\r
+                            if not MessageGroup:\r
+                                MessageGroup.append(Message)\r
                             break\r
                         else:\r
                             for item in message_itmes:\r