GenFds Use R8 component type when finding rule in FDF.
[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     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.OutputDir = os.path.normpath(OutputDir)\r
61         GenFdsGlobalVariable.FdfParser = FdfParser\r
62         GenFdsGlobalVariable.WorkSpace = WorkSpace\r
63         GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDir, '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         if 'BsBaseAddress' in GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary.keys():\r
84             BsAddressList = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary['BsBaseAddress']\r
85             if BsAddressList != []:\r
86                 BsAddress = BsAddressList[0]\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         if 'RtBaseAddress' in GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary.keys():\r
94             RtAddressList = GenFdsGlobalVariable.WorkSpace.DscDatabase[GenFdsGlobalVariable.ActivePlatform].Defines.DefinesDictionary['RtBaseAddress']\r
95             if RtAddressList != []:\r
96                 RtAddress = RtAddressList[0]\r
97                 \r
98         FvAddressFile.writelines("EFI_RUNTIME_DRIVER_BASE_ADDRESS = " + \\r
99                                        RtAddress          + \\r
100                                        T_CHAR_LF)\r
101         \r
102         FvAddressFile.close()\r
103 \r
104     ## ReplaceWorkspaceMacro()\r
105     #\r
106     #   @param  String           String that may contain macro\r
107     #\r
108     def ReplaceWorkspaceMacro(String):\r
109         Str = String.replace('$(WORKSPACE)', GenFdsGlobalVariable.WorkSpaceDir)\r
110         if os.path.exists(Str):\r
111             if not os.path.isabs(Str):\r
112                 Str = os.path.abspath(Str)\r
113         else:\r
114             Str = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, String)\r
115         return os.path.normpath(Str)\r
116     \r
117     def CallExternalTool (cmd, errorMess):\r
118         \r
119         if type(cmd) not in (tuple, list):\r
120             GenFdsGlobalVariable.ErrorLogger("ToolError!  Invalid parameter type in call to CallExternalTool")\r
121 \r
122         if GenFdsGlobalVariable.DebugLevel != -1:\r
123             cmd += ('-d', str(GenFdsGlobalVariable.DebugLevel))\r
124             GenFdsGlobalVariable.InfLogger (cmd)\r
125             \r
126         if GenFdsGlobalVariable.VerboseMode:\r
127             cmd += ('-v',)\r
128             GenFdsGlobalVariable.InfLogger (cmd)\r
129         else:\r
130             sys.stdout.write ('#')\r
131             sys.stdout.flush()\r
132             GenFdsGlobalVariable.SharpCounter = GenFdsGlobalVariable.SharpCounter + 1\r
133             if GenFdsGlobalVariable.SharpCounter % GenFdsGlobalVariable.SharpNumberPerLine == 0:\r
134                 sys.stdout.write('\n')\r
135         #GenFdsGlobalVariable.VerboseLogger(cmd)\r
136         PopenObject = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr= subprocess.PIPE)\r
137         (out, error) = PopenObject.communicate()\r
138 \r
139         while PopenObject.returncode == None :\r
140             PopenObject.wait()\r
141         if PopenObject.returncode != 0 or GenFdsGlobalVariable.VerboseMode or GenFdsGlobalVariable.DebugLevel != -1:\r
142             GenFdsGlobalVariable.InfLogger ("Return Value = %d" %PopenObject.returncode)\r
143             GenFdsGlobalVariable.InfLogger (out)\r
144             GenFdsGlobalVariable.InfLogger (error)\r
145             if PopenObject.returncode != 0:\r
146                 GenFdsGlobalVariable.InfLogger (errorMess)\r
147                 sys.exit(1)\r
148 \r
149     def VerboseLogger (msg):\r
150         EdkLogger.verbose(msg)\r
151 \r
152     def InfLogger (msg):\r
153         EdkLogger.info(msg)\r
154         \r
155     def ErrorLogger (msg, File = None, Line = None, ExtraData = None):\r
156         EdkLogger.error('GenFds', BuildToolError.GENFDS_ERROR, msg, File, Line, ExtraData)\r
157 \r
158     def DebugLogger (Level, msg):\r
159         EdkLogger.debug(Level, msg)\r
160 \r
161     ## ReplaceWorkspaceMacro()\r
162     #\r
163     #   @param  Str           String that may contain macro\r
164     #   @param  MacroDict     Dictionary that contains macro value pair\r
165     #\r
166     def MacroExtend (Str, MacroDict = {}):\r
167         if Str == None :\r
168             return None\r
169         \r
170         Dict = {'$(WORKSPACE)'   : GenFdsGlobalVariable.WorkSpaceDir,\r
171                 '$(EDK_SOURCE)'  : GenFdsGlobalVariable.EdkSourceDir,\r
172                 '$(OUTPUT_DIRECTORY)': GenFdsGlobalVariable.OutputDirFromDsc,\r
173                 '$(TARGET)' : GenFdsGlobalVariable.TargetName,\r
174                 '$(TOOL_CHAIN_TAG)' : GenFdsGlobalVariable.ToolChainTag\r
175                }\r
176         if MacroDict != None  and len (MacroDict) != 0:\r
177             Dict.update(MacroDict)\r
178 \r
179         for key in Dict.keys():\r
180             if Str.find(key) >= 0 :\r
181                 Str = Str.replace (key, Dict[key])\r
182         \r
183         if Str.find('$(ARCH)') >= 0:\r
184             if len(GenFdsGlobalVariable.ArchList) == 1:\r
185                 Str = Str.replace('$(ARCH)', GenFdsGlobalVariable.ArchList[0])\r
186             else:\r
187                 GenFdsGlobalVariable.InfLogger ("\nNo way to determine $(ARCH) for %s\n" % Str)\r
188                 sys.exit(1)\r
189             \r
190         return Str\r
191 \r
192 \r
193     SetDir = staticmethod(SetDir)\r
194     ReplaceWorkspaceMacro = staticmethod(ReplaceWorkspaceMacro)\r
195     CallExternalTool = staticmethod(CallExternalTool)\r
196     VerboseLogger = staticmethod(VerboseLogger)\r
197     InfLogger = staticmethod(InfLogger)\r
198     ErrorLogger = staticmethod(ErrorLogger)\r
199     DebugLogger = staticmethod(DebugLogger)\r
200     MacroExtend = staticmethod (MacroExtend)\r