X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FWorkspace%2FDscBuildData.py;h=f9cd429f29f6a18718bf36c15d27e560cf10e880;hb=726c501c2c9a1ef103fab7846e2d1a34506715d8;hp=4642e761b9150c4055b9a5b64b0965cbaa53a53a;hpb=a09395932d997d41f59ae3ee2f7f77f91f5caa02;p=mirror_edk2.git diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 4642e761b9..f9cd429f29 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -1,7 +1,7 @@ ## @file # This file is used to create a database used by build tool # -# Copyright (c) 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -23,7 +23,8 @@ from Common.Misc import * from types import * from CommonDataClass.CommonClass import SkuInfoClass - +from Common.TargetTxtClassObject import * +from Common.ToolDefClassObject import * from MetaDataTable import * from MetaFileTable import * from MetaFileParser import * @@ -77,11 +78,11 @@ PcdMakefileHeader = ''' ''' +WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 ' +LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable ' PcdMakefileEnd = ''' !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common -CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 - LIBS = $(LIB_PATH)\Common.lib !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app @@ -152,6 +153,7 @@ class DscBuildData(PlatformBuildClassObject): self._Arch = Arch self._Target = Target self._Toolchain = Toolchain + self._ToolChainFamily = None self._Clear() self._HandleOverridePath() if os.getenv("WORKSPACE"): @@ -798,7 +800,7 @@ class DscBuildData(PlatformBuildClassObject): ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain] PkgSet.update(ModuleData.Packages) - self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet) + self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet) if (PcdCName, TokenSpaceGuid) not in self._DecPcds: @@ -819,6 +821,8 @@ class DscBuildData(PlatformBuildClassObject): ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True) except WrnExpression, Value: ValueList[Index] = Value.result + except BadExpression, Value: + EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=self._LineIndex + 1) except EvaluationException, Excpt: if hasattr(Excpt, 'Pcd'): if Excpt.Pcd in GlobalData.gPlatformOtherPcds: @@ -832,11 +836,13 @@ class DscBuildData(PlatformBuildClassObject): else: EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), File=self.MetaFile, Line=LineNo) - if ValueList[Index] == 'True': - ValueList[Index] = '1' - elif ValueList[Index] == 'False': - ValueList[Index] = '0' if ValueList[Index]: + DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType + try: + ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True) + except BadExpression, Value: + EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo, + ExtraData="PCD [%s.%s] Value \"%s\" " % (TokenSpaceGuid, PcdCName, ValueList[Index])) Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index]) if not Valid: EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo, @@ -916,6 +922,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 @@ -923,7 +931,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): @@ -934,14 +943,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): @@ -1007,7 +1018,7 @@ class DscBuildData(PlatformBuildClassObject): "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch), File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5]) # Add the Structure PCD that only defined in DEC, don't have override in DSC file - for Pcd in self._DecPcds: + for Pcd in self.DecPcds: if type (self._DecPcds[Pcd]) is StructurePcd: if Pcd not in S_pcd_set: str_pcd_obj_str = StructurePcd() @@ -1021,8 +1032,6 @@ 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 DynamicPcdType: - continue for skuid in SkuIds: if skuid in stru_pcd.SkuOverrideValues: continue @@ -1299,25 +1308,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 @@ -1336,43 +1349,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 # @@ -1410,7 +1426,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) @@ -1424,7 +1442,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' @@ -1444,7 +1464,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-pointer-to-int-cast -Wno-unused-variable\n' + 'INCLUDE +=' + 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +=' PlatformInc = {} for Cache in self._Bdb._CACHE_.values(): @@ -1469,6 +1489,50 @@ class DscBuildData(PlatformBuildClassObject): for inc in PlatformInc[pkg]: MakeApp += '-I' + str(inc) + ' ' MakeApp = MakeApp + '\n' + + CC_FLAGS = LinuxCFLAGS + if sys.platform == "win32": + CC_FLAGS = WindowsCFLAGS + BuildOptions = {} + for Options in self.BuildOptions: + if Options[2] != EDKII_NAME: + continue + Family = Options[0] + if Family and Family != self.ToolChainFamily: + continue + Target, Tag, Arch, Tool, Attr = Options[1].split("_") + if Tool != 'CC': + continue + + if Target == "*" or Target == self._Target: + if Tag == "*" or Tag == self._Toolchain: + if Arch == "*" or Arch == self.Arch: + if Tool not in BuildOptions: + BuildOptions[Tool] = {} + if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='): + BuildOptions[Tool][Attr] = self.BuildOptions[Options] + else: + # append options for the same tool except PATH + if Attr != 'PATH': + BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options] + else: + BuildOptions[Tool][Attr] = self.BuildOptions[Options] + if BuildOptions: + for Tool in BuildOptions: + for Attr in BuildOptions[Tool]: + if Attr == "FLAGS": + Value = BuildOptions[Tool][Attr] + ValueList = Value.split() + if ValueList: + for Id, Item in enumerate(ValueList): + if Item == '-D' or Item == '/D': + CC_FLAGS += ' ' + Item + if Id + 1 < len(ValueList): + CC_FLAGS += ' ' + ValueList[Id + 1] + elif Item.startswith('/D') or Item.startswith('-D'): + CC_FLAGS += ' ' + Item + MakeApp += CC_FLAGS + if sys.platform == "win32": MakeApp = MakeApp + PcdMakefileEnd MakeFileName = os.path.join(self.OutputPath, 'Makefile') @@ -1653,6 +1717,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)] @@ -1673,7 +1738,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: @@ -1949,6 +2014,28 @@ class DscBuildData(PlatformBuildClassObject): Module.MetaFile = FilePath self.Modules.append(Module) + def _GetToolChainFamily(self): + self._ToolChainFamily = "MSFT" + BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt")) + if os.path.isfile(BuildConfigurationFile) == True: + TargetTxt = TargetTxtClassObject() + TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) + ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] + if ToolDefinitionFile == '': + ToolDefinitionFile = "tools_def.txt" + ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile)) + if os.path.isfile(ToolDefinitionFile) == True: + ToolDef = ToolDefClassObject() + ToolDef.LoadToolDefFile(ToolDefinitionFile) + ToolDefinition = ToolDef.ToolsDefTxtDatabase + if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \ + or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \ + or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: + self._ToolChainFamily = "MSFT" + else: + self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain] + return self._ToolChainFamily + ## Add external PCDs # # The external PCDs are mostly those listed in FDF file to specify address @@ -1962,7 +2049,21 @@ class DscBuildData(PlatformBuildClassObject): if (Name, Guid) not in self.Pcds: self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None) self.Pcds[Name, Guid].DefaultValue = Value - + @property + def DecPcds(self): + if self._DecPcds == None: + FdfInfList = [] + if GlobalData.gFdfParser: + FdfInfList = GlobalData.gFdfParser.Profile.InfList + PkgSet = set() + for Inf in FdfInfList: + ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) + if ModuleFile in self._Modules: + continue + ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain] + PkgSet.update(ModuleData.Packages) + self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet) + return self._DecPcds _Macros = property(_GetMacros) Arch = property(_GetArch, _SetArch) Platform = property(_GetPlatformName) @@ -1993,3 +2094,4 @@ class DscBuildData(PlatformBuildClassObject): LibraryClasses = property(_GetLibraryClasses) Pcds = property(_GetPcds) BuildOptions = property(_GetBuildOptions) + ToolChainFamily = property(_GetToolChainFamily)