X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FWorkspace%2FDscBuildData.py;h=135b608ad2714c5597b54b7c1271326978022111;hp=2e5834bc69f42b7715cfed33e142191af428a73d;hb=c05c2c0526aadb0bc9ff0939bab1dec21c41c3ef;hpb=e651d06c5ed167e706e2dbe122ec0953a54033f3 diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 2e5834bc69..135b608ad2 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -806,9 +806,14 @@ class DscBuildData(PlatformBuildClassObject): "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch), File=self.MetaFile, Line=LineNo) ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType) - if not IsValid and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: - EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo, - ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) + if not IsValid: + if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: + EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo, + ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) + else: + if ValueList[2] == '-1': + EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo, + ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: try: ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True) @@ -836,6 +841,10 @@ class DscBuildData(PlatformBuildClassObject): if not Valid: EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo, ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName)) + if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT): + if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip(): + EdkLogger.error('build', FORMAT_INVALID, ErrStr , File=self.MetaFile, Line=LineNo, + ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) return ValueList def _FilterPcdBySkuUsage(self,Pcds): @@ -845,14 +854,14 @@ class DscBuildData(PlatformBuildClassObject): for pcdname in Pcds: pcd = Pcds[pcdname] Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku} - if type(pcd) is StructurePcd and pcd.OverrideValues: - Pcds[pcdname].OverrideValues = {"DEFAULT":pcd.OverrideValues[skuid] for skuid in pcd.OverrideValues if skuid in available_sku} + if type(pcd) is StructurePcd and pcd.SkuOverrideValues: + Pcds[pcdname].SkuOverrideValues = {"DEFAULT":pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku} else: for pcdname in Pcds: pcd = Pcds[pcdname] Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku} - if type(pcd) is StructurePcd and pcd.OverrideValues: - Pcds[pcdname].OverrideValues = {skuid:pcd.OverrideValues[skuid] for skuid in pcd.OverrideValues if skuid in available_sku} + if type(pcd) is StructurePcd and pcd.SkuOverrideValues: + Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku} return Pcds def CompleteHiiPcdsDefaultStores(self,Pcds): HiiPcd = [Pcds[pcd] for pcd in Pcds if Pcds[pcd].Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]] @@ -907,6 +916,8 @@ class DscBuildData(PlatformBuildClassObject): for CodeBase in (EDKII_NAME, EDK_NAME): RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase] for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList: + if Dummy3.upper() != 'COMMON': + continue CurKey = (ToolChainFamily, ToolChain, CodeBase) # # Only flags can be appended @@ -914,7 +925,8 @@ class DscBuildData(PlatformBuildClassObject): if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='): self._BuildOptions[CurKey] = Option else: - self._BuildOptions[CurKey] += ' ' + Option + if ' ' + Option not in self._BuildOptions[CurKey]: + self._BuildOptions[CurKey] += ' ' + Option return self._BuildOptions def GetBuildOptionsByModuleType(self, Edk, ModuleType): @@ -925,14 +937,16 @@ class DscBuildData(PlatformBuildClassObject): self._ModuleTypeOptions[Edk, ModuleType] = options DriverType = '%s.%s' % (Edk, ModuleType) CommonDriverType = '%s.%s' % ('COMMON', ModuleType) - RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType] - for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4,Dummy5 in RecordList: - if Type == DriverType or Type == CommonDriverType: + RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch] + for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList: + Type = Dummy2 + '.' + Dummy3 + if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper(): Key = (ToolChainFamily, ToolChain, Edk) if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='): options[Key] = Option else: - options[Key] += ' ' + Option + if ' ' + Option not in options[Key]: + options[Key] += ' ' + Option return self._ModuleTypeOptions[Edk, ModuleType] def GetStructurePcdInfo(self, PcdSet): @@ -945,9 +959,18 @@ class DscBuildData(PlatformBuildClassObject): return structure_pcd_data def UpdateStructuredPcds(self, TypeList, AllPcds): + + DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT], + self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], + self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD], + self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT], + self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], + self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]] + Pcds = AllPcds DefaultStoreMgr = DefaultStore(self.DefaultStores) - SkuIds = set([skuid for pcdobj in AllPcds.values() for skuid in pcdobj.SkuInfoList.keys()]) + SkuIds = self.SkuIdMgr.AvailableSkuIdSet + SkuIds.update({'DEFAULT':0}) DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()]) S_PcdSet = [] @@ -1003,13 +1026,17 @@ class DscBuildData(PlatformBuildClassObject): if S_pcd_set: GlobalData.gStructurePcd[self.Arch] = S_pcd_set for stru_pcd in S_pcd_set.values(): - if stru_pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT], - self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], - self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD], - self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT], - self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], - self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]: - continue + for skuid in SkuIds: + if skuid in stru_pcd.SkuOverrideValues: + continue + nextskuid = self.SkuIdMgr.GetNextSkuId(skuid) + NoDefault = False + while nextskuid not in stru_pcd.SkuOverrideValues: + if nextskuid == "DEFAULT": + NoDefault = True + break + nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid) + stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {'STANDARD':stru_pcd.DefaultValues}) if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: for skuid in SkuIds: nextskuid = skuid @@ -1020,7 +1047,6 @@ class DscBuildData(PlatformBuildClassObject): NoDefault = True break nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid) - stru_pcd.SkuOverrideValues[skuid] = {} if NoDefault: continue PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid]]) @@ -1029,22 +1055,13 @@ class DscBuildData(PlatformBuildClassObject): for defaultstoreid in DefaultStores: if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]: stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]) - for skuid in SkuIds: - if skuid in stru_pcd.SkuOverrideValues: - continue - nextskuid = self.SkuIdMgr.GetNextSkuId(skuid) - NoDefault = False - while nextskuid not in stru_pcd.SkuOverrideValues: - if nextskuid == "DEFAULT": - NoDefault = True - break - nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid) - stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores}) + Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) if Str_Pcd_Values: for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values: str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid)) if str_pcd_obj is None: + print PcdName, PcdGuid raise if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: @@ -1059,7 +1076,16 @@ class DscBuildData(PlatformBuildClassObject): str_pcd_obj.DefaultValue = PcdValue else: if skuname not in str_pcd_obj.SkuInfoList: - str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue) + nextskuid = self.SkuIdMgr.GetNextSkuId(skuname) + NoDefault = False + while nextskuid not in str_pcd_obj.SkuInfoList: + if nextskuid == "DEFAULT": + NoDefault = True + break + nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid) + str_pcd_obj.SkuInfoList[skuname] = copy.deepcopy(str_pcd_obj.SkuInfoList[nextskuid]) if not NoDefault else SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue) + str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0] + str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname else: str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue for str_pcd_obj in S_pcd_set.values(): @@ -1076,6 +1102,15 @@ class DscBuildData(PlatformBuildClassObject): str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj) Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj + for pcdkey in Pcds: + pcd = Pcds[pcdkey] + if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON'] + del(pcd.SkuInfoList['COMMON']) + elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + del(pcd.SkuInfoList['COMMON']) + + map(self.FilterSkuSettings,[Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType]) return Pcds ## Retrieve non-dynamic PCD settings @@ -1175,18 +1210,19 @@ class DscBuildData(PlatformBuildClassObject): def get_length(value): Value = value.strip() - if Value.startswith('GUID') and Value.endswith(')'): - return 16 - if Value.startswith('L"') and Value.endswith('"'): - return len(Value[2:-1]) - if Value[0] == '"' and Value[-1] == '"': - return len(Value) - 2 - if Value[0] == '{' and Value[-1] == '}': - return len(Value.split(",")) - if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1: - return len(list(Value[2:-1])) - if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1: - return len(Value) - 2 + if len(value) > 1: + if Value.startswith('GUID') and Value.endswith(')'): + return 16 + if Value.startswith('L"') and Value.endswith('"'): + return len(Value[2:-1]) + if Value[0] == '"' and Value[-1] == '"': + return len(Value) - 2 + if Value[0] == '{' and Value[-1] == '}': + return len(Value.split(",")) + if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1: + return len(list(Value[2:-1])) + if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1: + return len(Value) - 2 return len(Value) return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]])) @@ -1241,18 +1277,15 @@ class DscBuildData(PlatformBuildClassObject): CApp = CApp + '{\n' CApp = CApp + ' UINT32 Size;\n' CApp = CApp + ' UINT32 FieldSize;\n' - CApp = CApp + ' UINT8 *Value;\n' + CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' UINT32 OriginalSize;\n' CApp = CApp + ' VOID *OriginalPcd;\n' CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType) CApp = CApp + '\n' + Pcd.DefaultValue = Pcd.DefaultValue.strip() - if Pcd.DefaultValue.startswith('L"') and Pcd.DefaultValue.endswith('"'): - PcdDefaultValue = "{" + ",".join(self.__UNICODE2OCTList(Pcd.DefaultValue)) + "}" - elif Pcd.DefaultValue.startswith('"') and Pcd.DefaultValue.endswith('"'): - PcdDefaultValue = "{" + ",".join(self.__STRING2OCTList(Pcd.DefaultValue)) + "}" - else: - PcdDefaultValue = Pcd.DefaultValue + PcdDefaultValue = StringToArray(Pcd.DefaultValue) + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) # @@ -1269,25 +1302,29 @@ class DscBuildData(PlatformBuildClassObject): # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1) # CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType) - for FieldList in [Pcd.DefaultValues, OverrideValues.get(DefaultStoreName)]: - if not FieldList: - continue - for FieldName in FieldList: - FieldName = "." + FieldName - IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0]) - if IsArray: - Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0]) - CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip(".")); - else: - NewFieldName = '' - while '[' in FieldName: - NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]' - ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0]) - FieldName = FieldName.split(']', 1)[1] - FieldName = NewFieldName + FieldName - while '[' in FieldName: - FieldName = FieldName.rsplit('[', 1)[0] - CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1) + for skuname in self.SkuIdMgr.SkuOverrideOrder(): + inherit_OverrideValues = Pcd.SkuOverrideValues[skuname] + for FieldList in [Pcd.DefaultValues, inherit_OverrideValues.get(DefaultStoreName)]: + if not FieldList: + continue + for FieldName in FieldList: + FieldName = "." + FieldName + IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0]) + if IsArray: + Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0]) + CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip(".")); + else: + NewFieldName = '' + while '[' in FieldName: + NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]' + ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0]) + FieldName = FieldName.split(']', 1)[1] + FieldName = NewFieldName + FieldName + while '[' in FieldName: + FieldName = FieldName.rsplit('[', 1)[0] + CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1) + if skuname == SkuName: + break # # Allocate and zero buffer for the PCD @@ -1306,43 +1343,46 @@ class DscBuildData(PlatformBuildClassObject): # # Assign field values in PCD # - for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC,OverrideValues.get(DefaultStoreName)]: - if not FieldList: - continue - if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC: - IsArray = self.IsFieldValueAnArray(FieldList) - Value, ValueSize = ParseFieldValue (FieldList) - if isinstance(Value, str): - CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC) - elif IsArray: + for skuname in self.SkuIdMgr.SkuOverrideOrder(): + inherit_OverrideValues = Pcd.SkuOverrideValues[skuname] + for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC,inherit_OverrideValues.get(DefaultStoreName)]: + if not FieldList: + continue + if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC: + IsArray = self.IsFieldValueAnArray(FieldList) + Value, ValueSize = ParseFieldValue (FieldList) + if isinstance(Value, str): + CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC) + elif IsArray: # # Use memcpy() to copy value into field # - CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC) - CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) - continue + CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC) + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) + continue - for FieldName in FieldList: - IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0]) - try: - Value, ValueSize = ParseFieldValue (FieldList[FieldName][0]) - except Exception: - print FieldList[FieldName][0] - if isinstance(Value, str): - CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) - elif IsArray: + for FieldName in FieldList: + IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0]) + try: + Value, ValueSize = ParseFieldValue (FieldList[FieldName][0]) + except Exception: + print FieldList[FieldName][0] + if isinstance(Value, str): + CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + elif IsArray: # # Use memcpy() to copy value into field # - CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName) - CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) - CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) - else: - if ValueSize > 4: - CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName) + CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) else: - CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) - + if ValueSize > 4: + CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + else: + CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + if skuname == SkuName: + break # # Set new PCD value and size # @@ -1380,7 +1420,9 @@ class DscBuildData(PlatformBuildClassObject): if not Pcd.SkuOverrideValues: InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp) else: - for SkuName in Pcd.SkuOverrideValues: + for SkuName in self.SkuIdMgr.SkuOverrideOrder(): + if SkuName not in Pcd.SkuOverrideValues: + continue for DefaultStoreName in Pcd.DefaultStoreName: Pcd = StructuredPcds[PcdName] InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp) @@ -1394,7 +1436,9 @@ class DscBuildData(PlatformBuildClassObject): if not Pcd.SkuOverrideValues: CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName) else: - for SkuName in Pcd.SkuOverrideValues: + for SkuName in self.SkuIdMgr.SkuOverrideOrder(): + if SkuName not in Pcd.SkuOverrideValues: + continue for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]: CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + '}\n' @@ -1414,7 +1458,7 @@ class DscBuildData(PlatformBuildClassObject): else: MakeApp = MakeApp + PcdGccMakefile MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \ - 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'BUILD_CFLAGS += -Wno-error\n' + 'INCLUDE +=' + 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable\n' + 'INCLUDE +=' PlatformInc = {} for Cache in self._Bdb._CACHE_.values(): @@ -1452,15 +1496,18 @@ class DscBuildData(PlatformBuildClassObject): File.write(InitByteValue) File.close() + Messages = '' if sys.platform == "win32": StdOut, StdErr = self.ExecuteCommand ('nmake clean & nmake -f %s' % (MakeFileName)) + Messages = StdOut else: StdOut, StdErr = self.ExecuteCommand ('make clean & make -f %s' % (MakeFileName)) - Messages = StdOut.split('\r') + Messages = StdErr + Messages = Messages.split('\n') for Message in Messages: - if " error " in Message: + if " error" in Message: FileInfo = Message.strip().split('(') - if len (FileInfo) > 0: + if len (FileInfo) > 1: FileName = FileInfo [0] FileLine = FileInfo [1].split (')')[0] else: @@ -1478,11 +1525,14 @@ class DscBuildData(PlatformBuildClassObject): dsc_line = error_line message_itmes = Message.split(":") + Index = 0 for item in message_itmes: if "PcdValueInit.c" in item: - message_itmes[message_itmes.index(item)] = dsc_line.strip() + Index = message_itmes.index(item) + message_itmes[Index] = dsc_line.strip() + break - EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, ":".join(message_itmes[1:])) + EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, ":".join(message_itmes[Index:])) PcdValueInitExe = PcdValueInitName if not sys.platform == "win32": @@ -1582,13 +1632,26 @@ class DscBuildData(PlatformBuildClassObject): del(pcd.SkuInfoList['COMMON']) elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): del(pcd.SkuInfoList['COMMON']) - if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE: - if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys(): - pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] - del(pcd.SkuInfoList['DEFAULT']) + + map(self.FilterSkuSettings,Pcds.values()) return Pcds + def FilterSkuSettings(self, PcdObj): + + if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE: + if 'DEFAULT' in PcdObj.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList.keys(): + PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList['DEFAULT'] + PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]} + PcdObj.SkuInfoList['DEFAULT'].SkuIdName = 'DEFAULT' + PcdObj.SkuInfoList['DEFAULT'].SkuId = '0' + + elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT: + PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList['DEFAULT']} + + return PcdObj + + def CompareVarAttr(self, Attr1, Attr2): if not Attr1 or not Attr2: # for empty string return True @@ -1604,6 +1667,7 @@ class DscBuildData(PlatformBuildClassObject): Pcds = {} DefaultStoreObj = DefaultStore(self._GetDefaultStores()) SkuIds = set([(skuid,skuobj.SkuId) for pcdobj in PcdSet.values() for skuid,skuobj in pcdobj.SkuInfoList.items()]) + SkuIds = self.SkuIdMgr.AvailableSkuIdSet DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()]) for PcdCName, TokenSpaceGuid in PcdSet: PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)] @@ -1624,7 +1688,7 @@ class DscBuildData(PlatformBuildClassObject): if defaultstorename not in skuobj.DefaultStoreDict: skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename]) skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename] - for skuname,skuid in SkuIds: + for skuname,skuid in SkuIds.items(): if skuname not in PcdObj.SkuInfoList: nextskuid = self.SkuIdMgr.GetNextSkuId(skuname) while nextskuid not in PcdObj.SkuInfoList: @@ -1760,11 +1824,6 @@ class DscBuildData(PlatformBuildClassObject): elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): del(pcd.SkuInfoList['COMMON']) - if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE: - if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys(): - pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] - del(pcd.SkuInfoList['DEFAULT']) - if pcd.MaxDatumSize.strip(): MaxSize = int(pcd.MaxDatumSize, 0) else: @@ -1772,19 +1831,21 @@ class DscBuildData(PlatformBuildClassObject): if pcdDecObject.DatumType == 'VOID*': for (_, skuobj) in pcd.SkuInfoList.items(): datalen = 0 - if skuobj.HiiDefaultValue.startswith("L"): - datalen = (len(skuobj.HiiDefaultValue) - 3 + 1) * 2 - elif skuobj.HiiDefaultValue.startswith("{"): - datalen = len(skuobj.HiiDefaultValue.split(",")) - else: - datalen = len(skuobj.HiiDefaultValue) - 2 + 1 + skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue) + datalen = len(skuobj.HiiDefaultValue.split(",")) if datalen > MaxSize: MaxSize = datalen + for defaultst in skuobj.DefaultStoreDict: + skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst]) + pcd.DefaultValue = StringToArray(pcd.DefaultValue) pcd.MaxDatumSize = str(MaxSize) rt, invalidhii = self.CheckVariableNameAssignment(Pcds) if not rt: invalidpcd = ",".join(invalidhii) EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd) + + map(self.FilterSkuSettings,Pcds.values()) + return Pcds def CheckVariableNameAssignment(self,Pcds): @@ -1884,11 +1945,9 @@ class DscBuildData(PlatformBuildClassObject): del(pcd.SkuInfoList['COMMON']) elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): del(pcd.SkuInfoList['COMMON']) - if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE: - if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys(): - pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] - del(pcd.SkuInfoList['DEFAULT']) + + map(self.FilterSkuSettings,Pcds.values()) return Pcds ## Add external modules