GenFds Tool: Add FdfClassObject.
[people/mcb30/basetools.git] / Source / Python / GenFds / GenFds.py
1 from optparse import OptionParser\r
2 import sys\r
3 import os\r
4 import FdfParser\r
5 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
6 import Common.EdkIIWorkspaceBuild\r
7 import RuleComplexFile\r
8 from EfiSection import EfiSection\r
9 import StringIO\r
10 import Common.TargetTxtClassObject\r
11 import Common.DataType\r
12 \r
13 versionNumber = "1.0"\r
14 __version__ = "%prog Version " + versionNumber\r
15 __copyright__ = "Copyright (c) 2007, Intel Corporation  All rights reserved."\r
16 \r
17 \r
18 def main():\r
19     global options\r
20     options = myOptionParser()\r
21     global workspace\r
22     workspace = ""\r
23     ArchList = None\r
24     \r
25     if (options.workspace == None):\r
26         print "ERROR: E0000: WORKSPACE not defined.\n  Please set the WORKSPACE environment variable to the location of the EDK II install directory."\r
27         sys.exit(1)\r
28     else:\r
29         workspace = options.workspace\r
30         GenFdsGlobalVariable.WorkSpaceDir = workspace\r
31         if (options.debug):\r
32             print "Using Workspace:", workspace\r
33 \r
34     if (options.filename):\r
35         fdfFilename = options.filename\r
36     else:\r
37         print "ERROR: E0001 - You must specify an input filename"\r
38         sys.exit(1)\r
39 \r
40     if not os.path.exists(fdfFilename):\r
41         print "ERROR: E1000: File %s not found" % (filename)\r
42         sys.exit(1)\r
43 \r
44     if (options.activePlatform):\r
45         activePlatform = options.activePlatform\r
46     else :\r
47         Target = Common.TargetTxtClassObject.TargetTxtDict(GenFdsGlobalVariable.WorkSpaceDir)\r
48         activePlatform = Target.TargetTxtDictionary[Common.DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM]\r
49         \r
50     GenFdsGlobalVariable.ActivePlatform = activePlatform\r
51 \r
52         \r
53     if (options.outputDir):\r
54         outputDir = options.outputDir\r
55     else:\r
56         print "ERROR: E0001 - You must specify an Output directory"\r
57         sys.exit(1)\r
58         \r
59     if (options.archList) :\r
60         archList = options.archList.split(',')\r
61     else:\r
62         Target = Common.TargetTxtClassObject.TargetTxtDict(GenFdsGlobalVariable.WorkSpaceDir)\r
63         archList = Target.TargetTxtDictionary['TARGET_ARCH']\r
64         \r
65     """ Parse Fdf file """\r
66     fdfParser = FdfParser.FdfParser(fdfFilename)\r
67     fdfParser.ParseFile()\r
68     \r
69     """call workspace build create database"""\r
70     os.environ["WORKSPACE"] = workspace\r
71     buildWorkSpace = Common.EdkIIWorkspaceBuild.WorkspaceBuild(activePlatform, workspace)\r
72     buildWorkSpace.GenBuildDatabase()\r
73     \r
74     """Call GenFds"""\r
75     GenFds.GenFd(outputDir, fdfParser, buildWorkSpace, archList)\r
76     \r
77 def myOptionParser():\r
78     usage = "%prog [options] -f input_file"\r
79     parser = OptionParser(usage=usage,description=__copyright__,version="%prog " + str(versionNumber))\r
80     parser.add_option("-f", "--file", dest="filename", help="Name of FDF file to convert")\r
81     parser.add_option("-a", "--arch", dest="archList", help="comma separated list containing one or more of: IA32, X64, IPF or EBC which should be built, overrides target.txt?s TARGET_ARCH")\r
82     parser.add_option("-i", "--interactive", action="store_true", dest="interactive", default=False, help="Set Interactive mode, user must approve each change.")\r
83     parser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbose", help="Do not print any messages, just return either 0 for succes or 1 for failure")\r
84     parser.add_option("-v", "--verbose", action="count", dest="verbose", default=0, help="Do not print any messages, just return either 0 for succes or 1 for failure")\r
85     parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help="Enable printing of debug messages.")\r
86     parser.add_option("-p", "--platform", dest="activePlatform", help="Set the Active platform")\r
87     parser.add_option("-w", "--workspace", dest="workspace", default=str(os.environ.get('WORKSPACE')), help="Enable printing of debug messages.")\r
88     parser.add_option("-o", "--outputDir", dest="outputDir", help="Name of Output directory")\r
89     (options, args) = parser.parse_args()\r
90     return options\r
91 \r
92 \r
93 class GenFds :\r
94     FdfParsef = None\r
95     FvBinDict = {}      # FvName in Fdf, FvBinFile\r
96     \r
97     def GenFd (OutputDir, FdfParser, WorkSpace, ArchList):\r
98         GenFdsGlobalVariable.SetDir (OutputDir, FdfParser, WorkSpace, ArchList)\r
99         """Set Default Rule! Hard code here will be move"""\r
100         verSection1 = EfiSection()\r
101         verSection1.BuildNum = "$(BUILD_NUMBER)"\r
102         verSection1.SectionType = "VERSION"\r
103         verSection1.Filename = "$(INF_VERSION)"\r
104         verSection1.VersionNum = "$(INF_VERSION)"\r
105         \r
106         uiSection1 = EfiSection()\r
107         uiSection1.SectionType = 'UI'\r
108         uiSection1.Filename = "$(INF_VERSION)"\r
109         uiSection1.VersionNum = "$(INF_VERSION)"\r
110 \r
111         dataSection = EfiSection()\r
112         dataSection.SectionType = "PE32"\r
113         dataSection.Filename = "$(INF_OUTPUT)/$(MODULE_NAME).efi"\r
114 \r
115         ruleComplexFile1 = RuleComplexFile.RuleComplexFile()\r
116         ruleComplexFile1.Alignment = 16\r
117         ruleComplexFile1.Arch = 'COMMON'\r
118         ruleComplexFile1.CheckSum = True\r
119         ruleComplexFile1.Fixed = True\r
120         ruleComplexFile1.FvType = "APPLICATION"\r
121         ruleComplexFile1.ModuleType = "UEFI_APPLICATION"\r
122         ruleComplexFile1.NameGuid = "$(MODULE_NAME)"\r
123         ruleComplexFile1.TemplateName = ''\r
124         ruleComplexFile1.SectionList = [uiSection1, verSection1, dataSection]\r
125         GenFdsGlobalVariable.SetDefaultRule(ruleComplexFile1)\r
126         \r
127         for item in GenFdsGlobalVariable.FdfParser.profile.FdDict.keys():\r
128             fd = GenFdsGlobalVariable.FdfParser.profile.FdDict[item]\r
129             fd.GenFd(GenFds.FvBinDict)\r
130         for FvName in GenFdsGlobalVariable.FdfParser.profile.FvDict.keys():\r
131             if not FvName in GenFds.FvBinDict.keys():\r
132                 Buffer = StringIO.StringIO()\r
133                 fv = GenFdsGlobalVariable.FdfParser.profile.FvDict[FvName]\r
134                 fv.AddToBuffer(Buffer)\r
135                 Buffer.close()\r
136                 \r
137         #print "#########   Gen Capsule              ####################"\r
138         for capsule in GenFdsGlobalVariable.FdfParser.profile.CapsuleList:\r
139             capsule.GenCapsule()\r
140 \r
141 ##        for vtf in GenFdsGlobalVariable.FdfParser.profile.VtfList:\r
142 ##            vtf.GenVtf()\r
143 \r
144     #Finish GenFd()\r
145     def GenVTFList() :\r
146         for item in GenFdsGlobalVariable.FdfParser.profile.VtfList:\r
147             for comp in item.ComponentStatementList:\r
148                 if comp.CompLoc != None :\r
149                     compList.append(comp.Loc)\r
150             GenFdsGlobalVariable.VtfDict[item.UiName] = compList\r
151     #\r
152     # Define GenFd as static function\r
153     #\r
154     GenFd = staticmethod(GenFd)\r
155 \r
156 if __name__ == '__main__':\r
157     \r
158     main()\r