]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/FfsFileStatement.py
License header updated to match correct format.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FfsFileStatement.py
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