4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 from __future__
import print_function
16 import Common
.LongFilePathOs
as os
19 from optparse
import OptionParser
21 import Common
.EdkLogger
as EdkLogger
22 import Common
.BuildToolError
as BuildToolError
23 from Common
.DataType
import *
24 from Common
.BuildVersion
import gBUILD_VERSION
25 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
27 # To Do 1.set clean, 2. add item, if the line is disabled.
30 def __init__(self
, opt
, args
):
31 self
.WorkSpace
= os
.path
.normpath(os
.getenv('WORKSPACE'))
34 self
.FileName
= os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf', 'target.txt'))
35 if os
.path
.isfile(self
.FileName
) == False:
36 print("%s does not exist." % self
.FileName
)
38 self
.TargetTxtDictionary
= {
39 TAB_TAT_DEFINES_ACTIVE_PLATFORM
: None,
40 TAB_TAT_DEFINES_TOOL_CHAIN_CONF
: None,
41 TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER
: None,
42 TAB_TAT_DEFINES_TARGET
: None,
43 TAB_TAT_DEFINES_TOOL_CHAIN_TAG
: None,
44 TAB_TAT_DEFINES_TARGET_ARCH
: None,
45 TAB_TAT_DEFINES_BUILD_RULE_CONF
: None,
47 self
.LoadTargetTxtFile(self
.FileName
)
49 def LoadTargetTxtFile(self
, filename
):
50 if os
.path
.exists(filename
) and os
.path
.isfile(filename
):
51 return self
.ConvertTextFileToDict(filename
, '#', '=')
53 raise ParseError('LoadTargetTxtFile() : No Target.txt file exists.')
57 # Convert a text file to a dictionary
59 def ConvertTextFileToDict(self
, FileName
, CommentCharacter
, KeySplitCharacter
):
60 """Convert a text file to a dictionary of (name:value) pairs."""
62 f
= open(FileName
, 'r')
64 if Line
.startswith(CommentCharacter
) or Line
.strip() == '':
66 LineList
= Line
.split(KeySplitCharacter
, 1)
67 if len(LineList
) >= 2:
68 Key
= LineList
[0].strip()
69 if Key
.startswith(CommentCharacter
) == False and Key
in self
.TargetTxtDictionary
:
70 if Key
== TAB_TAT_DEFINES_ACTIVE_PLATFORM
or Key
== TAB_TAT_DEFINES_TOOL_CHAIN_CONF \
71 or Key
== TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER \
72 or Key
== TAB_TAT_DEFINES_ACTIVE_MODULE
:
73 self
.TargetTxtDictionary
[Key
] = LineList
[1].replace('\\', '/').strip()
74 elif Key
== TAB_TAT_DEFINES_TARGET
or Key
== TAB_TAT_DEFINES_TARGET_ARCH \
75 or Key
== TAB_TAT_DEFINES_TOOL_CHAIN_TAG
or Key
== TAB_TAT_DEFINES_BUILD_RULE_CONF
:
76 self
.TargetTxtDictionary
[Key
] = LineList
[1].split()
80 last_type
, last_value
, last_tb
= sys
.exc_info()
81 traceback
.print_exception(last_type
, last_value
, last_tb
)
85 for Key
in self
.TargetTxtDictionary
:
86 if isinstance(self
.TargetTxtDictionary
[Key
], type([])):
87 print("%-30s = %s" % (Key
, ''.join(elem
+ ' ' for elem
in self
.TargetTxtDictionary
[Key
])))
88 elif self
.TargetTxtDictionary
[Key
] is None:
89 errMsg
+= " Missing %s configuration information, please use TargetTool to set value!" % Key
+ os
.linesep
91 print("%-30s = %s" % (Key
, self
.TargetTxtDictionary
[Key
]))
94 print(os
.linesep
+ 'Warning:' + os
.linesep
+ errMsg
)
96 def RWFile(self
, CommentCharacter
, KeySplitCharacter
, Num
):
98 fr
= open(self
.FileName
, 'r')
99 fw
= open(os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf\\targetnew.txt')), 'w')
103 if Line
.startswith(CommentCharacter
) or Line
.strip() == '':
106 LineList
= Line
.split(KeySplitCharacter
, 1)
107 if len(LineList
) >= 2:
108 Key
= LineList
[0].strip()
109 if Key
.startswith(CommentCharacter
) == False and Key
in self
.TargetTxtDictionary
:
110 if Key
not in existKeys
:
111 existKeys
.append(Key
)
113 print("Warning: Found duplicate key item in original configuration files!")
116 Line
= "%-30s = \n" % Key
118 ret
= GetConfigureKeyValue(self
, Key
)
122 for key
in self
.TargetTxtDictionary
:
123 if key
not in existKeys
:
124 print("Warning: %s does not exist in original configuration file" % key
)
125 Line
= GetConfigureKeyValue(self
, key
)
127 Line
= "%-30s = " % key
132 os
.remove(self
.FileName
)
133 os
.rename(os
.path
.normpath(os
.path
.join(self
.WorkSpace
, 'Conf\\targetnew.txt')), self
.FileName
)
136 last_type
, last_value
, last_tb
= sys
.exc_info()
137 traceback
.print_exception(last_type
, last_value
, last_tb
)
139 def GetConfigureKeyValue(self
, Key
):
141 if Key
== TAB_TAT_DEFINES_ACTIVE_PLATFORM
and self
.Opt
.DSCFILE
is not None:
142 dscFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.DSCFILE
)
143 if os
.path
.exists(dscFullPath
):
144 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.DSCFILE
)
146 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
147 "DSC file %s does not exist!" % self
.Opt
.DSCFILE
, RaiseError
=False)
148 elif Key
== TAB_TAT_DEFINES_TOOL_CHAIN_CONF
and self
.Opt
.TOOL_DEFINITION_FILE
is not None:
149 tooldefFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.TOOL_DEFINITION_FILE
)
150 if os
.path
.exists(tooldefFullPath
):
151 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.TOOL_DEFINITION_FILE
)
153 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
154 "Tooldef file %s does not exist!" % self
.Opt
.TOOL_DEFINITION_FILE
, RaiseError
=False)
156 elif self
.Opt
.NUM
>= 2:
157 Line
= "%-30s = %s\n" % (Key
, 'Enable')
158 elif self
.Opt
.NUM
<= 1:
159 Line
= "%-30s = %s\n" % (Key
, 'Disable')
160 elif Key
== TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER
and self
.Opt
.NUM
is not None:
161 Line
= "%-30s = %s\n" % (Key
, str(self
.Opt
.NUM
))
162 elif Key
== TAB_TAT_DEFINES_TARGET
and self
.Opt
.TARGET
is not None:
163 Line
= "%-30s = %s\n" % (Key
, ''.join(elem
+ ' ' for elem
in self
.Opt
.TARGET
))
164 elif Key
== TAB_TAT_DEFINES_TARGET_ARCH
and self
.Opt
.TARGET_ARCH
is not None:
165 Line
= "%-30s = %s\n" % (Key
, ''.join(elem
+ ' ' for elem
in self
.Opt
.TARGET_ARCH
))
166 elif Key
== TAB_TAT_DEFINES_TOOL_CHAIN_TAG
and self
.Opt
.TOOL_CHAIN_TAG
is not None:
167 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.TOOL_CHAIN_TAG
)
168 elif Key
== TAB_TAT_DEFINES_BUILD_RULE_CONF
and self
.Opt
.BUILD_RULE_FILE
is not None:
169 buildruleFullPath
= os
.path
.join(self
.WorkSpace
, self
.Opt
.BUILD_RULE_FILE
)
170 if os
.path
.exists(buildruleFullPath
):
171 Line
= "%-30s = %s\n" % (Key
, self
.Opt
.BUILD_RULE_FILE
)
173 EdkLogger
.error("TagetTool", BuildToolError
.FILE_NOT_FOUND
,
174 "Build rule file %s does not exist!" % self
.Opt
.BUILD_RULE_FILE
, RaiseError
=False)
177 VersionNumber
= ("0.01" + " " + gBUILD_VERSION
)
178 __version__
= "%prog Version " + VersionNumber
179 __copyright__
= "Copyright (c) 2007 - 2018, Intel Corporation All rights reserved."
180 __usage__
= "%prog [options] {args} \
182 \n Clean clean the all default configuration of target.txt. \
183 \n Print print the all default configuration of target.txt. \
184 \n Set replace the default configuration with expected value specified by option."
187 def SingleCheckCallback(option
, opt_str
, value
, parser
):
188 if option
not in gParamCheck
:
189 setattr(parser
.values
, option
.dest
, value
)
190 gParamCheck
.append(option
)
192 parser
.error("Option %s only allows one instance in command line!" % option
)
194 def RangeCheckCallback(option
, opt_str
, value
, parser
):
195 if option
not in gParamCheck
:
196 gParamCheck
.append(option
)
197 if value
< 1 or value
> 8:
198 parser
.error("The count of multi-thread is not in valid range of 1 ~ 8.")
200 setattr(parser
.values
, option
.dest
, value
)
202 parser
.error("Option %s only allows one instance in command line!" % option
)
204 def MyOptionParser():
205 parser
= OptionParser(version
=__version__
, prog
="TargetTool.exe", usage
=__usage__
, description
=__copyright__
)
206 parser
.add_option("-a", "--arch", action
="append", type="choice", choices
=['IA32', 'X64', 'IPF', 'EBC', 'ARM', 'AARCH64', '0'], dest
="TARGET_ARCH",
207 help="ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64 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.")
208 parser
.add_option("-p", "--platform", action
="callback", type="string", dest
="DSCFILE", callback
=SingleCheckCallback
,
209 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.")
210 parser
.add_option("-c", "--tooldef", action
="callback", type="string", dest
="TOOL_DEFINITION_FILE", callback
=SingleCheckCallback
,
211 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.")
212 parser
.add_option("-t", "--target", action
="append", type="choice", choices
=['DEBUG', 'RELEASE', '0'], dest
="TARGET",
213 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.")
214 parser
.add_option("-n", "--tagname", action
="callback", type="string", dest
="TOOL_CHAIN_TAG", callback
=SingleCheckCallback
,
215 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.")
216 parser
.add_option("-r", "--buildrule", action
="callback", type="string", dest
="BUILD_RULE_FILE", callback
=SingleCheckCallback
,
217 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.")
218 parser
.add_option("-m", "--multithreadnum", action
="callback", type="int", dest
="NUM", callback
=RangeCheckCallback
,
219 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.")
220 (opt
, args
)=parser
.parse_args()
223 if __name__
== '__main__':
224 EdkLogger
.Initialize()
225 EdkLogger
.SetLevel(EdkLogger
.QUIET
)
226 if os
.getenv('WORKSPACE') is None:
227 print("ERROR: WORKSPACE should be specified or edksetup script should be executed before run TargetTool")
230 (opt
, args
) = MyOptionParser()
231 if len(args
) != 1 or (args
[0].lower() != 'print' and args
[0].lower() != 'clean' and args
[0].lower() != 'set'):
232 print("The number of args isn't 1 or the value of args is invalid.")
234 if opt
.NUM
is not None and opt
.NUM
< 1:
235 print("The MAX_CONCURRENT_THREAD_NUMBER must be larger than 0.")
237 if opt
.TARGET
is not None and len(opt
.TARGET
) > 1:
238 for elem
in opt
.TARGET
:
240 print("0 will clear the TARGET setting in target.txt and can't combine with other value.")
242 if opt
.TARGET_ARCH
is not None and len(opt
.TARGET_ARCH
) > 1:
243 for elem
in opt
.TARGET_ARCH
:
245 print("0 will clear the TARGET_ARCH setting in target.txt and can't combine with other value.")
249 FileHandle
= TargetTool(opt
, args
)
250 if FileHandle
.Arg
.lower() == 'print':
253 elif FileHandle
.Arg
.lower() == 'clean':
254 FileHandle
.RWFile('#', '=', 0)
256 FileHandle
.RWFile('#', '=', 1)
257 except Exception as e
:
258 last_type
, last_value
, last_tb
= sys
.exc_info()
259 traceback
.print_exception(last_type
, last_value
, last_tb
)