summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorArda <[email protected]>2014-11-24 11:57:31 +0800
committerArda <[email protected]>2014-11-24 11:57:31 +0800
commit143d3b82244b977735649e7d7c201d2affe67460 (patch)
tree61503d3a150cef8d8184c858efc139b146b50cf6 /tools
parentbc2a890ab08d163ccea323f7e719c4fdf53050cd (diff)
parent9ecd18411fc1344e3d080d844b60c7070c3fb4d8 (diff)
Merge pull request #2 from RT-Thread/master
update from official source
Diffstat (limited to 'tools')
-rw-r--r--tools/building.py101
-rw-r--r--tools/keil.py175
2 files changed, 208 insertions, 68 deletions
diff --git a/tools/building.py b/tools/building.py
index 3572daabbe..f12452ed7d 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -27,11 +27,9 @@ class Win32Spawn:
newargs = string.join(args[1:], ' ')
cmdline = cmd + " " + newargs
- startupinfo = subprocess.STARTUPINFO()
- startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
# Make sure the env is constructed by strings
- _e = {k: str(v) for k, v in env.items()}
+ _e = dict([(k, str(v)) for k, v in env.items()])
# Windows(tm) CreateProcess does not use the env passed to it to find
# the executables. So we have to modify our own PATH to make Popen
@@ -40,8 +38,7 @@ class Win32Spawn:
os.environ['PATH'] = _e['PATH']
try:
- proc = subprocess.Popen(cmdline, env=_e,
- startupinfo=startupinfo, shell=False)
+ proc = subprocess.Popen(cmdline, env=_e, shell=False)
except Exception as e:
print 'Error in calling:\n%s' % cmdline
print 'Exception: %s: %s' % (e, os.strerror(e.errno))
@@ -70,7 +67,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
rtconfig.EXEC_PATH = rtconfig.EXEC_PATH.replace('bin40', 'armcc/bin')
Env['LINKFLAGS']=Env['LINKFLAGS'].replace('RV31', 'armcc')
- # reset AR command flags
+ # reset AR command flags
env['ARCOM'] = '$AR --create $TARGET $SOURCES'
env['LIBPREFIX'] = ''
env['LIBSUFFIX'] = '.lib'
@@ -105,7 +102,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
PreProcessor.process_contents(contents)
BuildOptions = PreProcessor.cpp_namespace
- # add copy option
+ # add copy option
AddOption('--copy',
dest='copy',
action='store_true',
@@ -151,12 +148,12 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
rtconfig.POST_ACTION = ''
# add build library option
- AddOption('--buildlib',
- dest='buildlib',
+ AddOption('--buildlib',
+ dest='buildlib',
type='string',
help='building library of a component')
- AddOption('--cleanlib',
- dest='cleanlib',
+ AddOption('--cleanlib',
+ dest='cleanlib',
action='store_true',
default=False,
help='clean up the library by --buildlib')
@@ -170,6 +167,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
#{target_name:(CROSS_TOOL, PLATFORM)}
tgt_dict = {'mdk':('keil', 'armcc'),
'mdk4':('keil', 'armcc'),
+ 'mdk5':('keil', 'armcc'),
'iar':('iar', 'iar'),
'vs':('msvc', 'cl'),
'vs2012':('msvc', 'cl'),
@@ -243,13 +241,13 @@ def PrepareModuleBuilding(env, root_directory):
Env = env
Rtt_Root = root_directory
- # add build/clean library option for library checking
- AddOption('--buildlib',
- dest='buildlib',
+ # add build/clean library option for library checking
+ AddOption('--buildlib',
+ dest='buildlib',
type='string',
help='building library of a component')
- AddOption('--cleanlib',
- dest='cleanlib',
+ AddOption('--cleanlib',
+ dest='cleanlib',
action='store_true',
default=False,
help='clean up the library by --buildlib')
@@ -271,7 +269,7 @@ def GetDepend(depend):
building = False
elif BuildOptions[depend] != '':
return BuildOptions[depend]
-
+
return building
# for list type depend
@@ -348,7 +346,7 @@ def DefineGroup(name, src, depend, **parameters):
if group.has_key('LINKFLAGS'):
Env.Append(LINKFLAGS = group['LINKFLAGS'])
- # check whether to clean up library
+ # check whether to clean up library
if GetOption('cleanlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
if group['src'] != []:
print 'Remove library:', GroupLibFullName(name, Env)
@@ -367,18 +365,19 @@ def DefineGroup(name, src, depend, **parameters):
if group.has_key('LIBPATH'):
Env.Append(LIBPATH = group['LIBPATH'])
- objs = Env.Object(group['src'])
if group.has_key('LIBRARY'):
- objs = Env.Library(name, objs)
+ objs = Env.Library(name, group['src'])
+ else:
+ objs = group['src']
- # merge group
+ # merge group
for g in Projects:
if g['name'] == name:
# merge to this group
MergeGroup(g, group)
return objs
- # add a new group
+ # add a new group
Projects.append(group)
return objs
@@ -440,12 +439,6 @@ def DoBuilding(target, objects):
break
else:
- # merge the repeated items in the Env
- if Env.has_key('CPPPATH') : Env['CPPPATH'] = list(set(Env['CPPPATH']))
- if Env.has_key('CPPDEFINES'): Env['CPPDEFINES'] = list(set(Env['CPPDEFINES']))
- if Env.has_key('LIBPATH') : Env['LIBPATH'] = list(set(Env['LIBPATH']))
- if Env.has_key('LIBS') : Env['LIBS'] = list(set(Env['LIBS']))
-
program = Env.Program(target, objects)
EndBuilding(target, program)
@@ -458,6 +451,7 @@ def EndBuilding(target, program = None):
if GetOption('target') == 'mdk':
from keil import MDKProject
from keil import MDK4Project
+ from keil import MDK5Project
template = os.path.isfile('template.Uv2')
if template:
@@ -467,16 +461,24 @@ def EndBuilding(target, program = None):
if template:
MDK4Project('project.uvproj', Projects)
else:
- print 'No template project file found.'
+ template = os.path.isfile('template.uvprojx')
+ if template:
+ MDK5Project('project.uvprojx', Projects)
+ else:
+ print 'No template project file found.'
+
if GetOption('target') == 'mdk4':
- from keil import MDKProject
from keil import MDK4Project
MDK4Project('project.uvproj', Projects)
+ if GetOption('target') == 'mdk5':
+ from keil import MDK5Project
+ MDK5Project('project.uvprojx', Projects)
+
if GetOption('target') == 'iar':
from iar import IARProject
- IARProject('project.ewp', Projects)
+ IARProject('project.ewp', Projects)
if GetOption('target') == 'vs':
from vs import VSProject
@@ -493,7 +495,7 @@ def EndBuilding(target, program = None):
if GetOption('target') == 'ua':
from ua import PrepareUA
PrepareUA(Projects, Rtt_Root, str(Dir('#')))
-
+
if GetOption('copy') and program != None:
MakeCopy(program)
if GetOption('copy-header') and program != None:
@@ -504,6 +506,9 @@ def EndBuilding(target, program = None):
CscopeDatabase(Projects)
def SrcRemove(src, remove):
+ if not src:
+ return
+
if type(src[0]) == type('str'):
for item in src:
if os.path.basename(item) in remove:
@@ -520,7 +525,7 @@ def GetVersion():
rtdef = os.path.join(Rtt_Root, 'include', 'rtdef.h')
- # parse rtdef.h to get RT-Thread version
+ # parse rtdef.h to get RT-Thread version
prepcessor = SCons.cpp.PreProcessor()
f = file(rtdef, 'r')
contents = f.read()
@@ -566,9 +571,9 @@ def do_rm_file(src):
def do_copy_file(src, dst):
import shutil
- # check source file
+ # check source file
if not os.path.exists(src):
- return
+ return
path = os.path.dirname(dst)
# mkdir if path not exist
@@ -579,13 +584,13 @@ def do_copy_file(src, dst):
def do_copy_folder(src_dir, dst_dir):
import shutil
- # check source directory
+ # check source directory
if not os.path.exists(src_dir):
return
-
+
if os.path.exists(dst_dir):
shutil.rmtree(dst_dir)
-
+
shutil.copytree(src_dir, dst_dir)
source_ext = ["c", "h", "s", "S", "cpp", "xpm"]
@@ -612,22 +617,22 @@ def MakeCopy(program):
global source_list
global Rtt_Root
global Env
-
+
target_path = os.path.join(Dir('#').abspath, 'rt-thread')
-
+
if Env['PLATFORM'] == 'win32':
RTT_ROOT = Rtt_Root.lower()
else:
RTT_ROOT = Rtt_Root
-
+
if target_path.startswith(RTT_ROOT):
return
for item in program:
walk_children(item)
-
+
source_list.sort()
-
+
# filte source file in RT-Thread
target_list = []
for src in source_list:
@@ -638,7 +643,7 @@ def MakeCopy(program):
target_list.append(src)
source_list = target_list
- # get source path
+ # get source path
src_dir = []
for src in source_list:
src = src.replace(RTT_ROOT, '')
@@ -650,10 +655,10 @@ def MakeCopy(program):
full_path = RTT_ROOT
for item in sub_path:
full_path = os.path.join(full_path, item)
- if full_path not in src_dir:
+ if full_path not in src_dir:
src_dir.append(full_path)
- for item in src_dir:
+ for item in src_dir:
source_list.append(os.path.join(item, 'SConscript'))
for src in source_list:
@@ -664,7 +669,7 @@ def MakeCopy(program):
dst = os.path.join(target_path, dst)
do_copy_file(src, dst)
- # copy tools directory
+ # copy tools directory
print "=> tools"
do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools"))
do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
@@ -712,7 +717,7 @@ def MakeCopyHeader(program):
dst = os.path.join(target_path, dst)
do_copy_file(src, dst)
- # copy tools directory
+ # copy tools directory
print "=> tools"
do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools"))
do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
diff --git a/tools/keil.py b/tools/keil.py
index ef0dece3f8..8f8b926804 100644
--- a/tools/keil.py
+++ b/tools/keil.py
@@ -49,11 +49,11 @@ def MDK4AddGroupForFN(ProjectFiles, parent, name, filename, project_path):
file_type = SubElement(file, 'FileType')
file_type.text = '%d' % _get_filetype(name)
file_path = SubElement(file, 'FilePath')
-
+
file_path.text = path.decode(fs_encoding)
def MDK4AddGroup(ProjectFiles, parent, name, files, project_path):
- # don't add an empty group
+ # don't add an empty group
if len(files) == 0:
return
@@ -69,7 +69,7 @@ def MDK4AddGroup(ProjectFiles, parent, name, files, project_path):
basename = os.path.basename(path)
path = _make_path_relative(project_path, path)
path = os.path.join(path, name)
-
+
files = SubElement(group, 'Files')
file = SubElement(files, 'File')
file_name = SubElement(file, 'FileName')
@@ -81,7 +81,7 @@ def MDK4AddGroup(ProjectFiles, parent, name, files, project_path):
file_type = SubElement(file, 'FileType')
file_type.text = '%d' % _get_filetype(name)
file_path = SubElement(file, 'FilePath')
-
+
file_path.text = path.decode(fs_encoding)
def MDK4Project(target, script):
@@ -93,44 +93,179 @@ def MDK4Project(target, script):
tree = etree.parse('template.uvproj')
root = tree.getroot()
-
+
out = file(target, 'wb')
out.write('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n')
-
+
CPPPATH = []
CPPDEFINES = []
LINKFLAGS = ''
CCFLAGS = ''
ProjectFiles = []
-
+
# add group
groups = tree.find('Targets/Target/Groups')
if groups is None:
groups = SubElement(tree.find('Targets/Target'), 'Groups')
+ groups.clear() # clean old groups
for group in script:
group_xml = MDK4AddGroup(ProjectFiles, groups, group['name'], group['src'], project_path)
-
+
# get each include path
if group.has_key('CPPPATH') and group['CPPPATH']:
if CPPPATH:
CPPPATH += group['CPPPATH']
else:
CPPPATH += group['CPPPATH']
-
+
# get each group's definitions
if group.has_key('CPPDEFINES') and group['CPPDEFINES']:
if CPPDEFINES:
CPPDEFINES += group['CPPDEFINES']
else:
CPPDEFINES += group['CPPDEFINES']
-
+
# get each group's link flags
if group.has_key('LINKFLAGS') and group['LINKFLAGS']:
if LINKFLAGS:
LINKFLAGS += ' ' + group['LINKFLAGS']
else:
LINKFLAGS += group['LINKFLAGS']
-
+
+ if group.has_key('LIBS') and group['LIBS']:
+ for item in group['LIBS']:
+ lib_path = ''
+ for path_item in group['LIBPATH']:
+ full_path = os.path.join(path_item, item + '.lib')
+ if os.path.isfile(full_path): # has this library
+ lib_path = full_path
+
+ if lib_path != '':
+ MDK4AddGroupForFN(ProjectFiles, groups, group['name'], lib_path, project_path)
+
+ # write include path, definitions and link flags
+ IncludePath = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/IncludePath')
+ IncludePath.text = ';'.join([_make_path_relative(project_path, os.path.normpath(i)) for i in CPPPATH])
+
+ Define = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/Define')
+ Define.text = ', '.join(set(CPPDEFINES))
+
+ Misc = tree.find('Targets/Target/TargetOption/TargetArmAds/LDads/Misc')
+ Misc.text = LINKFLAGS
+
+ xml_indent(root)
+ out.write(etree.tostring(root, encoding='utf-8'))
+ out.close()
+
+ # copy uvopt file
+ if os.path.exists('template.uvopt'):
+ import shutil
+ shutil.copy2('template.uvopt', 'project.uvopt')
+
+def MDK5AddGroupForFN(ProjectFiles, parent, name, filename, project_path):
+ group = SubElement(parent, 'Group')
+ group_name = SubElement(group, 'GroupName')
+ group_name.text = name
+
+ name = os.path.basename(filename)
+ path = os.path.dirname (filename)
+
+ basename = os.path.basename(path)
+ path = _make_path_relative(project_path, path)
+ path = os.path.join(path, name)
+ files = SubElement(group, 'Files')
+ file = SubElement(files, 'File')
+ file_name = SubElement(file, 'FileName')
+ name = os.path.basename(path)
+ if ProjectFiles.count(name):
+ name = basename + '_' + name
+ ProjectFiles.append(name)
+ file_name.text = name.decode(fs_encoding)
+ file_type = SubElement(file, 'FileType')
+ file_type.text = '%d' % _get_filetype(name)
+ file_path = SubElement(file, 'FilePath')
+
+ file_path.text = path.decode(fs_encoding)
+
+def MDK5AddGroup(ProjectFiles, parent, name, files, project_path):
+ # don't add an empty group
+ if len(files) == 0:
+ return
+
+ group = SubElement(parent, 'Group')
+ group_name = SubElement(group, 'GroupName')
+ group_name.text = name
+
+ for f in files:
+ fn = f.rfile()
+ name = fn.name
+ path = os.path.dirname(fn.abspath)
+
+ basename = os.path.basename(path)
+ path = _make_path_relative(project_path, path)
+ path = os.path.join(path, name)
+
+ files = SubElement(group, 'Files')
+ file = SubElement(files, 'File')
+ file_name = SubElement(file, 'FileName')
+ name = os.path.basename(path)
+ if ProjectFiles.count(name):
+ name = basename + '_' + name
+ ProjectFiles.append(name)
+ file_name.text = name.decode(fs_encoding)
+ file_type = SubElement(file, 'FileType')
+ file_type.text = '%d' % _get_filetype(name)
+ file_path = SubElement(file, 'FilePath')
+
+ file_path.text = path.decode(fs_encoding)
+
+def MDK5Project(target, script):
+ project_path = os.path.dirname(os.path.abspath(target))
+
+ project_uvopt = os.path.abspath(target).replace('uvprojx', 'uvoptx')
+ if os.path.isfile(project_uvopt):
+ os.unlink(project_uvopt)
+
+ tree = etree.parse('template.uvprojx')
+ root = tree.getroot()
+
+ out = file(target, 'wb')
+ out.write('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n')
+
+ CPPPATH = []
+ CPPDEFINES = []
+ LINKFLAGS = ''
+ CCFLAGS = ''
+ ProjectFiles = []
+
+ # add group
+ groups = tree.find('Targets/Target/Groups')
+ if groups is None:
+ groups = SubElement(tree.find('Targets/Target'), 'Groups')
+ for group in script:
+ group_xml = MDK4AddGroup(ProjectFiles, groups, group['name'], group['src'], project_path)
+
+ # get each include path
+ if group.has_key('CPPPATH') and group['CPPPATH']:
+ if CPPPATH:
+ CPPPATH += group['CPPPATH']
+ else:
+ CPPPATH += group['CPPPATH']
+
+ # get each group's definitions
+ if group.has_key('CPPDEFINES') and group['CPPDEFINES']:
+ if CPPDEFINES:
+ CPPDEFINES += group['CPPDEFINES']
+ else:
+ CPPDEFINES += group['CPPDEFINES']
+
+ # get each group's link flags
+ if group.has_key('LINKFLAGS') and group['LINKFLAGS']:
+ if LINKFLAGS:
+ LINKFLAGS += ' ' + group['LINKFLAGS']
+ else:
+ LINKFLAGS += group['LINKFLAGS']
+
if group.has_key('LIBS') and group['LIBS']:
for item in group['LIBS']:
lib_path = ''
@@ -147,33 +282,33 @@ def MDK4Project(target, script):
for path in CPPPATH:
inc = _make_path_relative(project_path, os.path.normpath(path))
paths.add(inc) #.replace('\\', '/')
-
+
paths = [i for i in paths]
paths.sort()
CPPPATH = string.join(paths, ';')
-
+
definitions = [i for i in set(CPPDEFINES)]
CPPDEFINES = string.join(definitions, ', ')
-
+
# write include path, definitions and link flags
IncludePath = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/IncludePath')
IncludePath.text = CPPPATH
-
+
Define = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/Define')
Define.text = CPPDEFINES
Misc = tree.find('Targets/Target/TargetOption/TargetArmAds/LDads/Misc')
Misc.text = LINKFLAGS
-
+
xml_indent(root)
out.write(etree.tostring(root, encoding='utf-8'))
out.close()
-
+
# copy uvopt file
- if os.path.exists('template.uvopt'):
+ if os.path.exists('template.uvoptx'):
import shutil
- shutil.copy2('template.uvopt', 'project.uvopt')
-
+ shutil.copy2('template.uvoptx', 'project.uvoptx')
+
def MDKProject(target, script):
template = file('template.Uv2', "rb")
lines = template.readlines()