def GenSection(self, OutputPath, ModuleName, SecNum, keyStringList, FfsFile=None, Dict=None, IsMakefile=False): if self.ExpressionProcessed == False: self.Expression = self.Expression.replace("\n", " ").replace("\r", " ") ExpList = self.Expression.split() for Exp in ExpList: if Exp.upper() not in ('AND', 'OR', 'NOT', 'TRUE', 'FALSE', 'SOR', 'BEFORE', 'AFTER', 'END'): GuidStr = self.__FindGuidValue(Exp) if GuidStr is None: EdkLogger.error( "GenFds", RESOURCE_NOT_AVAILABLE, "Depex GUID %s could not be found in build DB! (ModuleName: %s)" % (Exp, ModuleName)) self.Expression = self.Expression.replace(Exp, GuidStr) self.Expression = self.Expression.strip() self.ExpressionProcessed = True if self.DepexType == 'PEI_DEPEX_EXP': ModuleType = SUP_MODULE_PEIM SecType = BINARY_FILE_TYPE_PEI_DEPEX elif self.DepexType == 'DXE_DEPEX_EXP': ModuleType = SUP_MODULE_DXE_DRIVER SecType = BINARY_FILE_TYPE_DXE_DEPEX elif self.DepexType == 'SMM_DEPEX_EXP': ModuleType = SUP_MODULE_DXE_SMM_DRIVER SecType = BINARY_FILE_TYPE_SMM_DEPEX else: EdkLogger.error( "GenFds", FORMAT_INVALID, "Depex type %s is not valid for module %s" % (self.DepexType, ModuleName)) InputFile = os.path.join( OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + '.depex') InputFile = os.path.normpath(InputFile) Depex = DependencyExpression(self.Expression, ModuleType) Depex.Generate(InputFile) OutputFile = os.path.join( OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + '.dpx') OutputFile = os.path.normpath(OutputFile) GenFdsGlobalVariable.GenerateSection( OutputFile, [InputFile], Section.Section.SectionType.get(SecType), IsMakefile=IsMakefile) return [OutputFile], self.Alignment
def GetFinalTargetSuffixMap(self): if not self.InfModule or not self.CurrentArch: return [] if not self.FinalTargetSuffixMap: FinalBuildTargetList = GenFdsGlobalVariable.GetModuleCodaTargetList(self.InfModule, self.CurrentArch) for File in FinalBuildTargetList: self.FinalTargetSuffixMap.setdefault(os.path.splitext(File)[1], []).append(File) # Check if current INF module has DEPEX if '.depex' not in self.FinalTargetSuffixMap and self.InfModule.ModuleType != "USER_DEFINED" \ and not self.InfModule.DxsFile and not self.InfModule.LibraryClass: ModuleType = self.InfModule.ModuleType PlatformDataBase = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, self.CurrentArch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] if ModuleType != DataType.SUP_MODULE_USER_DEFINED: for LibraryClass in PlatformDataBase.LibraryClasses.GetKeys(): if LibraryClass.startswith("NULL") and PlatformDataBase.LibraryClasses[LibraryClass, ModuleType]: self.InfModule.LibraryClasses[LibraryClass] = PlatformDataBase.LibraryClasses[LibraryClass, ModuleType] StrModule = str(self.InfModule) PlatformModule = None if StrModule in PlatformDataBase.Modules: PlatformModule = PlatformDataBase.Modules[StrModule] for LibraryClass in PlatformModule.LibraryClasses: if LibraryClass.startswith("NULL"): self.InfModule.LibraryClasses[LibraryClass] = PlatformModule.LibraryClasses[LibraryClass] DependencyList = [self.InfModule] LibraryInstance = {} DepexList = [] while len(DependencyList) > 0: Module = DependencyList.pop(0) if not Module: continue for Dep in Module.Depex[self.CurrentArch, ModuleType]: if DepexList != []: DepexList.append('AND') DepexList.append('(') DepexList.extend(Dep) if DepexList[-1] == 'END': # no need of a END at this time DepexList.pop() DepexList.append(')') if 'BEFORE' in DepexList or 'AFTER' in DepexList: break for LibName in Module.LibraryClasses: if LibName in LibraryInstance: continue if PlatformModule and LibName in PlatformModule.LibraryClasses: LibraryPath = PlatformModule.LibraryClasses[LibName] else: LibraryPath = PlatformDataBase.LibraryClasses[LibName, ModuleType] if not LibraryPath: LibraryPath = Module.LibraryClasses[LibName] if not LibraryPath: continue LibraryModule = GenFdsGlobalVariable.WorkSpace.BuildObject[LibraryPath, self.CurrentArch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] LibraryInstance[LibName] = LibraryModule DependencyList.append(LibraryModule) if DepexList: Dpx = DependencyExpression(DepexList, ModuleType, True) if len(Dpx.PostfixNotation) != 0: # It means this module has DEPEX self.FinalTargetSuffixMap['.depex'] = [os.path.join(self.EfiOutputPath, self.BaseName) + '.depex'] return self.FinalTargetSuffixMap