e0703cfd22485a0f65563bf1a61341ef87e870b3
[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     OutputDir = ''\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     OutputDirFromDsc = ''\r
39     TargetName = ''\r
40     ToolChainTag = ''\r
41     RuleDict = {}\r
42     DefaultRule = None\r
43     ArchList = None\r
44     VtfDict = {}\r
45     ActivePlatform = None\r
46     FvAddressFileName = ''\r
47     VerboseMode = False\r
48     DebugLevel = -1\r
49     SharpCounter = 0\r
50     SharpNumberPerLine = 40\r
51 \r
52     ## SetDir()\r
53     #\r
54     #   @param  OutputDir           Output directory\r
55     #   @param  FdfParser           FDF contents parser\r
56     #   @param  Workspace           The directory of workspace\r
57     #   @param  ArchList            The Arch list of platform\r
58     #\r
59     def SetDir (OutputDir, FdfParser, WorkSpace, ArchList):\r
60         GenFdsGlobalVariable.VerboseLogger( "GenFdsGlobalVariable.OutputDir :%s" %OutputDir)\r
61         GenFdsGlobalVariable.OutputDir = os.path.normpath(OutputDir)\r
62         GenFdsGlobalVariable.FdfParser = FdfParser\r
63         GenFdsGlobalVariable.WorkSpace = WorkSpace\r
64         GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDir, 'FV')\r
65         if not os.path.exists(GenFdsGlobalVariable.FvDir) :\r
66             os.makedirs(GenFdsGlobalVariable.FvDir)\r
67         GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs')\r
68         if not os.path.exists(GenFdsGlobalVariable.FfsDir) :\r
69             os.makedirs(GenFdsGlobalVariable.FfsDir)\r
70         if ArchList != None:\r
71             GenFdsGlobalVariable.ArchList = ArchList\r
72         \r
73         T_CHAR_LF = '\n'    \r
74         #\r
75         # Create FV Address inf file\r
76         #\r
77         GenFdsGlobalVariable.FvAddressFileName = os.path.join(GenFdsGlobalVariable.FfsDir, 'FvAddress.inf')\r
78         FvAddressFile = open (GenFdsGlobalVariable.FvAddressFileName, 'w')\r
79         #\r
80         # Add [Options]\r
81         #\r
82         FvAddressFile.writelines("[options]" + T_CHAR_LF)\r
83         BsAddress = '0'\r
84         if 'BsBaseAddress' in GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary.keys():\r
85             BsAddressList = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary['BsBaseAddress']\r
86             if BsAddressList != []:\r
87                 BsAddress = BsAddressList[0]\r
88         \r
89         FvAddressFile.writelines("EFI_BOOT_DRIVER_BASE_ADDRESS = " + \\r
90                                        BsAddress          + \\r
91                                        T_CHAR_LF)\r
92                                        \r
93         RtAddress = '0'\r
94         if 'RtBaseAddress' in GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary.keys():\r
95             RtAddressList = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary['RtBaseAddress']\r
96             if RtAddressList != []:\r
97                 RtAddress = RtAddressList[0]\r
98                 \r
99         FvAddressFile.writelines("EFI_RUNTIME_DRIVER_BASE_ADDRESS = " + \\r
100                                        RtAddress          + \\r
101                                        T_CHAR_LF)\r
102         \r
103         FvAddressFile.close()\r
104 \r
105     \r
106     ## SetDefaultRule()\r
107     #\r
108     #   @param  Rule           Rule object to generate FFS\r
109     #    \r
110     def SetDefaultRule (Rule) :\r
111         GenFdsGlobalVariable.DefaultRule = Rule\r
112 \r
113     ## ReplaceWorkspaceMacro()\r
114     #\r
115     #   @param  String           String that may contain macro\r
116     #\r
117     def ReplaceWorkspaceMacro(String):\r
118         Str = String.replace('$(WORKSPACE)', GenFdsGlobalVariable.WorkSpaceDir)\r
119         if os.path.exists(Str):\r
120             if not os.path.isabs(Str):\r
121                 Str = os.path.abspath(Str)\r
122         else:\r
123             Str = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, String)\r
124         return os.path.normpath(Str)\r
125     \r
126     def CallExternalTool (cmd, errorMess):\r
127 \r
128         if type(cmd) not in (tuple, list):\r
129             GenFdsGlobalVariable.ErrorLogger("ToolError!  Invalid parameter type in call to CallExternalTool")\r
130 \r
131         if GenFdsGlobalVariable.DebugLevel != -1:\r
132             cmd += ('-d', str(GenFdsGlobalVariable.DebugLevel))\r
133             GenFdsGlobalVariable.InfLogger (cmd)\r
134         \r
135         if GenFdsGlobalVariable.VerboseMode:\r
136             cmd += ('-v',)\r
137             GenFdsGlobalVariable.InfLogger (cmd)\r
138         else:\r
139             sys.stdout.write ('#')\r
140             sys.stdout.flush()\r
141             GenFdsGlobalVariable.SharpCounter = GenFdsGlobalVariable.SharpCounter + 1\r
142             if GenFdsGlobalVariable.SharpCounter % GenFdsGlobalVariable.SharpNumberPerLine == 0:\r
143                 sys.stdout.write('\n')\r
144         #GenFdsGlobalVariable.VerboseLogger(cmd)\r
145         PopenObject = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr= subprocess.PIPE)\r
146         (out, error) = PopenObject.communicate()\r
147 \r
148         while PopenObject.returncode == None :\r
149             PopenObject.wait()\r
150         if PopenObject.returncode != 0 or GenFdsGlobalVariable.VerboseMode or GenFdsGlobalVariable.DebugLevel != -1:\r
151             GenFdsGlobalVariable.InfLogger ("Return Value = %d" %PopenObject.returncode)\r
152             GenFdsGlobalVariable.InfLogger (out)\r
153             GenFdsGlobalVariable.InfLogger (error)\r
154             if PopenObject.returncode != 0:\r
155                 GenFdsGlobalVariable.InfLogger (errorMess)\r
156                 sys.exit(1)\r
157 \r
158     def VerboseLogger (msg):\r
159         EdkLogger.verbose(msg)\r
160 \r
161     def InfLogger (msg):\r
162         EdkLogger.info(msg)\r
163         \r
164     def ErrorLogger (msg, File = None, Line = None, ExtraData = None):\r
165         EdkLogger.error('GenFds', BuildToolError.GENFDS_ERROR, msg, File, Line, ExtraData)\r
166 \r
167     def DebugLogger (Level, msg):\r
168         EdkLogger.debug(Level, msg)\r
169 \r
170     ## ReplaceWorkspaceMacro()\r
171     #\r
172     #   @param  Str           String that may contain macro\r
173     #   @param  MacroDict     Dictionary that contains macro value pair\r
174     #\r
175     def MacroExtend (Str, MacroDict = {}):\r
176         if Str == None :\r
177             return None\r
178         \r
179         Dict = {'$(WORKSPACE)'   : GenFdsGlobalVariable.WorkSpaceDir,\r
180                 '$(EDK_SOURCE)'  : GenFdsGlobalVariable.EdkSourceDir,\r
181                 '$(OUTPUT_DIRECTORY)': GenFdsGlobalVariable.OutputDirFromDsc,\r
182                 '$(TARGET)' : GenFdsGlobalVariable.TargetName,\r
183                 '$(TOOL_CHAIN_TAG)' : GenFdsGlobalVariable.ToolChainTag\r
184                }\r
185         if MacroDict != None  and len (MacroDict) != 0:\r
186             Dict.update(MacroDict)\r
187 \r
188         for key in Dict.keys():\r
189             if Str.find(key) >= 0 :\r
190                 Str = Str.replace (key, Dict[key])\r
191         \r
192         if Str.find('$(ARCH)') >= 0:\r
193             if len(GenFdsGlobalVariable.ArchList) == 1:\r
194                 Str = Str.replace('$(ARCH)', GenFdsGlobalVariable.ArchList[0])\r
195             else:\r
196                 GenFdsGlobalVariable.InfLogger ("\nNo way to determine $(ARCH) for %s\n" % Str)\r
197                 sys.exit(1)\r
198             \r
199         return Str\r
200 \r
201 \r
202     SetDir = staticmethod(SetDir)\r
203     SetDefaultRule = staticmethod(SetDefaultRule)\r
204     ReplaceWorkspaceMacro = staticmethod(ReplaceWorkspaceMacro)\r
205     CallExternalTool = staticmethod(CallExternalTool)\r
206     VerboseLogger = staticmethod(VerboseLogger)\r
207     InfLogger = staticmethod(InfLogger)\r
208     ErrorLogger = staticmethod(ErrorLogger)\r
209     DebugLogger = staticmethod(DebugLogger)\r
210     MacroExtend = staticmethod (MacroExtend)\r