2 # Copyright (c) 2007 - 2010, Intel Corporation
4 # All rights reserved. This program and the accompanying materials
5 # are licensed and made available under the terms and conditions of the BSD License
6 # which accompanies this distribution. The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 from optparse
import OptionParser
18 import Common
.EdkLogger
as EdkLogger
19 import Common
.BuildToolError
as BuildToolError
20 from Common
.DataType
import *
22 # To Do 1.set clean, 2. add item, if the line is disabled.
25 def __init__(self
, opt
, args
):
26 self
.WorkSpace
= os
.path
.normpath(os
.getenv('WORKSPACE'))
29 self
.FileName
= os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf', 'target.txt'))
30 if os
.path
.isfile(self
.FileName
) == False:
31 print "%s does not exist." % self
.FileName
33 self
.TargetTxtDictionary
= {
34 TAB_TAT_DEFINES_ACTIVE_PLATFORM
: None,
35 TAB_TAT_DEFINES_TOOL_CHAIN_CONF
: None,
36 TAB_TAT_DEFINES_MULTIPLE_THREAD
: None,
37 TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER
: None,
38 TAB_TAT_DEFINES_TARGET
: None,
39 TAB_TAT_DEFINES_TOOL_CHAIN_TAG
: None,
40 TAB_TAT_DEFINES_TARGET_ARCH
: None,
41 TAB_TAT_DEFINES_BUILD_RULE_CONF
: None,
43 self
.LoadTargetTxtFile(self
.FileName
)
45 def LoadTargetTxtFile(self
, filename
):
46 if os
.path
.exists(filename
) and os
.path
.isfile(filename
):
47 return self
.ConvertTextFileToDict(filename
, '#', '=')
49 raise ParseError('LoadTargetTxtFile() : No Target.txt file exists.')
53 # Convert a text file to a dictionary
55 def ConvertTextFileToDict(self
, FileName
, CommentCharacter
, KeySplitCharacter
):
56 """Convert a text file to a dictionary of (name:value) pairs."""
58 f
= open(FileName
,'r')
60 if Line
.startswith(CommentCharacter
) or Line
.strip() == '':
62 LineList
= Line
.split(KeySplitCharacter
,1)
63 if len(LineList
) >= 2:
64 Key
= LineList
[0].strip()
65 if Key
.startswith(CommentCharacter
) == False and Key
in self
.TargetTxtDictionary
.keys():
66 if Key
== TAB_TAT_DEFINES_ACTIVE_PLATFORM
or Key
== TAB_TAT_DEFINES_TOOL_CHAIN_CONF \
67 or Key
== TAB_TAT_DEFINES_MULTIPLE_THREAD
or Key
== TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER \
68 or Key
== TAB_TAT_DEFINES_ACTIVE_MODULE
:
69 self
.TargetTxtDictionary
[Key
] = LineList
[1].replace('\\', '/').strip()
70 elif Key
== TAB_TAT_DEFINES_TARGET
or Key
== TAB_TAT_DEFINES_TARGET_ARCH \
71 or Key
== TAB_TAT_DEFINES_TOOL_CHAIN_TAG
or Key
== TAB_TAT_DEFINES_BUILD_RULE_CONF
:
72 self
.TargetTxtDictionary
[Key
] = LineList
[1].split()
76 last_type
, last_value
, last_tb
= sys
.exc_info()
77 traceback
.print_exception(last_type
, last_value
, last_tb
)
80 KeyList
= self
.TargetTxtDictionary
.keys()
83 if type(self
.TargetTxtDictionary
[Key
]) == type([]):
84 print "%-30s = %s" % (Key
, ''.join(elem
+ ' ' for elem
in self
.TargetTxtDictionary
[Key
]))
85 elif self
.TargetTxtDictionary
[Key
] == None:
86 errMsg
+= " Missing %s configuration information, please use TargetTool to set value!" % Key
+ os
.linesep
88 print "%-30s = %s" % (Key
, self
.TargetTxtDictionary
[Key
])
91 print os
.linesep
+ 'Warning:' + os
.linesep
+ errMsg
93 def RWFile(self
, CommentCharacter
, KeySplitCharacter
, Num
):
95 fr
= open(self
.FileName
, 'r')
96 fw
= open(os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf\\targetnew.txt')), 'w')
100 if Line
.startswith(CommentCharacter
) or Line
.strip() == '':
103 LineList
= Line
.split(KeySplitCharacter
,1)
104 if len(LineList
) >= 2:
105 Key
= LineList
[0].strip()
106 if Key
.startswith(CommentCharacter
) == False and Key
in self
.TargetTxtDictionary
.keys():
107 if Key
not in existKeys
:
108 existKeys
.append(Key
)
110 print "Warning: Found duplicate key item in original configuration files!"
113 Line
= "%-30s = \n" % Key
115 ret
= GetConfigureKeyValue(self
, Key
)
119 for key
in self
.TargetTxtDictionary
.keys():
120 if key
not in existKeys
:
121 print "Warning: %s does not exist in original configuration file" % key
122 Line
= GetConfigureKeyValue(self
, key
)
124 Line
= "%-30s = " % key
129 os
.remove(self
.FileName
)
130 os
.rename(os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf\\targetnew.txt')), self
.FileName
)
133 last_type
, last_value
, last_tb
= sys
.exc_info()
134 traceback
.print_exception(last_type
, last_value
, last_tb
)
136 def GetConfigureKeyValue(self
, Key
):
138 if Key
== TAB_TAT_DEFINES_ACTIVE_PLATFORM
and self
.Opt
.DSCFILE
!= None:
139 dscFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.DSCFILE
)
140 if os
.path
.exists(dscFullPath
):
141 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.DSCFILE
)
143 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
144 "DSC file %s does not exist!" % self
.Opt
.DSCFILE
, RaiseError
=False)
145 elif Key
== TAB_TAT_DEFINES_TOOL_CHAIN_CONF
and self
.Opt
.TOOL_DEFINITION_FILE
!= None:
146 tooldefFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.TOOL_DEFINITION_FILE
)
147 if os
.path
.exists(tooldefFullPath
):
148 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.TOOL_DEFINITION_FILE
)
150 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
151 "Tooldef file %s does not exist!" % self
.Opt
.TOOL_DEFINITION_FILE
, RaiseError
=False)
152 elif Key
== TAB_TAT_DEFINES_MULTIPLE_THREAD
and self
.Opt
.NUM
!= None:
153 if self
.Opt
.NUM
>= 2:
154 Line
= "%-30s = %s\n" % (Key
, 'Enable')
156 Line
= "%-30s = %s\n" % (Key
, 'Disable')
157 elif Key
== TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER
and self
.Opt
.NUM
!= None:
158 Line
= "%-30s = %s\n" % (Key
, str(self
.Opt
.NUM
))
159 elif Key
== TAB_TAT_DEFINES_MULTIPLE_THREAD
and self
.Opt
.ENABLE_MULTI_THREAD
!= None:
160 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.ENABLE_MULTI_THREAD
)
161 elif Key
== TAB_TAT_DEFINES_TARGET
and self
.Opt
.TARGET
!= None:
162 Line
= "%-30s = %s\n" % (Key
, ''.join(elem
+ ' ' for elem
in self
.Opt
.TARGET
))
163 elif Key
== TAB_TAT_DEFINES_TARGET_ARCH
and self
.Opt
.TARGET_ARCH
!= None:
164 Line
= "%-30s = %s\n" % (Key
, ''.join(elem
+ ' ' for elem
in self
.Opt
.TARGET_ARCH
))
165 elif Key
== TAB_TAT_DEFINES_TOOL_CHAIN_TAG
and self
.Opt
.TOOL_CHAIN_TAG
!= None:
166 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.TOOL_CHAIN_TAG
)
167 elif Key
== TAB_TAT_DEFINES_BUILD_RULE_CONF
and self
.Opt
.BUILD_RULE_FILE
!= None:
168 buildruleFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.BUILD_RULE_FILE
)
169 if os
.path
.exists(buildruleFullPath
):
170 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.BUILD_RULE_FILE
)
172 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
173 "Build rule file %s does not exist!" % self
.Opt
.BUILD_RULE_FILE
, RaiseError
=False)
176 VersionNumber
= "0.01"
177 __version__
= "%prog Version " + VersionNumber
178 __copyright__
= "Copyright (c) 2007 - 2010, Intel Corporation All rights reserved."
179 __usage__
= "%prog [options] {args} \
181 \n Clean clean the all default configuration of target.txt. \
182 \n Print print the all default configuration of target.txt. \
183 \n Set replace the default configuration with expected value specified by option."
186 def SingleCheckCallback(option
, opt_str
, value
, parser
):
187 if option
not in gParamCheck
:
188 setattr(parser
.values
, option
.dest
, value
)
189 gParamCheck
.append(option
)
191 parser
.error("Option %s only allows one instance in command line!" % option
)
193 def RangeCheckCallback(option
, opt_str
, value
, parser
):
194 if option
not in gParamCheck
:
195 gParamCheck
.append(option
)
196 if value
< 1 or value
> 8:
197 parser
.error("The count of multi-thread is not in valid range of 1 ~ 8.")
199 setattr(parser
.values
, option
.dest
, value
)
201 parser
.error("Option %s only allows one instance in command line!" % option
)
203 def MyOptionParser():
204 parser
= OptionParser(version
=__version__
,prog
="TargetTool.exe",usage
=__usage__
,description
=__copyright__
)
205 parser
.add_option("-a", "--arch", action
="append", type="choice", choices
=['IA32','X64','IPF','EBC', 'ARM','0'], dest
="TARGET_ARCH",
206 help="ARCHS is one of list: IA32, X64, IPF, ARM or EBC, which replaces target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option. 0 will clear this setting in target.txt and can't combine with other value.")
207 parser
.add_option("-p", "--platform", action
="callback", type="string", dest
="DSCFILE", callback
=SingleCheckCallback
,
208 help="Specify a DSC file, which replace target.txt's ACTIVE_PLATFORM definition. 0 will clear this setting in target.txt and can't combine with other value.")
209 parser
.add_option("-c", "--tooldef", action
="callback", type="string", dest
="TOOL_DEFINITION_FILE", callback
=SingleCheckCallback
,
210 help="Specify the WORKSPACE relative path of tool_def.txt file, which replace target.txt's TOOL_CHAIN_CONF definition. 0 will clear this setting in target.txt and can't combine with other value.")
211 parser
.add_option("-t", "--target", action
="append", type="choice", choices
=['DEBUG','RELEASE','0'], dest
="TARGET",
212 help="TARGET is one of list: DEBUG, RELEASE, which replaces target.txt's TARGET definition. To specify more TARGET, please repeat this option. 0 will clear this setting in target.txt and can't combine with other value.")
213 parser
.add_option("-n", "--tagname", action
="callback", type="string", dest
="TOOL_CHAIN_TAG", callback
=SingleCheckCallback
,
214 help="Specify the Tool Chain Tagname, which replaces target.txt's TOOL_CHAIN_TAG definition. 0 will clear this setting in target.txt and can't combine with other value.")
215 parser
.add_option("-r", "--buildrule", action
="callback", type="string", dest
="BUILD_RULE_FILE", callback
=SingleCheckCallback
,
216 help="Specify the build rule configure file, which replaces target.txt's BUILD_RULE_CONF definition. If not specified, the default value Conf/build_rule.txt will be set.")
217 parser
.add_option("-m", "--multithreadnum", action
="callback", type="int", dest
="NUM", callback
=RangeCheckCallback
,
218 help="Specify the multi-thread number which replace target.txt's MAX_CONCURRENT_THREAD_NUMBER. If the value is less than 2, MULTIPLE_THREAD will be disabled. If the value is larger than 1, MULTIPLE_THREAD will be enabled.")
219 parser
.add_option("-e", "--enablemultithread", action
="store", type="choice", choices
=['Enable', 'Disable'], dest
="ENABLE_MULTI_THREAD",
220 help="Specify whether enable multi-thread! If Enable, multi-thread is enabled; If Disable, mutli-thread is disable")
221 (opt
, args
)=parser
.parse_args()
224 if __name__
== '__main__':
225 EdkLogger
.Initialize()
226 EdkLogger
.SetLevel(EdkLogger
.QUIET
)
227 if os
.getenv('WORKSPACE') == None:
228 print "ERROR: WORKSPACE should be specified or edksetup script should be executed before run TargetTool"
231 (opt
, args
) = MyOptionParser()
232 if len(args
) != 1 or (args
[0].lower() != 'print' and args
[0].lower() != 'clean' and args
[0].lower() != 'set'):
233 print "The number of args isn't 1 or the value of args is invalid."
235 if opt
.NUM
!= None and opt
.NUM
< 1:
236 print "The MAX_CONCURRENT_THREAD_NUMBER must be larger than 0."
238 if opt
.TARGET
!= None and len(opt
.TARGET
) > 1:
239 for elem
in opt
.TARGET
:
241 print "0 will clear the TARGET setting in target.txt and can't combine with other value."
243 if opt
.TARGET_ARCH
!= None and len(opt
.TARGET_ARCH
) > 1:
244 for elem
in opt
.TARGET_ARCH
:
246 print "0 will clear the TARGET_ARCH setting in target.txt and can't combine with other value."
250 FileHandle
= TargetTool(opt
, args
)
251 if FileHandle
.Arg
.lower() == 'print':
254 elif FileHandle
.Arg
.lower() == 'clean':
255 FileHandle
.RWFile('#', '=', 0)
257 FileHandle
.RWFile('#', '=', 1)
259 last_type
, last_value
, last_tb
= sys
.exc_info()
260 traceback
.print_exception(last_type
, last_value
, last_tb
)