summaryrefslogtreecommitdiff
path: root/tools/eclipse.py
diff options
context:
space:
mode:
authorarmink <[email protected]>2019-10-31 12:15:43 +0800
committerarmink <[email protected]>2019-10-31 12:15:43 +0800
commita2a091666bd7056fb37be1cd3458fa2d0df60dfd (patch)
treeba7a70b2ace55e18cb95c6c340716ea362821919 /tools/eclipse.py
parent75ae3435d77a739881dbbc7a74fabcb7dd66d498 (diff)
[tools] add eclipse project for support --specs=nano.specs
Diffstat (limited to 'tools/eclipse.py')
-rw-r--r--tools/eclipse.py239
1 files changed, 134 insertions, 105 deletions
diff --git a/tools/eclipse.py b/tools/eclipse.py
index c7fefc0bda..2b0f442cb8 100644
--- a/tools/eclipse.py
+++ b/tools/eclipse.py
@@ -142,129 +142,158 @@ def HandleToolOption(tools, env, project, reset):
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
+ 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:
options = tool.findall('option')
- include_paths_option = None
- include_files_option = None
- defs_option = None
# 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:
- include_paths_option = option
+ 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 :
- include_files_option = option
+ compile_include_files_option = option
elif option.get('id').find('c.compiler.defs') != -1 or option.get('id').find('c.compiler.option.definedsymbols') != -1:
- defs_option = option
- # change the inclue path
- if include_paths_option is not None :
- option = include_paths_option
- # find all of paths in this project
- include_paths = option.findall('listOptionValue')
- for item in include_paths:
- if reset is True or IsRttEclipsePathFormat(item.get('value')) :
- # clean old configuration
- option.remove(item)
- # print('c.compiler.include.paths')
- paths = sorted(paths)
- for item in paths:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item})
- # change the inclue files (default) or definitions
- if include_files_option is not None:
- option = include_files_option
- file_header = '''
-#ifndef RTCONFIG_PREINC_H__
-#define RTCONFIG_PREINC_H__
-
-/* Automatically generated file; DO NOT EDIT. */
-/* RT-Thread pre-include file */
-
-'''
- file_tail = '\n#endif /*RTCONFIG_PREINC_H__*/\n'
- rtt_pre_inc_item = '"${workspace_loc:/${ProjName}/rtconfig_preinc.h}"'
- # save the CPPDEFINES in to rtconfig_preinc.h
- with open('rtconfig_preinc.h', mode = 'w+') as f:
- f.write(file_header)
- for cppdef in CPPDEFINES:
- f.write("#define " + cppdef + '\n')
- f.write(file_tail)
- # change the c.compiler.include.files
- files = option.findall('listOptionValue')
- find_ok = False
- for item in files:
- if item.get('value') == rtt_pre_inc_item:
- find_ok = True
- break
- if find_ok is False:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': rtt_pre_inc_item})
- elif defs_option is not None :
- option = defs_option
- 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:
- cproject_defs = CPPDEFINES
-
- # print('c.compiler.defs')
- cproject_defs = sorted(cproject_defs)
- for item in cproject_defs:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item})
+ compile_defs_option = option
if tool.get('id').find('c.linker') != -1:
options = tool.findall('option')
+ # find all linker options
for option in options:
- # update linker script config
if option.get('id').find('c.linker.scriptfile') != -1:
- linker_script = 'link.lds'
- items = env['LINKFLAGS'].split(' ')
- if '-T' in items:
- linker_script = items[items.index('-T') + 1]
- linker_script = ConverToRttEclipsePathFormat(linker_script)
+ linker_scriptfile_option = option
+ elif option.get('id').find('c.linker.option.script') != -1:
+ linker_script_option = option
+ elif option.get('id').find('c.linker.nostart') != -1:
+ linker_nostart_option = option
+ elif option.get('id').find('c.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'):
+ linker_paths_option = option
+ elif option.get('id').find('c.linker.usenewlibnano') != -1:
+ linker_newlib_nano_option = option
- listOptionValue = option.find('listOptionValue')
- if listOptionValue != None:
- listOptionValue.set('value', linker_script)
- else:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': linker_script})
+ # change the inclue path
+ if compile_include_paths_option is not None :
+ option = compile_include_paths_option
+ # find all of paths in this project
+ include_paths = option.findall('listOptionValue')
+ for item in include_paths:
+ if reset is True or IsRttEclipsePathFormat(item.get('value')) :
+ # clean old configuration
+ option.remove(item)
+ # print('c.compiler.include.paths')
+ paths = sorted(paths)
+ 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
+ # 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']
+ print(linker_newlib_nano_option.get('value'))
- # scriptfile in stm32cubeIDE
- if option.get('id').find('c.linker.option.script') != -1:
- items = env['LINKFLAGS'].split(' ')
- if '-T' in items:
- linker_script = ConverToRttEclipsePathFormat(items[items.index('-T') + 1]).strip('"')
- option.set('value',linker_script)
+ file_header = '''
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+'''
+ file_tail = '\n#endif /*RTCONFIG_PREINC_H__*/\n'
+ rtt_pre_inc_item = '"${workspace_loc:/${ProjName}/rtconfig_preinc.h}"'
+ # save the CPPDEFINES in to rtconfig_preinc.h
+ with open('rtconfig_preinc.h', mode = 'w+') as f:
+ f.write(file_header)
+ for cppdef in CPPDEFINES:
+ f.write("#define " + cppdef + '\n')
+ f.write(file_tail)
+ # change the c.compiler.include.files
+ files = option.findall('listOptionValue')
+ find_ok = False
+ for item in files:
+ if item.get('value') == rtt_pre_inc_item:
+ find_ok = True
+ 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)
+ else:
+ project_defs += [item.get('value')]
+ if len(project_defs) > 0:
+ cproject_defs = set(CPPDEFINES) - set(project_defs)
+ else:
+ cproject_defs = CPPDEFINES
- # update nostartfiles config
- if option.get('id').find('c.linker.nostart') != -1:
- if env['LINKFLAGS'].find('-nostartfiles') != -1:
- option.set('value', 'true')
- else:
- option.set('value', 'false')
+ # print('c.compiler.defs')
+ cproject_defs = sorted(cproject_defs)
+ for item in cproject_defs:
+ SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': item})
- # update libs
- if option.get('id').find('c.linker.libs') != -1 and env.has_key('LIBS'):
- # remove old libs
- for item in option.findall('listOptionValue'):
- option.remove(item)
- # add new libs
- for lib in env['LIBS']:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': lib})
+ # update linker script config
+ if linker_scriptfile_option is not None :
+ option = linker_scriptfile_option
+ linker_script = 'link.lds'
+ items = env['LINKFLAGS'].split(' ')
+ if '-T' in items:
+ linker_script = items[items.index('-T') + 1]
+ linker_script = ConverToRttEclipsePathFormat(linker_script)
- # update lib paths
- if option.get('id').find('c.linker.paths') != -1 and env.has_key('LIBPATH'):
- # remove old lib paths
- for item in option.findall('listOptionValue'):
- option.remove(item)
- # add new old lib paths
- for path in env['LIBPATH']:
- SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': path})
+ listOptionValue = option.find('listOptionValue')
+ if listOptionValue != None:
+ listOptionValue.set('value', linker_script)
+ else:
+ SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': linker_script})
+ # scriptfile in stm32cubeIDE
+ if linker_script_option is not None :
+ option = linker_script_option
+ items = env['LINKFLAGS'].split(' ')
+ if '-T' in items:
+ linker_script = ConverToRttEclipsePathFormat(items[items.index('-T') + 1]).strip('"')
+ option.set('value', linker_script)
+ # update nostartfiles config
+ if linker_nostart_option is not None :
+ option = linker_nostart_option
+ if env['LINKFLAGS'].find('-nostartfiles') != -1:
+ option.set('value', 'true')
+ else:
+ option.set('value', 'false')
+ # update libs
+ if linker_libs_option is not None :
+ option = linker_libs_option
+ # remove old libs
+ for item in option.findall('listOptionValue'):
+ option.remove(item)
+ # add new libs
+ for lib in env['LIBS']:
+ SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': lib})
+ # update lib paths
+ if linker_paths_option is not None :
+ option = linker_paths_option
+ # remove old lib paths
+ for item in option.findall('listOptionValue'):
+ option.remove(item)
+ # add new old lib paths
+ for path in env['LIBPATH']:
+ SubElement(option, 'listOptionValue', {'builtIn': 'false', 'value': path})
return