From fd3dd9d85b2e3858e188cce5ecb5c938390bd636 Mon Sep 17 00:00:00 2001 From: armink Date: Sun, 16 Feb 2020 18:38:53 +0800 Subject: [PATCH] [tools] add C++ support for eclipse target --- tools/eclipse.py | 92 ++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/tools/eclipse.py b/tools/eclipse.py index 253db37bea..916041019a 100644 --- a/tools/eclipse.py +++ b/tools/eclipse.py @@ -20,6 +20,8 @@ from utils import xml_indent import xml.etree.ElementTree as etree from xml.etree.ElementTree import SubElement +MODULE_VER_NUM = 0 + source_pattern = ['*.c', '*.cpp', '*.cxx', '*.s', '*.S', '*.asm'] def OSPath(path): @@ -134,57 +136,70 @@ def IsRttEclipsePathFormat(path): return True else : return False + + +def IsCppProject(): + with open('.project', mode = 'r') as f: + for line in f.readlines(): + if line.find('org.eclipse.cdt.core.ccnature') != -1: + return True + return False - + def HandleToolOption(tools, env, project, reset): + is_cpp_prj = IsCppProject() BSP_ROOT = os.path.abspath(env['BSP_ROOT']) CPPDEFINES = project['CPPDEFINES'] paths = [ConverToRttEclipsePathFormat(RelativeProjectPath(env, os.path.normpath(i)).replace('\\', '/')) for i in project['CPPPATH']] - compile_include_paths_option = None - compile_include_files_option = None - compile_defs_option = None + compile_include_paths_options = [] + compile_include_files_options = [] + compile_defs_options = [] linker_scriptfile_option = None linker_script_option = None linker_nostart_option = None linker_libs_option = None linker_paths_option = None + linker_newlib_nano_option = None for tool in tools: - if tool.get('id').find('c.compile') != 1: + if tool.get('id').find('compile') != 1: options = tool.findall('option') # find all compile options for option in options: - if option.get('id').find('c.compiler.include.paths') != -1 or option.get('id').find('c.compiler.option.includepaths') != -1: - compile_include_paths_option = option - elif option.get('id').find('c.compiler.include.files') != -1 or option.get('id').find('c.compiler.option.includefiles') != -1 : - compile_include_files_option = option - elif option.get('id').find('c.compiler.defs') != -1 or option.get('id').find('c.compiler.option.definedsymbols') != -1: - compile_defs_option = option + if option.get('id').find('compiler.include.paths') != -1 or option.get('id').find('compiler.option.includepaths') != -1: + compile_include_paths_options += [option] + elif option.get('id').find('compiler.include.files') != -1 or option.get('id').find('compiler.option.includefiles') != -1 : + compile_include_files_options += [option] + elif option.get('id').find('compiler.defs') != -1 or option.get('id').find('compiler.option.definedsymbols') != -1: + compile_defs_options += [option] - if tool.get('id').find('c.linker') != -1: + if tool.get('id').find('linker') != -1: options = tool.findall('option') # find all linker options for option in options: - if option.get('id').find('c.linker.scriptfile') != -1: + # the project type and option type must equal + if is_cpp_prj != (option.get('id').find('cpp.linker') != -1): + continue + + if option.get('id').find('linker.scriptfile') != -1: linker_scriptfile_option = option - elif option.get('id').find('c.linker.option.script') != -1: + elif option.get('id').find('linker.option.script') != -1: linker_script_option = option - elif option.get('id').find('c.linker.nostart') != -1: + elif option.get('id').find('linker.nostart') != -1: linker_nostart_option = option - elif option.get('id').find('c.linker.libs') != -1 and env.has_key('LIBS'): + elif option.get('id').find('linker.libs') != -1 and env.has_key('LIBS'): linker_libs_option = option - elif option.get('id').find('c.linker.paths') != -1 and env.has_key('LIBPATH'): + elif option.get('id').find('linker.paths') != -1 and env.has_key('LIBPATH'): linker_paths_option = option - elif option.get('id').find('c.linker.usenewlibnano') != -1: + elif option.get('id').find('linker.usenewlibnano') != -1: linker_newlib_nano_option = option # change the inclue path - if compile_include_paths_option is not None : - option = compile_include_paths_option + for option in compile_include_paths_options: # find all of paths in this project include_paths = option.findall('listOptionValue') for item in include_paths: @@ -196,8 +211,7 @@ def HandleToolOption(tools, env, project, reset): for item in paths: SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item}) # change the inclue files (default) or definitions - if compile_include_files_option is not None: - option = compile_include_files_option + for option in compile_include_files_options: # add '_REENT_SMALL' to CPPDEFINES when --specs=nano.specs has select if linker_newlib_nano_option is not None and linker_newlib_nano_option.get('value') == 'true' and '_REENT_SMALL' not in CPPDEFINES: CPPDEFINES += ['_REENT_SMALL'] @@ -227,25 +241,25 @@ def HandleToolOption(tools, env, project, reset): break if find_ok is False: SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': rtt_pre_inc_item}) - elif compile_defs_option is not None : - option = compile_defs_option - defs = option.findall('listOptionValue') - project_defs = [] - for item in defs: - if reset is True: - # clean all old configuration - option.remove(item) + if len(compile_include_files_options) == 0: + for option in compile_defs_options: + defs = option.findall('listOptionValue') + project_defs = [] + for item in defs: + if reset is True: + # clean all old configuration + option.remove(item) + else: + project_defs += [item.get('value')] + if len(project_defs) > 0: + cproject_defs = set(CPPDEFINES) - set(project_defs) else: - project_defs += [item.get('value')] - if len(project_defs) > 0: - cproject_defs = set(CPPDEFINES) - set(project_defs) - else: - cproject_defs = CPPDEFINES + cproject_defs = CPPDEFINES - # print('c.compiler.defs') - cproject_defs = sorted(cproject_defs) - for item in cproject_defs: - SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item}) + # print('c.compiler.defs') + cproject_defs = sorted(cproject_defs) + for item in cproject_defs: + SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item}) # update linker script config if linker_scriptfile_option is not None :