1 ## @file 2 # process FFS generation from FILE statement 3 # 4 # Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> 5 # 6 # This program and the accompanying materials 7 # are licensed and made available under the terms and conditions of the BSD License 8 # which accompanies this distribution. The full text of the license may be found at 9 # http://opensource.org/licenses/bsd-license.php 10 # 11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 # 14 15 ## 16 # Import Modules 17 # 18 import Ffs 19 import Rule 20 import Common.LongFilePathOs as os 21 import StringIO 22 import subprocess 23 24 from GenFdsGlobalVariable import GenFdsGlobalVariable 25 from CommonDataClass.FdfClass import FileStatementClassObject 26 from Common import EdkLogger 27 from Common.BuildToolError import * 28 from Common.Misc import GuidStructureByteArrayToGuidString 29 from GuidSection import GuidSection 30 from FvImageSection import FvImageSection 31 32 ## generate FFS from FILE 33 # 34 # 35 class FileStatement (FileStatementClassObject) : 36 ## The constructor 37 # 38 # @param self The object pointer 39 # 40 def __init__(self): 41 FileStatementClassObject.__init__(self) 42 self.CurrentLineNum = None 43 self.CurrentLineContent = None 44 self.FileName = None 45 self.InfFileName = None 46 47 ## GenFfs() method 48 # 49 # Generate FFS 50 # 51 # @param self The object pointer 52 # @param Dict dictionary contains macro and value pair 53 # @param FvChildAddr Array of the inside FvImage base address 54 # @param FvParentAddr Parent Fv base address 55 # @retval string Generated FFS file name 56 # 57 def GenFfs(self, Dict = {}, FvChildAddr=[], FvParentAddr=None): 58 59 if self.NameGuid != None and self.NameGuid.startswith('PCD('): 60 PcdValue = GenFdsGlobalVariable.GetPcdValue(self.NameGuid) 61 if len(PcdValue) == 0: 62 EdkLogger.error("GenFds", GENFDS_ERROR, '%s NOT defined.' \ 63 % (self.NameGuid)) 64 if PcdValue.startswith('{'): 65 PcdValue = GuidStructureByteArrayToGuidString(PcdValue) 66 RegistryGuidStr = PcdValue 67 if len(RegistryGuidStr) == 0: 68 EdkLogger.error("GenFds", GENFDS_ERROR, 'GUID value for %s in wrong format.' \ 69 % (self.NameGuid)) 70 self.NameGuid = RegistryGuidStr 71 72 OutputDir = os.path.join(GenFdsGlobalVariable.FfsDir, self.NameGuid) 73 if not os.path.exists(OutputDir): 74 os.makedirs(OutputDir) 75 76 Dict.update(self.DefineVarDict) 77 SectionAlignments = None 78 if self.FvName != None : 79 Buffer = StringIO.StringIO('') 80 if self.FvName.upper() not in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): 81 EdkLogger.error("GenFds", GENFDS_ERROR, "FV (%s) is NOT described in FDF file!" % (self.FvName)) 82 Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper()) 83 FileName = Fv.AddToBuffer(Buffer) 84 SectionFiles = [FileName] 85 86 elif self.FdName != None: 87 if self.FdName.upper() not in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): 88 EdkLogger.error("GenFds", GENFDS_ERROR, "FD (%s) is NOT described in FDF file!" % (self.FdName)) 89 Fd = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper()) 90 FileName = Fd.GenFd() 91 SectionFiles = [FileName] 92 93 elif self.FileName != None: 94 self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName) 95 #Replace $(SAPCE) with real space 96 self.FileName = self.FileName.replace('$(SPACE)', ' ') 97 SectionFiles = [GenFdsGlobalVariable.MacroExtend(self.FileName, Dict)] 98 99 else: 100 SectionFiles = [] 101 Index = 0 102 SectionAlignments = [] 103 for section in self.SectionList : 104 Index = Index + 1 105 SecIndex = '%d' %Index 106 # process the inside FvImage from FvSection or GuidSection 107 if FvChildAddr != []: 108 if isinstance(section, FvImageSection): 109 section.FvAddr = FvChildAddr.pop(0) 110 elif isinstance(section, GuidSection): 111 section.FvAddr = FvChildAddr 112 if FvParentAddr != None and isinstance(section, GuidSection): 113 section.FvParentAddr = FvParentAddr 114 115 if self.KeepReloc == False: 116 section.KeepReloc = False 117 sectList, align = section.GenSection(OutputDir, self.NameGuid, SecIndex, self.KeyStringList, None, Dict) 118 if sectList != []: 119 for sect in sectList: 120 SectionFiles.append(sect) 121 SectionAlignments.append(align) 122 123 # 124 # Prepare the parameter 125 # 126 FfsFileOutput = os.path.join(OutputDir, self.NameGuid + '.ffs') 127 GenFdsGlobalVariable.GenerateFfs(FfsFileOutput, SectionFiles, 128 Ffs.Ffs.FdfFvFileTypeToFileType.get(self.FvFileType), 129 self.NameGuid, 130 Fixed=self.Fixed, 131 CheckSum=self.CheckSum, 132 Align=self.Alignment, 133 SectionAlign=SectionAlignments 134 ) 135 136 return FfsFileOutput 137 138 139 140