]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Fixed the pcd value override issue.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 01592e147e144fb3ee579967d9d7717b910d9244..007d9b7f151735c9116307634981661095445347 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
@@ -894,11 +895,11 @@ class DscBuildData(PlatformBuildClassObject):
                 if pcd[2] == "":\r
                     pcdset.append((pcd[0],pcd[1],pcd[3]))\r
                 else:\r
-                    pcdobj = self._Pcds.get((pcd[1],pcd[0]))\r
-                    if pcdobj:\r
-                        pcdset.append((pcd[0],pcd[1], pcdobj.DefaultValue))\r
-                    else:\r
-                        pcdset.append((pcd[0],pcd[1],pcd[3]))\r
+                    if (pcd[1],pcd[0]) not in self._Pcds:\r
+                        pcdvalue = pcd[3] if len(pcd) == 4 else pcd[2]\r
+                        pcdset.append((pcd[0],pcd[1],pcdvalue))\r
+                    #else:\r
+                        # remove the settings from command line since it has been handled.\r
         GlobalData.BuildOptionPcd = pcdset\r
     def GetFieldValueFromComm(self,ValueStr,TokenSpaceGuidCName, TokenCName, FieldName):\r
         PredictedFieldType = "VOID*"\r
@@ -990,6 +991,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
@@ -1001,7 +1004,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
@@ -1009,7 +1012,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
@@ -1017,7 +1020,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
@@ -1030,8 +1033,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
@@ -1047,7 +1054,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
@@ -1056,7 +1063,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
@@ -1065,7 +1072,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
@@ -1079,9 +1086,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
@@ -1284,7 +1294,10 @@ class DscBuildData(PlatformBuildClassObject):
                 str_pcd_obj_str.copy(str_pcd_dec)\r
                 if str_pcd_obj:\r
                     str_pcd_obj_str.copy(str_pcd_obj)\r
-                str_pcd_obj_str.DefaultFromDSC = str_pcd_obj_str.DefaultValue\r
+                if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                else:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                 for str_pcd_data in StrPcdSet[str_pcd]:\r
                     if str_pcd_data[3] in SkuIds:\r
                         str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), 'DEFAULT' if str_pcd_data[3] == 'COMMON' else str_pcd_data[3],'STANDARD' if str_pcd_data[4] == 'COMMON' else str_pcd_data[4], self.MetaFile.File,LineNo=str_pcd_data[5])\r
@@ -1302,8 +1315,10 @@ class DscBuildData(PlatformBuildClassObject):
                     str_pcd_obj = Pcds.get(Pcd, None)\r
                     if str_pcd_obj:\r
                         str_pcd_obj_str.copy(str_pcd_obj)\r
-                        if str_pcd_obj.DefaultValue:\r
-                            str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
+                        if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                            str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                        else:\r
+                            str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
         if S_pcd_set:\r
             GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
@@ -1661,6 +1676,23 @@ class DscBuildData(PlatformBuildClassObject):
             # Assign field values in PCD\r
             #\r
             CApp = CApp + "// Default value in Dec \n"\r
+            DefaultValueFromDec = Pcd.DefaultValueFromDec\r
+            IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+            if IsArray:\r
+                try:\r
+                    DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
+                except BadExpression:\r
+                    EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
+                                    (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
+            Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
+            if isinstance(Value, str):\r
+                CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
+            elif IsArray:\r
+            #\r
+            # Use memcpy() to copy value into field\r
+            #\r
+                CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+                CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
             for FieldList in [Pcd.DefaultValues]:\r
                 if not FieldList:\r
                     continue\r
@@ -1696,10 +1728,11 @@ class DscBuildData(PlatformBuildClassObject):
                 storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
                 for defaultstorenameitem in storeset:\r
                     CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
-                    for FieldList in [Pcd.DefaultFromDSC,inherit_OverrideValues.get(defaultstorenameitem)]:\r
+                    pcddefaultvalue = Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
+                    for FieldList in [pcddefaultvalue,inherit_OverrideValues.get(defaultstorenameitem)]:\r
                         if not FieldList:\r
                             continue\r
-                        if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:\r
+                        if pcddefaultvalue and FieldList == pcddefaultvalue:\r
                             IsArray = self.IsFieldValueAnArray(FieldList)\r
                             if IsArray:\r
                                 try:\r
@@ -1709,12 +1742,12 @@ class DscBuildData(PlatformBuildClassObject):
                                                     (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
                             Value, ValueSize = ParseFieldValue (FieldList)\r
                             if isinstance(Value, str):\r
-                                CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)\r
+                                CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
                             elif IsArray:\r
                             #\r
                             # Use memcpy() to copy value into field\r
                             #\r
-                                CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC)\r
+                                CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
                                 CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                             continue\r
                         for FieldName in FieldList:\r
@@ -1937,6 +1970,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
@@ -2233,10 +2268,14 @@ class DscBuildData(PlatformBuildClassObject):
         for pcd in Pcds.values():\r
             SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
+            pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
             for sku in pcd.SkuInfoList.values():\r
                 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):\r
                     sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
+                    for default_store in sku.DefaultStoreDict:\r
+                        sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
+                    pcd.DefaultValue = pcdDecObject.DefaultValue\r
             if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})\r