summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2014-11-19 18:43:40 +0800
committerBernard Xiong <[email protected]>2014-11-19 18:43:40 +0800
commit9ecd18411fc1344e3d080d844b60c7070c3fb4d8 (patch)
tree465af1aa4e8f392219ceb63273a86cd4b5ef56d6 /tools
parentd324c8876743ec623b93321d791fe9882c1f0d13 (diff)
parent3c65a522fdfc6c1516804096785bf6433a24feb4 (diff)
Merge pull request #381 from bright-pan/master
Add mdk5 building
Diffstat (limited to 'tools')
-rw-r--r--tools/building.py80
-rw-r--r--tools/keil.py171
2 files changed, 204 insertions, 47 deletions
diff --git a/tools/building.py b/tools/building.py
index 0bdaa8696b..f12452ed7d 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -67,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'
@@ -102,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',
@@ -148,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')
@@ -167,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'),
@@ -240,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')
@@ -268,7 +269,7 @@ def GetDepend(depend):
building = False
elif BuildOptions[depend] != '':
return BuildOptions[depend]
-
+
return building
# for list type depend
@@ -345,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)
@@ -369,14 +370,14 @@ def DefineGroup(name, src, depend, **parameters):
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
@@ -450,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:
@@ -459,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
@@ -485,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:
@@ -515,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()
@@ -561,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
@@ -574,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"]
@@ -607,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:
@@ -633,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, '')
@@ -645,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:
@@ -659,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'))
@@ -707,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 64afedfb65..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,16 +93,16 @@ 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:
@@ -110,28 +110,28 @@ def MDK4Project(target, script):
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 = ''
@@ -161,7 +161,154 @@ def MDK4Project(target, script):
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 = ''
+ 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)
+
+ # remove repeat path
+ paths = set()
+ 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.uvoptx'):
+ import shutil
+ shutil.copy2('template.uvoptx', 'project.uvoptx')
+
def MDKProject(target, script):
template = file('template.Uv2', "rb")
lines = template.readlines()