def GenSources(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES) Sources = {} # # Get all Nmakes # RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2]) MergeArches(Sources, (Filename, Family, TagName, ToolCode, Pcd), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s', Value4 = '%s', Value5 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Filename), ConvertToSqlString2(Family), ConvertToSqlString2(TagName), ConvertToSqlString2(ToolCode), ConvertToSqlString2(Pcd), Record[3]) self.TblInf.Exec(SqlCommand) for Key in Sources.keys(): Source = ModuleSourceFileClass(Key[0], Key[2], Key[3], Key[1], Key[4], Sources[Key]) self.Module.Sources.append(Source)
def GenLibraryClasses(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES) LibraryClasses = {} # # Get all LibraryClasses # RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf([Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2]) MergeArches(LibraryClasses, (LibClassName, LibClassIns, Pcd, SupModelList), Arch) # # Update to Database # if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(LibClassName), ConvertToSqlString2(LibClassIns), ConvertToSqlString2(SupModelList), Record[3]) self.TblInf.Exec(SqlCommand) for Key in LibraryClasses.keys(): KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT) LibraryClass = LibraryClassClass() LibraryClass.LibraryClass = Key[0] LibraryClass.RecommendedInstance = NormPath(Key[1]) LibraryClass.FeatureFlag = Key[2] LibraryClass.SupArchList = LibraryClasses[Key] LibraryClass.SupModuleList = GetSplitValueList(Key[3]) self.Module.LibraryClasses.append(LibraryClass)
def GenGuidProtocolPpis(self, Type, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % Type) Lists = {} # # Get all Items # RecordSet = self.RecordSet[Section[Type.upper()]] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]) MergeArches(Lists, (Name, Value), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Name), ConvertToSqlString2(Value), Record[3]) self.TblInf.Exec(SqlCommand) ListMember = None if Type == TAB_GUIDS: ListMember = self.Module.Guids elif Type == TAB_PROTOCOLS: ListMember = self.Module.Protocols elif Type == TAB_PPIS: ListMember = self.Module.Ppis for Key in Lists.keys(): ListClass = GuidProtocolPpiCommonClass() ListClass.CName = Key[0] ListClass.SupArchList = Lists[Key] ListClass.FeatureFlag = Key[1] ListMember.append(ListClass)
def GenBinaries(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES) Binaries = {} # # Get all Guids # RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2]) MergeArches(Binaries, (FileType, Filename, Target, Pcd), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s', Value4 = '%s' where ID = %s""" % ( self.TblInf.Table, ConvertToSqlString2(FileType), ConvertToSqlString2(Filename), ConvertToSqlString2(Target), ConvertToSqlString2(Pcd), Record[3]) self.TblInf.Exec(SqlCommand) for Key in Binaries.keys(): Binary = ModuleBinaryFileClass(NormPath(Key[1]), Key[0], Key[2], Key[3], Binaries[Key]) self.Module.Binaries.append(Binary)
def GenBuildOptions(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS) BuildOptions = {} # # Get all BuildOptions # RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Family, ToolChain, Flag) = GetBuildOption(Record[0], ContainerFile, Record[2]) MergeArches(BuildOptions, (Family, ToolChain, Flag), Arch) # # Update to Database # if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s' where ID = %s""" % ( self.TblInf.Table, ConvertToSqlString2(Family), ConvertToSqlString2(ToolChain), ConvertToSqlString2(Flag), Record[3]) self.TblInf.Exec(SqlCommand) for Key in BuildOptions.keys(): BuildOption = BuildOptionClass(Key[0], Key[1], Key[2]) BuildOption.SupArchList = BuildOptions[Key] self.Module.BuildOptions.append(BuildOption)
def GenPcds(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) Pcds = {} PcdToken = {} # Get all Pcds RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] # Go through each arch for Record in RecordSet1: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet2: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet3: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet4: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet5: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], '', ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
def GenBinaries(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES) Binaries = {} # # Get all Guids # RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2]) MergeArches(Binaries, (FileType, Filename, Target, Pcd), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s', Value4 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(FileType), ConvertToSqlString2(Filename), ConvertToSqlString2(Target), ConvertToSqlString2(Pcd), Record[3]) self.TblInf.Exec(SqlCommand) for Key in Binaries.keys(): Binary = ModuleBinaryFileClass(NormPath(Key[1]), Key[0], Key[2], Key[3], Binaries[Key]) self.Module.Binaries.append(Binary)
def GenPackages(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES) Packages = {} # # Get all Packages # RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Package, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]) MergeArches(Packages, (Package, Pcd), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Package), ConvertToSqlString2(Pcd), Record[3]) self.TblInf.Exec(SqlCommand) for Key in Packages.keys(): Package = ModulePackageDependencyClass() Package.FilePath = NormPath(Key[0]) Package.SupArchList = Packages[Key] Package.FeatureFlag = Key[1] self.Module.PackageDependencies.append(Package)
def GenPackages(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES) Packages = {} # # Get all Packages # RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Package, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]) MergeArches(Packages, (Package, Pcd), Arch) if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s' where ID = %s""" % ( self.TblInf.Table, ConvertToSqlString2(Package), ConvertToSqlString2(Pcd), Record[3]) self.TblInf.Exec(SqlCommand) for Key in Packages.keys(): Package = ModulePackageDependencyClass() Package.FilePath = NormPath(Key[0]) Package.SupArchList = Packages[Key] Package.FeatureFlag = Key[1] self.Module.PackageDependencies.append(Package)
def GenBuildOptions(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS) BuildOptions = {} # # Get all BuildOptions # RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (Family, ToolChain, Flag) = GetBuildOption(Record[0], ContainerFile, Record[2]) MergeArches(BuildOptions, (Family, ToolChain, Flag), Arch) # # Update to Database # if self.IsToDatabase: SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Family), ConvertToSqlString2(ToolChain), ConvertToSqlString2(Flag), Record[3]) self.TblInf.Exec(SqlCommand) for Key in BuildOptions.keys(): BuildOption = BuildOptionClass(Key[0], Key[1], Key[2]) BuildOption.SupArchList = BuildOptions[Key] self.Module.BuildOptions.append(BuildOption)
def GenModuleHeader(self, ContainerFile): EdkLogger.debug(2, "Generate ModuleHeader ...") # Update all defines item in database RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] ModuleHeader = ModuleHeaderClass() ModuleExtern = ModuleExternClass() OtherDefines = [] for Record in RecordSet: ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) if len(ValueList) != 2: OtherDefines.append(Record[0]) else: Name = ValueList[0] Value = ValueList[1] if Name == TAB_INF_DEFINES_BASE_NAME: ModuleHeader.Name = Value ModuleHeader.BaseName = Value elif Name == TAB_INF_DEFINES_FILE_GUID: ModuleHeader.Guid = Value elif Name == TAB_INF_DEFINES_VERSION_STRING: ModuleHeader.Version = Value elif Name == TAB_INF_DEFINES_PCD_IS_DRIVER: ModuleHeader.PcdIsDriver = Value elif Name == TAB_INF_DEFINES_MODULE_TYPE: ModuleHeader.ModuleType = Value elif Name in (TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION): ModuleHeader.UefiSpecificationVersion = Value elif Name == TAB_INF_DEFINES_PI_SPECIFICATION_VERSION: ModuleHeader.PiSpecificationVersion = Value elif Name == TAB_INF_DEFINES_ENTRY_POINT: ModuleExtern.EntryPoint = Value elif Name == TAB_INF_DEFINES_UNLOAD_IMAGE: ModuleExtern.UnloadImage = Value elif Name == TAB_INF_DEFINES_CONSTRUCTOR: ModuleExtern.Constructor = Value elif Name == TAB_INF_DEFINES_DESTRUCTOR: ModuleExtern.Destructor = Value else: OtherDefines.append(Record[0]) ModuleHeader.FileName = self.Identification.FileName ModuleHeader.FullPath = self.Identification.FullPath ModuleHeader.RelaPath = self.Identification.RelaPath ModuleHeader.PackagePath = self.Identification.PackagePath ModuleHeader.ModulePath = self.Identification.ModulePath ModuleHeader.CombinePath = os.path.normpath( os.path.join(ModuleHeader.PackagePath, ModuleHeader.ModulePath, ModuleHeader.FileName) ) if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict: ModuleHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER] self.Module.ModuleHeader = ModuleHeader self.Module.Externs.append(ModuleExtern) UE = self.Module.UserExtensions if UE == None: UE = UserExtensionsClass() UE.Defines = OtherDefines self.Module.UserExtensions = UE
def GenModuleHeader(self, ContainerFile): EdkLogger.debug(2, "Generate ModuleHeader ...") # Update all defines item in database RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] ModuleHeader = ModuleHeaderClass() ModuleExtern = ModuleExternClass() OtherDefines = [] for Record in RecordSet: ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) if len(ValueList) != 2: OtherDefines.append(Record[0]) else: Name = ValueList[0] Value = ValueList[1] if Name == TAB_INF_DEFINES_BASE_NAME: ModuleHeader.Name = Value ModuleHeader.BaseName = Value elif Name == TAB_INF_DEFINES_FILE_GUID: ModuleHeader.Guid = Value elif Name == TAB_INF_DEFINES_VERSION_STRING: ModuleHeader.Version = Value elif Name == TAB_INF_DEFINES_PCD_IS_DRIVER: ModuleHeader.PcdIsDriver = Value elif Name == TAB_INF_DEFINES_MODULE_TYPE: ModuleHeader.ModuleType = Value elif Name in (TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION): ModuleHeader.UefiSpecificationVersion = Value elif Name == TAB_INF_DEFINES_PI_SPECIFICATION_VERSION: ModuleHeader.PiSpecificationVersion = Value elif Name == TAB_INF_DEFINES_ENTRY_POINT: ModuleExtern.EntryPoint = Value elif Name == TAB_INF_DEFINES_UNLOAD_IMAGE: ModuleExtern.UnloadImage = Value elif Name == TAB_INF_DEFINES_CONSTRUCTOR: ModuleExtern.Constructor = Value elif Name == TAB_INF_DEFINES_DESTRUCTOR: ModuleExtern.Destructor = Value else: OtherDefines.append(Record[0]) ModuleHeader.FileName = self.Identification.FileName ModuleHeader.FullPath = self.Identification.FullPath ModuleHeader.RelaPath = self.Identification.RelaPath ModuleHeader.PackagePath = self.Identification.PackagePath ModuleHeader.ModulePath = self.Identification.ModulePath ModuleHeader.CombinePath = os.path.normpath(os.path.join(ModuleHeader.PackagePath, ModuleHeader.ModulePath, ModuleHeader.FileName)) if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict: ModuleHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER] self.Module.ModuleHeader = ModuleHeader self.Module.Externs.append(ModuleExtern) UE = self.Module.UserExtensions if UE == None: UE = UserExtensionsClass() UE.Defines = OtherDefines self.Module.UserExtensions = UE
def GenNmakes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_NMAKE) Nmakes = sdict() # # Get all Nmakes # RecordSet = self.RecordSet[MODEL_META_DATA_NMAKE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: MergeArches(Nmakes, Record[0], Arch) for Key in Nmakes.keys(): List = GetSplitValueList(Key, DataType.TAB_EQUAL_SPLIT, MaxSplit=1) if len(List) != 2: RaiseParserError(Key, 'Nmake', ContainerFile, '<MacroName> = <Value>') continue Nmake = ModuleNmakeClass() Nmake.Name = List[0] Nmake.Value = List[1] Nmake.SupArchList = Nmakes[Key] self.Module.Nmake.append(Nmake) # convert Edk format to EdkII format if Nmake.Name == "IMAGE_ENTRY_POINT": Image = ModuleExternImageClass() Image.ModuleEntryPoint = Nmake.Value self.Module.ExternImages.append(Image) elif Nmake.Name == "DPX_SOURCE": Source = ModuleSourceFileClass(NormPath(Nmake.Value), "", "", "", "", Nmake.SupArchList) self.Module.Sources.append(Source) else: ToolList = gNmakeFlagPattern.findall(Nmake.Name) if len(ToolList) == 0 or len(ToolList) != 1: EdkLogger.warn("\nParser", "Don't know how to do with MACRO: %s" % Nmake.Name, ExtraData=ContainerFile) else: if ToolList[0] in gNmakeFlagName2ToolCode: Tool = gNmakeFlagName2ToolCode[ToolList[0]] else: Tool = ToolList[0] BuildOption = BuildOptionClass("MSFT", "*_*_*_%s_FLAGS" % Tool, Nmake.Value) BuildOption.SupArchList = Nmake.SupArchList self.Module.BuildOptions.append(BuildOption)
def GenBuildOptions(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS) BuildOptions = {} # Get all BuildOptions RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION] UE = self.Module.UserExtensions if UE == None: UE = UserExtensionsClass() for Record in RecordSet: UE.BuildOptions.append(Record[0]) self.Module.UserExtensions = UE
def GenIncludes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES) Includes = sdict() # Get all Includes RecordSet = self.RecordSet[MODEL_EFI_INCLUDE] for Record in RecordSet: Include = IncludeClass() Include.FilePath = Record[0] Include.SupArchList = Record[1] if GenerateHelpText(Record[5], ''): Include.HelpTextList.append(GenerateHelpText(Record[5], '')) self.Module.Includes.append(Include)
def GenBinaries(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES) Binaries = {} # Get all Guids RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE] for Record in RecordSet: (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.RelaPath, Record[2]) Binary = ModuleBinaryFileClass(Filename, FileType, Target, Pcd, Record[1]) if GenerateHelpText(Record[5], ''): Binary.HelpTextList.append(GenerateHelpText(Record[5], '')) self.Module.Binaries.append(Binary)
def GenIncludes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES) Includes = sdict() # Get all Includes RecordSet = self.RecordSet[MODEL_EFI_INCLUDE] for Record in RecordSet: Include = IncludeClass() Include.FilePath = Record[0] Include.SupArchList = Record[1] if GenerateHelpText(Record[5], ""): Include.HelpTextList.append(GenerateHelpText(Record[5], "")) self.Module.Includes.append(Include)
def GenBinaries(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES) Binaries = {} # Get all Guids RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE] for Record in RecordSet: (FileType, Filename, Target, Pcd) = GetBinary( Record[0], ContainerFile, self.Identification.RelaPath, Record[2] ) Binary = ModuleBinaryFileClass(Filename, FileType, Target, Pcd, Record[1]) if GenerateHelpText(Record[5], ""): Binary.HelpTextList.append(GenerateHelpText(Record[5], "")) self.Module.Binaries.append(Binary)
def GenPackages(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES) Packages = {} # Get all Packages RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE] for Record in RecordSet: (PackagePath, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]) Package = ModulePackageDependencyClass() Package.FilePath = NormPath(PackagePath) Package.SupArchList = Record[1] Package.FeatureFlag = Pcd if GenerateHelpText(Record[5], ''): Package.HelpTextList.append(GenerateHelpText(Record[5], '')) self.Module.PackageDependencies.append(Package)
def GenSources(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES) Sources = {} # Get all Sources RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE] for Record in RecordSet: (Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.RelaPath, Record[2]) Source = ModuleSourceFileClass(Filename, TagName, ToolCode, Family, Pcd, Record[1]) if GenerateHelpText(Record[5], ''): Source.HelpTextList.append(GenerateHelpText(Record[5], '')) if MODEL_EFI_SOURCE_FILE in self.SectionHeaderCommentDict: Source.HelpText = self.SectionHeaderCommentDict[MODEL_EFI_SOURCE_FILE] self.Module.Sources.append(Source)
def GenPackages(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES) Packages = {} # Get all Packages RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE] for Record in RecordSet: (PackagePath, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]) Package = ModulePackageDependencyClass() Package.FilePath = NormPath(PackagePath) Package.SupArchList = Record[1] Package.FeatureFlag = Pcd if GenerateHelpText(Record[5], ""): Package.HelpTextList.append(GenerateHelpText(Record[5], "")) self.Module.PackageDependencies.append(Package)
def GenLibraryClasses(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES) LibraryClasses = {} # Get all LibraryClasses RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS] for Record in RecordSet: (LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf([Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2]) LibraryClass = CommonClass.LibraryClassClass() LibraryClass.LibraryClass = LibClassName LibraryClass.RecommendedInstance = LibClassIns LibraryClass.FeatureFlag = Pcd LibraryClass.SupArchList = Record[1] LibraryClass.SupModuleList = Record[4] if GenerateHelpText(Record[5], ''): LibraryClass.HelpTextList.append(GenerateHelpText(Record[5], '')) self.Module.LibraryClasses.append(LibraryClass)
def GenSources(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES) Sources = {} # Get all Sources RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE] for Record in RecordSet: (Filename, Family, TagName, ToolCode, Pcd) = GetSource( Record[0], ContainerFile, self.Identification.RelaPath, Record[2] ) Source = ModuleSourceFileClass(Filename, TagName, ToolCode, Family, Pcd, Record[1]) if GenerateHelpText(Record[5], ""): Source.HelpTextList.append(GenerateHelpText(Record[5], "")) if MODEL_EFI_SOURCE_FILE in self.SectionHeaderCommentDict: Source.HelpText = self.SectionHeaderCommentDict[MODEL_EFI_SOURCE_FILE] self.Module.Sources.append(Source)
def GenDepexes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX) Depex = {} # Get all Depexes RecordSet = self.RecordSet[MODEL_EFI_DEPEX] DepexString = '' for Record in RecordSet: DepexString = DepexString + Record[0] + '\n' Dep = ModuleDepexClass() if DepexString.endswith('\n'): DepexString = DepexString[:len(DepexString) - len('\n')] Dep.Depex = DepexString if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']: self.Module.SmmDepex = Dep elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']: self.Module.PeiDepex = Dep else: self.Module.DxeDepex = Dep
def GenDepexes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX) Depex = {} # Get all Depexes RecordSet = self.RecordSet[MODEL_EFI_DEPEX] DepexString = "" for Record in RecordSet: DepexString = DepexString + Record[0] + "\n" Dep = ModuleDepexClass() if DepexString.endswith("\n"): DepexString = DepexString[: len(DepexString) - len("\n")] Dep.Depex = DepexString if self.Module.ModuleHeader.ModuleType in ["DXE_SMM_DRIVER"]: self.Module.SmmDepex = Dep elif self.Module.ModuleHeader.ModuleType in ["PEI_CORE", "PEIM"]: self.Module.PeiDepex = Dep else: self.Module.DxeDepex = Dep
def GenLibraryClasses(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES) LibraryClasses = {} # Get all LibraryClasses RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS] for Record in RecordSet: (LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf( [Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2] ) LibraryClass = CommonClass.LibraryClassClass() LibraryClass.LibraryClass = LibClassName LibraryClass.RecommendedInstance = LibClassIns LibraryClass.FeatureFlag = Pcd LibraryClass.SupArchList = Record[1] LibraryClass.SupModuleList = Record[4] if GenerateHelpText(Record[5], ""): LibraryClass.HelpTextList.append(GenerateHelpText(Record[5], "")) self.Module.LibraryClasses.append(LibraryClass)
def GenGuidProtocolPpis(self, Type, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % Type) Lists = {} # Get all Items if Type == TAB_GUIDS: ListMember = self.Module.Guids elif Type == TAB_PROTOCOLS: ListMember = self.Module.Protocols elif Type == TAB_PPIS: ListMember = self.Module.Ppis RecordSet = self.RecordSet[Section[Type.upper()]] for Record in RecordSet: (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]) ListClass = GuidProtocolPpiCommonClass() ListClass.CName = Name ListClass.SupArchList = Record[1] ListClass.FeatureFlag = Value if GenerateHelpText(Record[5], ''): ListClass.HelpTextList.append(GenerateHelpText(Record[5], '')) ListMember.append(ListClass)
def GenIncludes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES) Includes = sdict() # # Get all Includes # RecordSet = self.RecordSet[MODEL_EFI_INCLUDE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: MergeArches(Includes, Record[0], Arch) for Key in Includes.keys(): Include = IncludeClass() Include.FilePath = NormPath(Key) Include.SupArchList = Includes[Key] self.Module.Includes.append(Include)
def GenGuidProtocolPpis(self, Type, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % Type) Lists = {} # Get all Items if Type == TAB_GUIDS: ListMember = self.Module.Guids elif Type == TAB_PROTOCOLS: ListMember = self.Module.Protocols elif Type == TAB_PPIS: ListMember = self.Module.Ppis RecordSet = self.RecordSet[Section[Type.upper()]] for Record in RecordSet: (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]) ListClass = GuidProtocolPpiCommonClass() ListClass.CName = Name ListClass.SupArchList = Record[1] ListClass.FeatureFlag = Value if GenerateHelpText(Record[5], ""): ListClass.HelpTextList.append(GenerateHelpText(Record[5], "")) ListMember.append(ListClass)
def GenLibraries(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARIES) Libraries = sdict() # # Get all Includes # RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_INSTANCE] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: MergeArches(Libraries, Record[0], Arch) for Key in Libraries.keys(): Library = ModuleLibraryClass() # replace macro and remove file extension Library.Library = Key.rsplit('.', 1)[0] Library.SupArchList = Libraries[Key] self.Module.Libraries.append(Library)
def GenDepexes(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX) Depex = {} # # Get all Depexes # RecordSet = self.RecordSet[MODEL_EFI_DEPEX] # # Go through each arch # for Arch in self.SupArchList: Line = '' for Record in RecordSet: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: Line = Line + Record[0] + ' ' if Line != '': MergeArches(Depex, Line, Arch) for Key in Depex.keys(): Dep = ModuleDepexClass() Dep.Depex = Key Dep.SupArchList = Depex[Key] self.Module.Depex.append(Dep)
def GenPcds(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) Pcds = {} PcdToken = {} # Get all Pcds RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] # Go through each arch for Record in RecordSet1: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf( Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2] ) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet2: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf( Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2] ) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet3: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf( Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2] ) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet4: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf( Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2] ) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) for Record in RecordSet5: (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], "", ContainerFile, Record[2]) self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
def GenPcds(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) Pcds = {} PcdToken = {} # # Get all Guids # RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet1: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: if self.Module.Header[Arch].LibraryClass != {}: pass (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet2: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet3: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet4: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet5: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], "", ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) # # Update to database # if self.IsToDatabase: for Key in PcdToken.keys(): SqlCommand = """update %s set Value2 = '%s' where ID = %s""" % ( self.TblInf.Table, ".".join( (PcdToken[Key][0], PcdToken[Key][1])), Key) self.TblInf.Exec(SqlCommand) for Key in Pcds.keys(): Pcd = PcdClass() Pcd.CName = Key[1] Pcd.TokenSpaceGuidCName = Key[0] Pcd.DefaultValue = Key[2] Pcd.ItemType = Key[3] Pcd.SupArchList = Pcds[Key] self.Module.PcdCodes.append(Pcd)
def IncludeToolDefFile(self, FileName): FileContent = [] if os.path.isfile(FileName): try: F = open(FileName, 'r') FileContent = F.readlines() except: EdkLogger.error("tools_def.txt parser", FILE_OPEN_FAILURE, ExtraData=FileName) else: EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=FileName) for Index in range(len(FileContent)): Line = FileContent[Index].strip() if Line == "" or Line[0] == '#': continue if Line.startswith("!include"): IncFile = Line[8:].strip() Done, IncFile = self.ExpandMacros(IncFile) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=IncFile[4:-1], File=FileName, Line=Index+1) IncFile = NormPath(IncFile) if not os.path.isabs(IncFile): # # try WORKSPACE # IncFileTmp = PathClass(IncFile, GlobalData.gWorkspace) ErrorCode = IncFileTmp.Validate()[0] if ErrorCode != 0: # # try PACKAGES_PATH # IncFileTmp = mws.join(GlobalData.gWorkspace, IncFile) if not os.path.exists(IncFileTmp): # # try directory of current file # IncFileTmp = PathClass(IncFile, os.path.dirname(FileName)) ErrorCode = IncFileTmp.Validate()[0] if ErrorCode != 0: EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=IncFile) if type(IncFileTmp) is PathClass: IncFile = IncFileTmp.Path else: IncFile = IncFileTmp self.IncludeToolDefFile(IncFile) continue NameValuePair = Line.split("=", 1) if len(NameValuePair) != 2: EdkLogger.warn("tools_def.txt parser", "Line %d: not correct assignment statement, skipped" % (Index + 1)) continue Name = NameValuePair[0].strip() Value = NameValuePair[1].strip() if Name == "IDENTIFIER": EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found identifier statement, skipped: %s" % ((Index + 1), Value)) continue MacroDefinition = gMacroDefPattern.findall(Name) if MacroDefinition != []: Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) MacroName = MacroDefinition[0].strip() self.MacroDictionary["DEF(%s)" % MacroName] = Value EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found macro: %s = %s" % ((Index + 1), MacroName, Value)) continue Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) List = Name.split('_') if len(List) != 5: EdkLogger.verbose("Line %d: Not a valid name of definition: %s" % ((Index + 1), Name)) continue elif List[4] == '*': EdkLogger.verbose("Line %d: '*' is not allowed in last field: %s" % ((Index + 1), Name)) continue else: self.ToolsDefTxtDictionary[Name] = Value if List[0] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] += [List[0]] if List[1] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] += [List[1]] if List[2] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] += [List[2]] if List[3] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] += [List[3]] if List[4] == TAB_TOD_DEFINES_FAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_FAMILY not in self.ToolsDefTxtDatabase: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] != Value: EdkLogger.verbose("Line %d: No override allowed for the family of a tool chain: %s" % ((Index + 1), Name)) if List[4] == TAB_TOD_DEFINES_BUILDRULEFAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_BUILDRULEFAMILY not in self.ToolsDefTxtDatabase \ or List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: EdkLogger.verbose("Line %d: The family is not specified, but BuildRuleFamily is specified for the tool chain: %s" % ((Index + 1), Name)) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value
def LoadToolDefFile(self, FileName): FileContent = [] if os.path.isfile(FileName): try: F = open(FileName,'r') FileContent = F.readlines() except: EdkLogger.error("tools_def.txt parser", FILE_OPEN_FAILURE, ExtraData=FileName) else: EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=FileName) self.ToolsDefTxtDatabase = { TAB_TOD_DEFINES_TARGET : [], TAB_TOD_DEFINES_TOOL_CHAIN_TAG : [], TAB_TOD_DEFINES_TARGET_ARCH : [], TAB_TOD_DEFINES_COMMAND_TYPE : [] } for Index in range(len(FileContent)): Line = FileContent[Index].strip() if Line == "" or Line[0] == '#': continue NameValuePair = Line.split("=", 1) if len(NameValuePair) != 2: EdkLogger.warn("tools_def.txt parser", "Line %d: not correct assignment statement, skipped" % (Index + 1)) continue Name = NameValuePair[0].strip() Value = NameValuePair[1].strip() if Name == "IDENTIFIER": EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found identifier statement, skipped: %s" % ((Index + 1), Value)) continue MacroDefinition = gMacroDefPattern.findall(Name) if MacroDefinition != []: Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) MacroName = MacroDefinition[0].strip() self.MacroDictionary["DEF(%s)" % MacroName] = Value EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found macro: %s = %s" % ((Index + 1), MacroName, Value)) continue Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) List = Name.split('_') if len(List) != 5: EdkLogger.verbose("Line %d: Not a valid name of definition: %s" % ((Index + 1), Name)) continue elif List[4] == '*': EdkLogger.verbose("Line %d: '*' is not allowed in last field: %s" % ((Index + 1), Name)) continue else: self.ToolsDefTxtDictionary[Name] = Value if List[0] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] += [List[0]] if List[1] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] += [List[1]] if List[2] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] += [List[2]] if List[3] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] += [List[3]] if List[4] == TAB_TOD_DEFINES_FAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_FAMILY not in self.ToolsDefTxtDatabase: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] != Value: EdkLogger.verbose("Line %d: No override allowed for the family of a tool chain: %s" % ((Index + 1), Name)) if List[4] == TAB_TOD_DEFINES_BUILDRULEFAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_BUILDRULEFAMILY not in self.ToolsDefTxtDatabase \ or List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: EdkLogger.verbose("Line %d: The family is not specified, but BuildRuleFamily is specified for the tool chain: %s" % ((Index + 1), Name)) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE].sort() KeyList = [TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG, TAB_TOD_DEFINES_TARGET_ARCH, TAB_TOD_DEFINES_COMMAND_TYPE] for Index in range(3,-1,-1): for Key in dict(self.ToolsDefTxtDictionary): List = Key.split('_') if List[Index] == '*': for String in self.ToolsDefTxtDatabase[KeyList[Index]]: List[Index] = String NewKey = '%s_%s_%s_%s_%s' % tuple(List) if NewKey not in self.ToolsDefTxtDictionary: self.ToolsDefTxtDictionary[NewKey] = self.ToolsDefTxtDictionary[Key] continue del self.ToolsDefTxtDictionary[Key] elif List[Index] not in self.ToolsDefTxtDatabase[KeyList[Index]]: del self.ToolsDefTxtDictionary[Key]
def GenModuleHeader(self, ContainerFile): EdkLogger.debug(2, "Generate ModuleHeader ...") File = self.Identification.FileFullPath # # Update all defines item in database # RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] for Record in RecordSet: ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) if len(ValueList) != 2: RaiseParserError(Record[0], 'Defines', ContainerFile, '<Key> = <Value>', Record[2]) ID, Value1, Value2, Arch, LineNo = Record[3], ValueList[ 0], ValueList[1], Record[1], Record[2] SqlCommand = """update %s set Value1 = '%s', Value2 = '%s' where ID = %s""" % ( self.TblInf.Table, ConvertToSqlString2(Value1), ConvertToSqlString2(Value2), ID) self.TblInf.Exec(SqlCommand) for Arch in DataType.ARCH_LIST: ModuleHeader = InfHeader() ModuleHeader.FileName = self.Identification.FileName ModuleHeader.FullPath = self.Identification.FileFullPath DefineList = QueryDefinesItem2(self.TblInf, Arch, self.FileID) NotProcessedDefineList = [] for D in DefineList: if D[0] in ModuleHeader: ModuleHeader[D[0]] = GetSplitValueList(D[1])[0] else: NotProcessedDefineList.append(D) if ModuleHeader.ComponentType == "LIBRARY": Lib = LibraryClassClass() Lib.LibraryClass = ModuleHeader.Name Lib.SupModuleList = DataType.SUP_MODULE_LIST ModuleHeader.LibraryClass.append(Lib) # we need to make some key defines resolved first for D in NotProcessedDefineList: if D[0] == TAB_INF_DEFINES_LIBRARY_CLASS: List = GetSplitValueList(D[1], DataType.TAB_VALUE_SPLIT, 1) Lib = LibraryClassClass() Lib.LibraryClass = CleanString(List[0]) if len(List) == 1: Lib.SupModuleList = DataType.SUP_MODULE_LIST elif len(List) == 2: Lib.SupModuleList = GetSplitValueList( CleanString(List[1]), ' ') ModuleHeader.LibraryClass.append(Lib) elif D[0] == TAB_INF_DEFINES_CUSTOM_MAKEFILE: List = D[1].split(DataType.TAB_VALUE_SPLIT) if len(List) == 2: ModuleHeader.CustomMakefile[CleanString( List[0])] = CleanString(List[1]) else: RaiseParserError( D[1], 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>', D[2]) elif D[0] == TAB_INF_DEFINES_ENTRY_POINT: Image = ModuleExternImageClass() Image.ModuleEntryPoint = CleanString(D[1]) self.Module.ExternImages.append(Image) elif D[0] == TAB_INF_DEFINES_UNLOAD_IMAGE: Image = ModuleExternImageClass() Image.ModuleUnloadImage = CleanString(D[1]) self.Module.ExternImages.append(Image) elif D[0] == TAB_INF_DEFINES_CONSTRUCTOR: LibraryClass = ModuleExternLibraryClass() LibraryClass.Constructor = CleanString(D[1]) self.Module.ExternLibraries.append(LibraryClass) elif D[0] == TAB_INF_DEFINES_DESTRUCTOR: LibraryClass = ModuleExternLibraryClass() LibraryClass.Destructor = CleanString(D[1]) self.Module.ExternLibraries.append(LibraryClass) elif D[0] == TAB_INF_DEFINES_DEFINE: List = D[1].split(DataType.TAB_EQUAL_SPLIT) if len(List) != 2: RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <Word> = <Word>', D[2]) else: ModuleHeader.Define[CleanString( List[0])] = CleanString(List[1]) elif D[0] == TAB_INF_DEFINES_SPEC: List = D[1].split(DataType.TAB_EQUAL_SPLIT) if len(List) != 2: RaiseParserError(Item, 'SPEC of Defines', File, 'SPEC <Word> = <Version>', D[2]) else: ModuleHeader.Specification[CleanString( List[0])] = CleanString(List[1]) # # Get version of INF # if ModuleHeader.InfVersion != "": # EdkII inf VersionNumber = ModuleHeader.VersionNumber VersionString = ModuleHeader.VersionString if len(VersionNumber) > 0 and len(VersionString) == 0: EdkLogger.warn( 2000, 'VERSION_NUMBER depricated; INF file %s should be modified to use VERSION_STRING instead.' % self.Identification.FileFullPath) ModuleHeader.Version = VersionNumber if len(VersionString) > 0: if len(VersionNumber) > 0: EdkLogger.warn( 2001, 'INF file %s defines both VERSION_NUMBER and VERSION_STRING, using VERSION_STRING' % self.Identification.FileFullPath) ModuleHeader.Version = VersionString else: # Edk inf ModuleHeader.InfVersion = "0x00010000" if ModuleHeader.ComponentType in gComponentType2ModuleType: ModuleHeader.ModuleType = gComponentType2ModuleType[ ModuleHeader.ComponentType] elif ModuleHeader.ComponentType != '': EdkLogger.error("Parser", PARSER_ERROR, "Unsupported Edk component type [%s]" % ModuleHeader.ComponentType, ExtraData=File, RaiseError=EdkLogger.IsRaiseError) self.Module.Header[Arch] = ModuleHeader
def IncludeToolDefFile(self, FileName): FileContent = [] if os.path.isfile(FileName): try: F = open(FileName, 'r') FileContent = F.readlines() except: EdkLogger.error("tools_def.txt parser", FILE_OPEN_FAILURE, ExtraData=FileName) else: EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=FileName) for Index in range(len(FileContent)): Line = FileContent[Index].strip() if Line == "" or Line[0] == '#': continue if Line.startswith("!include"): IncFile = Line[8:].strip() Done, IncFile = self.ExpandMacros(IncFile) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=IncFile[4:-1], File=FileName, Line=Index+1) IncFile = NormPath(IncFile) if not os.path.isabs(IncFile): # # try WORKSPACE # IncFileTmp = PathClass(IncFile, GlobalData.gWorkspace) ErrorCode = IncFileTmp.Validate()[0] if ErrorCode != 0: # # try PACKAGES_PATH # IncFileTmp = mws.join(GlobalData.gWorkspace, IncFile) if not os.path.exists(IncFileTmp): # # try directory of current file # IncFileTmp = PathClass(IncFile, os.path.dirname(FileName)) ErrorCode = IncFileTmp.Validate()[0] if ErrorCode != 0: EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=IncFile) if type(IncFileTmp) is PathClass: IncFile = IncFileTmp.Path else: IncFile = IncFileTmp self.IncludeToolDefFile(IncFile) continue NameValuePair = Line.split("=", 1) if len(NameValuePair) != 2: EdkLogger.warn("tools_def.txt parser", "Line %d: not correct assignment statement, skipped" % (Index + 1)) continue Name = NameValuePair[0].strip() Value = NameValuePair[1].strip() if Name == "IDENTIFIER": EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found identifier statement, skipped: %s" % ((Index + 1), Value)) continue MacroDefinition = gMacroDefPattern.findall(Name) if MacroDefinition != []: Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) MacroName = MacroDefinition[0].strip() self.MacroDictionary["DEF(%s)" % MacroName] = Value EdkLogger.debug(EdkLogger.DEBUG_8, "Line %d: Found macro: %s = %s" % ((Index + 1), MacroName, Value)) continue Done, Value = self.ExpandMacros(Value) if not Done: EdkLogger.error("tools_def.txt parser", ATTRIBUTE_NOT_AVAILABLE, "Macro or Environment has not been defined", ExtraData=Value[4:-1], File=FileName, Line=Index+1) List = Name.split('_') if len(List) != 5: EdkLogger.verbose("Line %d: Not a valid name of definition: %s" % ((Index + 1), Name)) continue elif List[4] == '*': EdkLogger.verbose("Line %d: '*' is not allowed in last field: %s" % ((Index + 1), Name)) continue else: self.ToolsDefTxtDictionary[Name] = Value if List[0] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] += [List[0]] if List[1] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] += [List[1]] if List[2] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] += [List[2]] if List[3] != '*': self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] += [List[3]] if List[4] == TAB_TOD_DEFINES_FAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_FAMILY not in self.ToolsDefTxtDatabase: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY] = {} self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value elif self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] != Value: EdkLogger.verbose("Line %d: No override allowed for the family of a tool chain: %s" % ((Index + 1), Name)) if List[4] == TAB_TOD_DEFINES_BUILDRULEFAMILY and List[2] == '*' and List[3] == '*': if TAB_TOD_DEFINES_BUILDRULEFAMILY not in self.ToolsDefTxtDatabase \ or List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]: EdkLogger.verbose("Line %d: The family is not specified, but BuildRuleFamily is specified for the tool chain: %s" % ((Index + 1), Name)) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE])) self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH].sort() self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE].sort() KeyList = [TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG, TAB_TOD_DEFINES_TARGET_ARCH, TAB_TOD_DEFINES_COMMAND_TYPE] for Index in range(3, -1, -1): for Key in dict(self.ToolsDefTxtDictionary): List = Key.split('_') if List[Index] == '*': for String in self.ToolsDefTxtDatabase[KeyList[Index]]: List[Index] = String NewKey = '%s_%s_%s_%s_%s' % tuple(List) if NewKey not in self.ToolsDefTxtDictionary: self.ToolsDefTxtDictionary[NewKey] = self.ToolsDefTxtDictionary[Key] continue del self.ToolsDefTxtDictionary[Key] elif List[Index] not in self.ToolsDefTxtDatabase[KeyList[Index]]: del self.ToolsDefTxtDictionary[Key]
def GenModuleHeader(self, ContainerFile): EdkLogger.debug(2, "Generate ModuleHeader ...") File = self.Identification.FileFullPath # # Update all defines item in database # RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] for Record in RecordSet: ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) if len(ValueList) != 2: RaiseParserError(Record[0], 'Defines', ContainerFile, '<Key> = <Value>', Record[2]) ID, Value1, Value2, Arch, LineNo = Record[3], ValueList[0], ValueList[1], Record[1], Record[2] SqlCommand = """update %s set Value1 = '%s', Value2 = '%s' where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Value1), ConvertToSqlString2(Value2), ID) self.TblInf.Exec(SqlCommand) for Arch in DataType.ARCH_LIST: ModuleHeader = InfHeader() ModuleHeader.FileName = self.Identification.FileName ModuleHeader.FullPath = self.Identification.FileFullPath DefineList = QueryDefinesItem2(self.TblInf, Arch, self.FileID) NotProcessedDefineList = [] for D in DefineList: if D[0] in ModuleHeader: ModuleHeader[D[0]] = GetSplitValueList(D[1])[0] else: NotProcessedDefineList.append(D) if ModuleHeader.ComponentType == "LIBRARY": Lib = LibraryClassClass() Lib.LibraryClass = ModuleHeader.Name Lib.SupModuleList = DataType.SUP_MODULE_LIST ModuleHeader.LibraryClass.append(Lib) # we need to make some key defines resolved first for D in NotProcessedDefineList: if D[0] == TAB_INF_DEFINES_LIBRARY_CLASS: List = GetSplitValueList(D[1], DataType.TAB_VALUE_SPLIT, 1) Lib = LibraryClassClass() Lib.LibraryClass = CleanString(List[0]) if len(List) == 1: Lib.SupModuleList = DataType.SUP_MODULE_LIST elif len(List) == 2: Lib.SupModuleList = GetSplitValueList(CleanString(List[1]), ' ') ModuleHeader.LibraryClass.append(Lib) elif D[0] == TAB_INF_DEFINES_CUSTOM_MAKEFILE: List = D[1].split(DataType.TAB_VALUE_SPLIT) if len(List) == 2: ModuleHeader.CustomMakefile[CleanString(List[0])] = CleanString(List[1]) else: RaiseParserError(D[1], 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>', D[2]) elif D[0] == TAB_INF_DEFINES_ENTRY_POINT: Image = ModuleExternImageClass() Image.ModuleEntryPoint = CleanString(D[1]) self.Module.ExternImages.append(Image) elif D[0] == TAB_INF_DEFINES_UNLOAD_IMAGE: Image = ModuleExternImageClass() Image.ModuleUnloadImage = CleanString(D[1]) self.Module.ExternImages.append(Image) elif D[0] == TAB_INF_DEFINES_CONSTRUCTOR: LibraryClass = ModuleExternLibraryClass() LibraryClass.Constructor = CleanString(D[1]) self.Module.ExternLibraries.append(LibraryClass) elif D[0] == TAB_INF_DEFINES_DESTRUCTOR: LibraryClass = ModuleExternLibraryClass() LibraryClass.Destructor = CleanString(D[1]) self.Module.ExternLibraries.append(LibraryClass) elif D[0] == TAB_INF_DEFINES_DEFINE: List = D[1].split(DataType.TAB_EQUAL_SPLIT) if len(List) != 2: RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <Word> = <Word>', D[2]) else: ModuleHeader.Define[CleanString(List[0])] = CleanString(List[1]) elif D[0] == TAB_INF_DEFINES_SPEC: List = D[1].split(DataType.TAB_EQUAL_SPLIT) if len(List) != 2: RaiseParserError(Item, 'SPEC of Defines', File, 'SPEC <Word> = <Version>', D[2]) else: ModuleHeader.Specification[CleanString(List[0])] = CleanString(List[1]) # # Get version of INF # if ModuleHeader.InfVersion != "": # EdkII inf VersionNumber = ModuleHeader.VersionNumber VersionString = ModuleHeader.VersionString if len(VersionNumber) > 0 and len(VersionString) == 0: EdkLogger.warn(2000, 'VERSION_NUMBER depricated; INF file %s should be modified to use VERSION_STRING instead.' % self.Identification.FileFullPath) ModuleHeader.Version = VersionNumber if len(VersionString) > 0: if len(VersionNumber) > 0: EdkLogger.warn(2001, 'INF file %s defines both VERSION_NUMBER and VERSION_STRING, using VERSION_STRING' % self.Identification.FileFullPath) ModuleHeader.Version = VersionString else: # Edk inf ModuleHeader.InfVersion = "0x00010000" if ModuleHeader.ComponentType in gComponentType2ModuleType: ModuleHeader.ModuleType = gComponentType2ModuleType[ModuleHeader.ComponentType] elif ModuleHeader.ComponentType != '': EdkLogger.error("Parser", PARSER_ERROR, "Unsupported Edk component type [%s]" % ModuleHeader.ComponentType, ExtraData=File, RaiseError=EdkLogger.IsRaiseError) self.Module.Header[Arch] = ModuleHeader
def GenPcds(self, ContainerFile): EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) Pcds = {} PcdToken = {} # # Get all Guids # RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] # # Go through each arch # for Arch in self.SupArchList: for Record in RecordSet1: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: if self.Module.Header[Arch].LibraryClass != {}: pass (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet2: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet3: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet4: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) for Record in RecordSet5: if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON: (TokenGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], "", ContainerFile, Record[2]) MergeArches(Pcds, (TokenGuidCName, TokenName, Value, Type), Arch) PcdToken[Record[3]] = (TokenGuidCName, TokenName) # # Update to database # if self.IsToDatabase: for Key in PcdToken.keys(): SqlCommand = """update %s set Value2 = '%s' where ID = %s""" % (self.TblInf.Table, ".".join((PcdToken[Key][0], PcdToken[Key][1])), Key) self.TblInf.Exec(SqlCommand) for Key in Pcds.keys(): Pcd = PcdClass() Pcd.CName = Key[1] Pcd.TokenSpaceGuidCName = Key[0] Pcd.DefaultValue = Key[2] Pcd.ItemType = Key[3] Pcd.SupArchList = Pcds[Key] self.Module.PcdCodes.append(Pcd)