]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/TargetTxtClassObject.py
Sync EDKII BaseTools to BaseTools project r1971
[mirror_edk2.git] / BaseTools / Source / Python / Common / TargetTxtClassObject.py
CommitLineData
30fdf114
LG
1## @file\r
2# This file is used to define each component of Target.txt file\r
3#\r
40d841f6
LG
4# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
5# This program and the accompanying materials\r
30fdf114
LG
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
17import os\r
18import EdkLogger\r
19import DataType\r
20from BuildToolError import *\r
21import GlobalData\r
22\r
23gDefaultTargetTxtFile = "Conf/target.txt"\r
24\r
25## TargetTxtClassObject\r
26#\r
27# This class defined content used in file target.txt\r
28#\r
29# @param object: Inherited from object class\r
30# @param Filename: Input value for full path of target.txt\r
31#\r
32# @var TargetTxtDictionary: To store keys and values defined in target.txt\r
33#\r
34class TargetTxtClassObject(object):\r
35 def __init__(self, Filename = None):\r
36 self.TargetTxtDictionary = {\r
37 DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM : '',\r
38 DataType.TAB_TAT_DEFINES_ACTIVE_MODULE : '',\r
39 DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF : '',\r
40 DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD : '',\r
41 DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER : '',\r
42 DataType.TAB_TAT_DEFINES_TARGET : [],\r
43 DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG : [],\r
44 DataType.TAB_TAT_DEFINES_TARGET_ARCH : [],\r
45 DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF : '',\r
46 }\r
47 if Filename != None:\r
48 self.LoadTargetTxtFile(Filename)\r
49\r
50 ## LoadTargetTxtFile\r
51 #\r
52 # Load target.txt file and parse it, return a set structure to store keys and values\r
53 #\r
54 # @param Filename: Input value for full path of target.txt\r
55 #\r
56 # @retval set() A set structure to store keys and values\r
57 # @retval 1 Error happenes in parsing\r
58 #\r
59 def LoadTargetTxtFile(self, Filename):\r
60 if os.path.exists(Filename) and os.path.isfile(Filename):\r
61 return self.ConvertTextFileToDict(Filename, '#', '=')\r
62 else:\r
63 EdkLogger.error("Target.txt Parser", FILE_NOT_FOUND, ExtraData=Filename)\r
64 return 1\r
65\r
66 ## ConvertTextFileToDict\r
67 #\r
68 # Convert a text file to a dictionary of (name:value) pairs.\r
69 # The data is saved to self.TargetTxtDictionary\r
70 #\r
71 # @param FileName: Text filename\r
72 # @param CommentCharacter: Comment char, be used to ignore comment content\r
73 # @param KeySplitCharacter: Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
74 #\r
75 # @retval 0 Convert successfully\r
76 # @retval 1 Open file failed\r
77 #\r
78 def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter):\r
79 F = None\r
80 try:\r
81 F = open(FileName,'r')\r
82 except:\r
83 EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=FileName)\r
84 if F != None:\r
85 F.close()\r
86\r
87 for Line in F:\r
88 Line = Line.strip()\r
89 if Line.startswith(CommentCharacter) or Line == '':\r
90 continue\r
91\r
92 LineList = Line.split(KeySplitCharacter, 1)\r
93 Key = LineList[0].strip()\r
94 if len(LineList) == 2:\r
95 Value = LineList[1].strip()\r
96 else:\r
97 Value = ""\r
98\r
99 if Key in [DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM, DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF, \\r
100 DataType.TAB_TAT_DEFINES_ACTIVE_MODULE, DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]:\r
101 self.TargetTxtDictionary[Key] = Value.replace('\\', '/')\r
102 elif Key in [DataType.TAB_TAT_DEFINES_TARGET, DataType.TAB_TAT_DEFINES_TARGET_ARCH, \\r
103 DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]:\r
104 self.TargetTxtDictionary[Key] = Value.split()\r
105 elif Key == DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD:\r
106 if Value not in ["Enable", "Disable"]:\r
107 EdkLogger.error("build", FORMAT_INVALID, "Invalid setting of [%s]: %s." % (Key, Value),\r
108 ExtraData="\tSetting must be one of [Enable, Disable]",\r
109 File=FileName)\r
110 self.TargetTxtDictionary[Key] = Value\r
111 elif Key == DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER:\r
112 try:\r
113 V = int(Value, 0)\r
114 except:\r
115 EdkLogger.error("build", FORMAT_INVALID, "Invalid number of [%s]: %s." % (Key, Value),\r
116 File=FileName)\r
117 self.TargetTxtDictionary[Key] = Value\r
118 #elif Key not in GlobalData.gGlobalDefines:\r
119 # GlobalData.gGlobalDefines[Key] = Value\r
120\r
121 F.close()\r
122 return 0\r
123\r
124 ## Print the dictionary\r
125 #\r
126 # Print all items of dictionary one by one\r
127 #\r
128 # @param Dict: The dictionary to be printed\r
129 #\r
130 def printDict(Dict):\r
131 if Dict != None:\r
132 KeyList = Dict.keys()\r
133 for Key in KeyList:\r
134 if Dict[Key] != '':\r
135 print Key + ' = ' + str(Dict[Key])\r
136\r
137 ## Print the dictionary\r
138 #\r
139 # Print the items of dictionary which matched with input key\r
140 #\r
141 # @param list: The dictionary to be printed\r
142 # @param key: The key of the item to be printed\r
143 #\r
144 def printList(Key, List):\r
145 if type(List) == type([]):\r
146 if len(List) > 0:\r
147 if Key.find(TAB_SPLIT) != -1:\r
148 print "\n" + Key\r
149 for Item in List:\r
150 print Item\r
151## TargetTxtDict\r
152#\r
153# Load target.txt in input workspace dir\r
154#\r
155# @param WorkSpace: Workspace dir\r
156#\r
157# @retval Target An instance of TargetTxtClassObject() with loaded target.txt\r
158#\r
159def TargetTxtDict(WorkSpace):\r
160 Target = TargetTxtClassObject()\r
161 Target.LoadTargetTxtFile(os.path.normpath(os.path.join(WorkSpace, gDefaultTargetTxtFile)))\r
162 return Target\r
163\r
164##\r
165#\r
166# This acts like the main() function for the script, unless it is 'import'ed into another\r
167# script.\r
168#\r
169if __name__ == '__main__':\r
170 pass\r
171 Target = TargetTxtDict(os.getenv("WORKSPACE"))\r
172 print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
173 print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET]\r
174 print Target.TargetTxtDictionary\r