diff --git a/tools/building.py b/tools/building.py
index 1de54e236b..3cea6fc692 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -208,7 +208,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
AddOption('--target',
dest = 'target',
type = 'string',
- help = 'set target project: mdk/mdk4/mdk5/iar/vs/vsc/ua/cdk/ses/makefile/eclipse')
+ help = 'set target project: mdk/mdk4/mdk5/iar/vs/vsc/ua/cdk/ses/makefile/eclipse/codelite')
AddOption('--stackanalysis',
dest = 'stackanalysis',
action = 'store_true',
@@ -256,7 +256,8 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
'cdk':('gcc', 'gcc'),
'makefile':('gcc', 'gcc'),
'eclipse':('gcc', 'gcc'),
- 'ses' : ('gcc', 'gcc')}
+ 'ses' : ('gcc', 'gcc'),
+ 'codelite' : ('gcc', 'gcc')}
tgt_name = GetOption('target')
if tgt_name:
@@ -872,6 +873,10 @@ def GenTargetProject(program = None):
if GetOption('target') == 'eclipse':
from eclipse import TargetEclipse
TargetEclipse(Env, GetOption('reset-project-config'), GetOption('project-name'))
+
+ if GetOption('target') == 'codelite':
+ from codelite import TargetCodelite
+ TargetCodelite(Projects, program)
def EndBuilding(target, program = None):
diff --git a/tools/codelite.py b/tools/codelite.py
new file mode 100644
index 0000000000..d63f9fbb72
--- /dev/null
+++ b/tools/codelite.py
@@ -0,0 +1,208 @@
+#
+# File : codelite.py
+# This file is part of RT-Thread RTOS
+# COPYRIGHT (C) 2006 - 2020, RT-Thread Development Team
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Change Logs:
+# Date Author Notes
+# 2020-10-14 LiuMin Add copyright information
+#
+
+import os
+import sys
+import string
+import building
+import rtconfig
+
+import xml.etree.ElementTree as etree
+from xml.etree.ElementTree import SubElement
+from utils import _make_path_relative
+from utils import xml_indent
+
+import utils
+
+fs_encoding = sys.getfilesystemencoding()
+
+def CLSetCFlags(root, flags):
+ node = root.find('Settings').find('Configuration').find('Compiler')
+ node.attrib['C_Options'] = flags
+
+def CLSetCxxFlags(root, flags):
+ node = root.find('Settings').find('Configuration').find('Compiler')
+ node.attrib['Options'] = flags
+
+def CLSetAsFlags(root, flags):
+ node = root.find('Settings').find('Configuration').find('Compiler')
+ node.attrib['Assembler'] = flags
+
+def CLAddIncludePath(root, path):
+ node = root.find('Settings').find('Configuration').find('Compiler')
+ node = SubElement(node, 'IncludePath')
+ node.attrib['Value'] = path
+
+def CLAddPreprocessor(root, value):
+ node = root.find('Settings').find('Configuration').find('Compiler')
+ node = SubElement(node, 'Preprocessor')
+ node.attrib['Value'] = value
+
+
+def CLSetLdFlags(root, flags):
+ node = root.find('Settings').find('Configuration').find('Linker')
+ node.attrib['Options'] = flags
+
+def CLAddLibrary_path(root, path):
+ node = root.find('Settings').find('Configuration').find('Linker')
+ node = SubElement(node, 'LibraryPath')
+ node.attrib['Value'] = path
+
+def CLAddLibrary(root, lib):
+ node = root.find('Settings').find('Configuration').find('Linker')
+ node = SubElement(node, 'Library')
+ node.attrib['Value'] = lib
+
+def CLAddFile(root, file_path):
+ file_path = file_path.replace('\\', '/')
+
+ dir_list = file_path.split('/')
+ dir_list.pop()
+ if not len(dir_list):
+ dir_list.append(os.path.abspath('.').replace('\\', '/').split('/')[-1])
+
+ parent = root
+ for dir_name in dir_list:
+ if dir_name == '..':
+ continue
+
+ node = None
+ nodes = parent.findall('VirtualDirectory')
+ for iter in nodes:
+ if iter.attrib['Name'] == dir_name:
+ node = iter
+ break
+ if node is None:
+ node = SubElement(parent, 'VirtualDirectory')
+ node.attrib['Name'] = dir_name
+ parent = node
+
+ if parent != root:
+ node = SubElement(parent, 'File')
+ node.attrib['Name'] = file_path
+
+def CLAddHeaderFiles(parent, program, project_path):
+ utils.source_ext = []
+ utils.source_ext = ["h"]
+ for item in program:
+ utils.walk_children(item)
+ utils.source_list.sort()
+
+ for f in utils.source_list:
+ path = _make_path_relative(project_path, f)
+ CLAddFile(parent, path)
+
+def CLAddCFiles(parent, files, project_path):
+ for f in files:
+ fn = f.rfile()
+ name = fn.name
+ path = os.path.dirname(fn.abspath)
+
+ path = _make_path_relative(project_path, path)
+ path = os.path.join(path, name)
+ CLAddFile(parent, path)
+
+
+
+def CLGenWorkspace(project_name, project_path):
+ if os.path.isfile('template.workspace'):
+ tree = etree.parse('template.workspace')
+ else:
+ tree = etree.parse(os.path.join(os.path.dirname(__file__), 'template.workspace'))
+
+ root = tree.getroot()
+ root.attrib['Name'] = project_name
+
+ node = root.find('Project')
+ node.attrib['Name'] = project_name
+ node.attrib['Path'] = project_name + '.project'
+
+ node = root.find('BuildMatrix').find('WorkspaceConfiguration').find('Project')
+ node.attrib['Name'] = project_name
+
+ out = open(project_name + '.workspace', 'w')
+ out.write('\n')
+ xml_indent(root)
+ out.write(etree.tostring(root, encoding='utf-8'))
+ out.close()
+
+def TargetCodelite(script, program):
+ project_name = os.path.abspath('.').replace('\\', '/').split('/')[-1]
+ #project_name.replace('-', '_')
+ project_path = os.path.abspath('.')
+ CLGenWorkspace(project_name, project_path)
+
+ if os.path.isfile('template.project'):
+ tree = etree.parse('template.project')
+ else:
+ tree = etree.parse(os.path.join(os.path.dirname(__file__), 'template.project'))
+
+ root = tree.getroot()
+ root.attrib['Name'] = project_name
+
+ out = open(project_name + '.project', 'w')
+ out.write('\n')
+
+ # add files
+ for group in script:
+ CLAddCFiles(root, group['src'], project_path)
+ # add header file
+ CLAddHeaderFiles(root, program, project_path)
+
+ # SECTION 2.
+ # write head include path
+
+ if 'CPPPATH' in building.Env:
+ cpp_path = building.Env['CPPPATH']
+ paths = set()
+ for path in cpp_path:
+ inc = _make_path_relative(project_path, os.path.normpath(path))
+ paths.add(inc) #.replace('\\', '/')
+
+ paths = [i for i in paths]
+ paths.sort()
+
+ # write include path, definitions
+ for elem in tree.iter(tag='Compiler'):
+ break
+
+ for path in paths:
+ CLAddIncludePath(root, path)
+
+
+ #print building.Env.get('LIBPATH', [])
+ #print building.Env.get('LIBS', [])
+
+ CLSetCFlags(root, building.Env.get('CCFLAGS', []))
+ CLSetCxxFlags(root, building.Env.get('CCFLAGS', []))
+ CLSetAsFlags(root, building.Env.get('ASFLAGS', []))
+ CLSetLdFlags(root, building.Env.get('LINKFLAGS', []))
+
+ for macro in building.Env.get('CPPDEFINES', []):
+ for d in macro:
+ CLAddPreprocessor(root, d)
+
+ xml_indent(root)
+ out.write(etree.tostring(root, encoding='utf-8'))
+ out.close()
diff --git a/tools/template.project b/tools/template.project
new file mode 100644
index 0000000000..0aa0ecc4c7
--- /dev/null
+++ b/tools/template.project
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ monitor reset
+monitor halt
+load
+
+
+
+
+ arm-none-eabi-objcopy -O ihex $(IntermediateDirectory)/$(ProjectName).elf $(IntermediateDirectory)/$(ProjectName).hex
+ arm-none-eabi-objcopy -I ihex -O binary $(IntermediateDirectory)/$(ProjectName).hex $(IntermediateDirectory)/$(ProjectName).bin
+ arm-none-eabi-size $(IntermediateDirectory)/$(ProjectName).elf
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/template.workspace b/tools/template.workspace
new file mode 100644
index 0000000000..8f06e0ce2b
--- /dev/null
+++ b/tools/template.workspace
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+