cf9f26721f44f194c830796cd0f2a69ccdcff395
[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         }\r
44         if Filename != None:\r
45             self.LoadTargetTxtFile(Filename)\r
46 \r
47     ## LoadTargetTxtFile\r
48     #\r
49     # Load target.txt file and parse it, return a set structure to store keys and values\r
50     #\r
51     # @param Filename:  Input value for full path of target.txt\r
52     #\r
53     # @retval set() A set structure to store keys and values\r
54     # @retval 1     Error happenes in parsing\r
55     #\r
56     def LoadTargetTxtFile(self, Filename):\r
57         if os.path.exists(Filename) and os.path.isfile(Filename):\r
58              return self.ConvertTextFileToDict(Filename, '#', '=')\r
59         else:\r
60             EdkLogger.error("Target.txt Parser", FILE_NOT_FOUND, ExtraData=Filename)\r
61             return 1\r
62 \r
63     ## ConvertTextFileToDict\r
64     #\r
65     # Convert a text file to a dictionary of (name:value) pairs.\r
66     # The data is saved to self.TargetTxtDictionary\r
67     #\r
68     # @param FileName:             Text filename\r
69     # @param CommentCharacter:     Comment char, be used to ignore comment content\r
70     # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
71     #\r
72     # @retval 0 Convert successfully\r
73     # @retval 1 Open file failed\r
74     #\r
75     def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter):\r
76         try:\r
77             F = open(FileName,'r')\r
78             for Line in F:\r
79                 Line = Line.strip()\r
80                 if Line.startswith(CommentCharacter) or Line == '':\r
81                     continue\r
82 \r
83                 LineList = Line.split(KeySplitCharacter, 1)\r
84                 Key = LineList[0].strip()\r
85                 if len(LineList) == 2:\r
86                     Value = LineList[1].strip()\r
87                 else:\r
88                     Value = ""\r
89 \r
90                 if Key == DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM or Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF \\r
91                   or Key == DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD or Key == DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER \\r
92                   or Key == DataType.TAB_TAT_DEFINES_ACTIVE_MODULE:\r
93                     self.TargetTxtDictionary[Key] = Value.replace('\\', '/')\r
94                 elif Key == DataType.TAB_TAT_DEFINES_TARGET or Key == DataType.TAB_TAT_DEFINES_TARGET_ARCH \\r
95                   or Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG:\r
96                     self.TargetTxtDictionary[Key] = Value.split()\r
97                 elif Key not in GlobalData.gGlobalDefines:\r
98                     GlobalData.gGlobalDefines[Key] = Value\r
99 \r
100             F.close()\r
101             return 0\r
102         except:\r
103             EdkLogger.quiet('Open file failed')\r
104             return 1\r
105 \r
106     ## Print the dictionary\r
107     #\r
108     # Print all items of dictionary one by one\r
109     #\r
110     # @param Dict:  The dictionary to be printed\r
111     #\r
112     def printDict(Dict):\r
113         if Dict != None:\r
114             KeyList = Dict.keys()\r
115             for Key in KeyList:\r
116                 if Dict[Key] != '':\r
117                     print Key + ' = ' + str(Dict[Key])\r
118 \r
119     ## Print the dictionary\r
120     #\r
121     # Print the items of dictionary which matched with input key\r
122     #\r
123     # @param list:  The dictionary to be printed\r
124     # @param key:   The key of the item to be printed\r
125     #\r
126     def printList(Key, List):\r
127         if type(List) == type([]):\r
128             if len(List) > 0:\r
129                 if Key.find(TAB_SPLIT) != -1:\r
130                     print "\n" + Key\r
131                     for Item in List:\r
132                         print Item\r
133 ## TargetTxtDict\r
134 #\r
135 # Load target.txt in input workspace dir\r
136 #\r
137 # @param WorkSpace:  Workspace dir\r
138 #\r
139 # @retval Target An instance of TargetTxtClassObject() with loaded target.txt\r
140 #\r
141 def TargetTxtDict(WorkSpace):\r
142     Target = TargetTxtClassObject()\r
143     Target.LoadTargetTxtFile(WorkSpace + '\\Conf\\target.txt')\r
144     return Target\r
145 \r
146 ##\r
147 #\r
148 # This acts like the main() function for the script, unless it is 'import'ed into another\r
149 # script.\r
150 #\r
151 if __name__ == '__main__':\r
152     pass\r
153     Target = TargetTxtDict(os.getenv("WORKSPACE"))\r
154     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
155     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET]\r