a689988cc181f45383c05e54462b2f01b7fe4c36
[people/mcb30/basetools.git] / Source / Python / GenFds / GenFdsGlobalVariable.py
1 ## @file\r
2 # Global variables for GenFds\r
3 #\r
4 #  Copyright (c) 2007, Intel Corporation\r
5 #\r
6 #  All rights reserved. This program and the accompanying materials\r
7 #  are licensed and made available under the terms and conditions of the BSD License\r
8 #  which accompanies this distribution.  The full text of the license may be found at\r
9 #  http://opensource.org/licenses/bsd-license.php\r
10 #\r
11 #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13 #\r
14 \r
15 ##\r
16 # Import Modules\r
17 #\r
18 import os\r
19 import sys\r
20 import subprocess\r
21 from Common import BuildToolError\r
22 from Common import EdkLogger\r
23 \r
24 ## Global variables\r
25 #\r
26 #\r
27 class GenFdsGlobalVariable:\r
28     FvDir = ''\r
29     OutputDirDict = {}\r
30     BinDir = ''\r
31     # will be FvDir + os.sep + 'Ffs'\r
32     FfsDir = ''\r
33     FdfParser = None\r
34     LibDir = ''\r
35     WorkSpace = None\r
36     WorkSpaceDir = ''\r
37     EdkSourceDir = ''\r
38     OutputDirFromDscDict = {}\r
39     TargetName = ''\r
40     ToolChainTag = ''\r
41     RuleDict = {}\r
42     ArchList = None\r
43     VtfDict = {}\r
44     ActivePlatform = None\r
45     FvAddressFileName = ''\r
46     VerboseMode = False\r
47     DebugLevel = -1\r
48     SharpCounter = 0\r
49     SharpNumberPerLine = 40\r
50 \r
51     ## SetDir()\r
52     #\r
53     #   @param  OutputDir           Output directory\r
54     #   @param  FdfParser           FDF contents parser\r
55     #   @param  Workspace           The directory of workspace\r
56     #   @param  ArchList            The Arch list of platform\r
57     #\r
58     def SetDir (OutputDir, FdfParser, WorkSpace, ArchList):\r
59         GenFdsGlobalVariable.VerboseLogger( "GenFdsGlobalVariable.OutputDir :%s" %OutputDir)\r
60 #        GenFdsGlobalVariable.OutputDirDict = OutputDir\r
61         GenFdsGlobalVariable.FdfParser = FdfParser\r
62         GenFdsGlobalVariable.WorkSpace = WorkSpace\r
63         GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], 'FV')\r
64         if not os.path.exists(GenFdsGlobalVariable.FvDir) :\r
65             os.makedirs(GenFdsGlobalVariable.FvDir)\r
66         GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs')\r
67         if not os.path.exists(GenFdsGlobalVariable.FfsDir) :\r
68             os.makedirs(GenFdsGlobalVariable.FfsDir)\r
69         if ArchList != None:\r
70             GenFdsGlobalVariable.ArchList = ArchList\r
71         \r
72         T_CHAR_LF = '\n'    \r
73         #\r
74         # Create FV Address inf file\r
75         #\r
76         GenFdsGlobalVariable.FvAddressFileName = os.path.join(GenFdsGlobalVariable.FfsDir, 'FvAddress.inf')\r
77         FvAddressFile = open (GenFdsGlobalVariable.FvAddressFileName, 'w')\r
78         #\r
79         # Add [Options]\r
80         #\r
81         FvAddressFile.writelines("[options]" + T_CHAR_LF)\r
82         BsAddress = '0'\r
83         for Arch in ArchList:\r
84             if GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Platform.Header[Arch].BsBaseAddress:\r
85                 BsAddress = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Platform.Header[Arch].BsBaseAddress\r
86                 break\r
87         \r
88         FvAddressFile.writelines("EFI_BOOT_DRIVER_BASE_ADDRESS = " + \\r
89                                        BsAddress          + \\r
90                                        T_CHAR_LF)\r
91                                        \r
92         RtAddress = '0'\r
93         for Arch in ArchList:\r
94             if GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Platform.Header[Arch].RtBaseAddress:\r
95                 RtAddress = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Platform.Header[Arch].RtBaseAddress\r
96                 \r
97         FvAddressFile.writelines("EFI_RUNTIME_DRIVER_BASE_ADDRESS = " + \\r
98                                        RtAddress          + \\r
99                                        T_CHAR_LF)\r
100         \r
101         FvAddressFile.close()\r
102 \r
103     ## ReplaceWorkspaceMacro()\r
104     #\r
105     #   @param  String           String that may contain macro\r
106     #\r
107     def ReplaceWorkspaceMacro(String):\r
108         Str = String.replace('$(WORKSPACE)', GenFdsGlobalVariable.WorkSpaceDir)\r
109         if os.path.exists(Str):\r
110             if not os.path.isabs(Str):\r
111                 Str = os.path.abspath(Str)\r
112         else:\r
113             Str = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, String)\r
114         return os.path.normpath(Str)\r
115     \r
116     def CallExternalTool (cmd, errorMess):\r
117         \r
118         if type(cmd) not in (tuple, list):\r
119             GenFdsGlobalVariable.ErrorLogger("ToolError!  Invalid parameter type in call to CallExternalTool")\r
120 \r
121         if GenFdsGlobalVariable.DebugLevel != -1:\r
122             cmd += ('-d', str(GenFdsGlobalVariable.DebugLevel))\r
123             GenFdsGlobalVariable.InfLogger (cmd)\r
124             \r
125         if GenFdsGlobalVariable.VerboseMode:\r
126             cmd += ('-v',)\r
127             GenFdsGlobalVariable.InfLogger (cmd)\r
128         else:\r
129             sys.stdout.write ('#')\r
130             sys.stdout.flush()\r
131             GenFdsGlobalVariable.SharpCounter = GenFdsGlobalVariable.SharpCounter + 1\r
132             if GenFdsGlobalVariable.SharpCounter % GenFdsGlobalVariable.SharpNumberPerLine == 0:\r
133                 sys.stdout.write('\n')\r
134         #GenFdsGlobalVariable.VerboseLogger(cmd)\r
135         PopenObject = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr= subprocess.PIPE)\r
136         (out, error) = PopenObject.communicate()\r
137 \r
138         while PopenObject.returncode == None :\r
139             PopenObject.wait()\r
140         if PopenObject.returncode != 0 or GenFdsGlobalVariable.VerboseMode or GenFdsGlobalVariable.DebugLevel != -1:\r
141             GenFdsGlobalVariable.InfLogger ("Return Value = %d" %PopenObject.returncode)\r
142             GenFdsGlobalVariable.InfLogger (out)\r
143             GenFdsGlobalVariable.InfLogger (error)\r
144             if PopenObject.returncode != 0:\r
145                 GenFdsGlobalVariable.InfLogger (errorMess)\r
146                 sys.exit(1)\r
147 \r
148     def VerboseLogger (msg):\r
149         EdkLogger.verbose(msg)\r
150 \r
151     def InfLogger (msg):\r
152         EdkLogger.info(msg)\r
153         \r
154     def ErrorLogger (msg, File = None, Line = None, ExtraData = None):\r
155         EdkLogger.error('GenFds', BuildToolError.GENFDS_ERROR, msg, File, Line, ExtraData)\r
156 \r
157     def DebugLogger (Level, msg):\r
158         EdkLogger.debug(Level, msg)\r
159 \r
160     ## ReplaceWorkspaceMacro()\r
161     #\r
162     #   @param  Str           String that may contain macro\r
163     #   @param  MacroDict     Dictionary that contains macro value pair\r
164     #\r
165     def MacroExtend (Str, MacroDict = {}, Arch = 'COMMON'):\r
166         if Str == None :\r
167             return None\r
168         \r
169         Dict = {'$(WORKSPACE)'   : GenFdsGlobalVariable.WorkSpaceDir,\r
170                 '$(EDK_SOURCE)'  : GenFdsGlobalVariable.EdkSourceDir,\r
171 #                '$(OUTPUT_DIRECTORY)': GenFdsGlobalVariable.OutputDirFromDsc,\r
172                 '$(TARGET)' : GenFdsGlobalVariable.TargetName,\r
173                 '$(TOOL_CHAIN_TAG)' : GenFdsGlobalVariable.ToolChainTag\r
174                }\r
175         OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[GenFdsGlobalVariable.ArchList[0]]\r
176         if Arch != 'COMMON' and Arch in GenFdsGlobalVariable.ArchList:\r
177             OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[Arch]\r
178             \r
179         Dict['$(OUTPUT_DIRECTORY)'] = OutputDir\r
180             \r
181         if MacroDict != None  and len (MacroDict) != 0:\r
182             Dict.update(MacroDict)\r
183 \r
184         for key in Dict.keys():\r
185             if Str.find(key) >= 0 :\r
186                 Str = Str.replace (key, Dict[key])\r
187         \r
188         if Str.find('$(ARCH)') >= 0:\r
189             if len(GenFdsGlobalVariable.ArchList) == 1:\r
190                 Str = Str.replace('$(ARCH)', GenFdsGlobalVariable.ArchList[0])\r
191             else:\r
192                 GenFdsGlobalVariable.InfLogger ("\nNo way to determine $(ARCH) for %s\n" % Str)\r
193                 sys.exit(1)\r
194             \r
195         return Str\r
196 \r
197 \r
198     SetDir = staticmethod(SetDir)\r
199     ReplaceWorkspaceMacro = staticmethod(ReplaceWorkspaceMacro)\r
200     CallExternalTool = staticmethod(CallExternalTool)\r
201     VerboseLogger = staticmethod(VerboseLogger)\r
202     InfLogger = staticmethod(InfLogger)\r
203     ErrorLogger = staticmethod(ErrorLogger)\r
204     DebugLogger = staticmethod(DebugLogger)\r
205     MacroExtend = staticmethod (MacroExtend)\r