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 @@ + + + + + + + + + +