a. Added binary file support during AutoGen
[people/mcb30/basetools.git] / Source / Python / Common / TargetTxtClassObject.py
1 ## @file\r
2 # This file is used to define each component of Target.txt file\r
3 #\r
4 # Copyright (c) 2007, Intel Corporation\r
5 # All rights reserved. This program and the accompanying materials\r
6 # are licensed and made available under the terms and conditions of the BSD License\r
7 # which accompanies this distribution.  The full text of the license may be found at\r
8 # http://opensource.org/licenses/bsd-license.php\r
9 #\r
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 #\r
13 \r
14 ##\r
15 # Import Modules\r
16 #\r
17 import os\r
18 import EdkLogger\r
19 import DataType\r
20 from BuildToolError import *\r
21 import GlobalData\r
22 \r
23 ## TargetTxtClassObject\r
24 #\r
25 # This class defined content used in file target.txt\r
26\r
27 # @param object:             Inherited from object class\r
28 # @param Filename:           Input value for full path of target.txt\r
29 #\r
30 # @var TargetTxtDictionary:  To store keys and values defined in target.txt\r
31 #\r
32 class TargetTxtClassObject(object):\r
33     def __init__(self, Filename = None):\r
34         self.TargetTxtDictionary = {\r
35             DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM                            : '',\r
36             DataType.TAB_TAT_DEFINES_ACTIVE_MODULE                              : '',\r
37             DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF                            : '',\r
38             DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD                            : '',\r
39             DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER               : '',\r
40             DataType.TAB_TAT_DEFINES_TARGET                                     : [],\r
41             DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG                             : [],\r
42             DataType.TAB_TAT_DEFINES_TARGET_ARCH                                : [],\r
43             DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF                            : '',\r
44         }\r
45         if Filename != None:\r
46             self.LoadTargetTxtFile(Filename)\r
47 \r
48     ## LoadTargetTxtFile\r
49     #\r
50     # Load target.txt file and parse it, return a set structure to store keys and values\r
51     #\r
52     # @param Filename:  Input value for full path of target.txt\r
53     #\r
54     # @retval set() A set structure to store keys and values\r
55     # @retval 1     Error happenes in parsing\r
56     #\r
57     def LoadTargetTxtFile(self, Filename):\r
58         if os.path.exists(Filename) and os.path.isfile(Filename):\r
59              return self.ConvertTextFileToDict(Filename, '#', '=')\r
60         else:\r
61             EdkLogger.error("Target.txt Parser", FILE_NOT_FOUND, ExtraData=Filename)\r
62             return 1\r
63 \r
64     ## ConvertTextFileToDict\r
65     #\r
66     # Convert a text file to a dictionary of (name:value) pairs.\r
67     # The data is saved to self.TargetTxtDictionary\r
68     #\r
69     # @param FileName:             Text filename\r
70     # @param CommentCharacter:     Comment char, be used to ignore comment content\r
71     # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
72     #\r
73     # @retval 0 Convert successfully\r
74     # @retval 1 Open file failed\r
75     #\r
76     def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter):\r
77         try:\r
78             F = open(FileName,'r')\r
79             for Line in F:\r
80                 Line = Line.strip()\r
81                 if Line.startswith(CommentCharacter) or Line == '':\r
82                     continue\r
83 \r
84                 LineList = Line.split(KeySplitCharacter, 1)\r
85                 Key = LineList[0].strip()\r
86                 if len(LineList) == 2:\r
87                     Value = LineList[1].strip()\r
88                 else:\r
89                     Value = ""\r
90 \r
91                 if Key in [DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM, DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF, \\r
92                            DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD, DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER, \\r
93                            DataType.TAB_TAT_DEFINES_ACTIVE_MODULE, DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]:\r
94                     self.TargetTxtDictionary[Key] = Value.replace('\\', '/')\r
95                 elif Key in [DataType.TAB_TAT_DEFINES_TARGET, DataType.TAB_TAT_DEFINES_TARGET_ARCH, \\r
96                              DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]:\r
97                     self.TargetTxtDictionary[Key] = Value.split()\r
98                 #elif Key not in GlobalData.gGlobalDefines:\r
99                 #    GlobalData.gGlobalDefines[Key] = Value\r
100 \r
101             F.close()\r
102             return 0\r
103         except:\r
104             EdkLogger.quiet('Open file failed')\r
105             return 1\r
106 \r
107     ## Print the dictionary\r
108     #\r
109     # Print all items of dictionary one by one\r
110     #\r
111     # @param Dict:  The dictionary to be printed\r
112     #\r
113     def printDict(Dict):\r
114         if Dict != None:\r
115             KeyList = Dict.keys()\r
116             for Key in KeyList:\r
117                 if Dict[Key] != '':\r
118                     print Key + ' = ' + str(Dict[Key])\r
119 \r
120     ## Print the dictionary\r
121     #\r
122     # Print the items of dictionary which matched with input key\r
123     #\r
124     # @param list:  The dictionary to be printed\r
125     # @param key:   The key of the item to be printed\r
126     #\r
127     def printList(Key, List):\r
128         if type(List) == type([]):\r
129             if len(List) > 0:\r
130                 if Key.find(TAB_SPLIT) != -1:\r
131                     print "\n" + Key\r
132                     for Item in List:\r
133                         print Item\r
134 ## TargetTxtDict\r
135 #\r
136 # Load target.txt in input workspace dir\r
137 #\r
138 # @param WorkSpace:  Workspace dir\r
139 #\r
140 # @retval Target An instance of TargetTxtClassObject() with loaded target.txt\r
141 #\r
142 def TargetTxtDict(WorkSpace):\r
143     Target = TargetTxtClassObject()\r
144     Target.LoadTargetTxtFile(WorkSpace + '\\Conf\\target.txt')\r
145     return Target\r
146 \r
147 ##\r
148 #\r
149 # This acts like the main() function for the script, unless it is 'import'ed into another\r
150 # script.\r
151 #\r
152 if __name__ == '__main__':\r
153     pass\r
154     Target = TargetTxtDict(os.getenv("WORKSPACE"))\r
155     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
156     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET]\r
157     print Target.TargetTxtDictionary\r