diff --git a/tools/eclipse.py b/tools/eclipse.py
index 154bffb754..988a8fe7d3 100644
--- a/tools/eclipse.py
+++ b/tools/eclipse.py
@@ -9,23 +9,21 @@
# 2019-04-15 armink fix project update error
#
-import os
-import sys
import glob
+import xml.etree.ElementTree as etree
+from xml.etree.ElementTree import SubElement
+import studio
+from building import *
from utils import *
from utils import _make_path_relative
from utils import xml_indent
-import xml.etree.ElementTree as etree
-from xml.etree.ElementTree import SubElement
-
-from building import *
-
-MODULE_VER_NUM = 5
+MODULE_VER_NUM = 6
source_pattern = ['*.c', '*.cpp', '*.cxx', '*.s', '*.S', '*.asm']
+
def OSPath(path):
import platform
@@ -60,9 +58,12 @@ def CollectPaths(paths):
all_paths = list(set(all_paths))
return sorted(all_paths)
+
'''
Collect all of files under paths
'''
+
+
def CollectFiles(paths, pattern):
files = []
for path in paths:
@@ -75,6 +76,7 @@ def CollectFiles(paths, pattern):
return sorted(files)
+
def CollectAllFilesinPath(path, pattern):
files = []
@@ -93,11 +95,14 @@ def CollectAllFilesinPath(path, pattern):
files = files + CollectAllFilesinPath(os.path.join(path, item), pattern)
return files
+
'''
Exclude files from infiles
'''
+
+
def ExcludeFiles(infiles, files):
- in_files = set([OSPath(file) for file in infiles])
+ in_files = set([OSPath(file) for file in infiles])
exl_files = set([OSPath(file) for file in files])
exl_files = in_files - exl_files
@@ -136,9 +141,10 @@ def ConverToRttEclipsePathFormat(path):
def IsRttEclipsePathFormat(path):
if path.startswith(rtt_path_prefix):
return True
- else :
+ else:
return False
+
# all libs added by scons should be ends with five whitespace as a flag
rtt_lib_flag = 5 * " "
@@ -152,12 +158,12 @@ def IsRttEclipseLibFormat(path):
return True
else:
return False
-
-
+
+
def IsCppProject():
return GetDepend('RT_USING_CPLUSPLUS')
-
+
def HandleToolOption(tools, env, project, reset):
is_cpp_prj = IsCppProject()
BSP_ROOT = os.path.abspath(env['BSP_ROOT'])
@@ -358,7 +364,7 @@ def UpdateProjectStructure(env, prj_name):
out = open('.project', 'w')
out.write('\n')
xml_indent(root)
- out.write(etree.tostring(root, encoding = 'utf-8'))
+ out.write(etree.tostring(root, encoding='utf-8'))
out.close()
return
@@ -384,8 +390,8 @@ def GenExcluding(env, project):
check_path = []
exclude_paths = []
# analyze the primary folder which relative to BSP_ROOT and in all_paths
- for path in all_paths :
- if path.startswith(bsp_root) :
+ for path in all_paths:
+ if path.startswith(bsp_root):
folders = RelativeProjectPath(env, path).split('\\')
if folders[0] != '.' and '\\' + folders[0] not in check_path:
check_path += ['\\' + folders[0]]
@@ -420,16 +426,16 @@ def GenExcluding(env, project):
env['ExPaths'] = exclude_paths
env['ExFiles'] = exclude_files
- return exclude_paths + exclude_files
+ return exclude_paths + exclude_files
def RelativeProjectPath(env, path):
project_root = os.path.abspath(env['BSP_ROOT'])
rtt_root = os.path.abspath(env['RTT_ROOT'])
-
+
if path.startswith(project_root):
return _make_path_relative(project_root, path)
-
+
if path.startswith(rtt_root):
return 'rt-thread/' + _make_path_relative(rtt_root, path)
@@ -447,9 +453,9 @@ def HandleExcludingOption(entry, sourceEntries, excluding):
value = ''
for item in old_excluding:
- if item.startswith('//') :
+ if item.startswith('//'):
old_excluding.remove(item)
- else :
+ else:
if value == '':
value = item
else:
@@ -498,13 +504,44 @@ def UpdateCproject(env, project, excluding, reset, prj_name):
out.close()
-def TargetEclipse(env, reset = False, prj_name = None):
+def TargetEclipse(env, reset=False, prj_name=None):
global source_pattern
print('Update eclipse setting...')
+ # generate cproject file
if not os.path.exists('.cproject'):
- print('no eclipse CDT project found!')
+ if studio.gen_cproject_file(os.path.abspath(".cproject")) is False:
+ print('Fail!')
+ return
+
+ # generate project file
+ if not os.path.exists('.project'):
+ if studio.gen_project_file(os.path.abspath(".project")) is False:
+ print('Fail!')
+ return
+
+ # generate projcfg.ini file
+ if not os.path.exists('.settings/projcfg.ini'):
+ if os.path.exists("template.uvprojx"):
+ file = os.path.abspath("template.uvprojx")
+ else:
+ file = os.path.abspath("template.uvproj")
+ chip_name = studio.get_mcu_info(file)
+ if studio.gen_projcfg_ini_file(chip_name, prj_name, os.path.abspath(".settings/projcfg.ini")) is False:
+ print('Fail!')
+ return
+
+ # enable lowwer .s file compiled in eclipse cdt
+ if not os.path.exists('.settings/org.eclipse.core.runtime.prefs'):
+ if studio.gen_org_eclipse_core_runtime_prefs(
+ os.path.abspath(".settings/org.eclipse.core.runtime.prefs")) is False:
+ print('Fail!')
+ return
+
+ # add clean2 target to fix issues when files too many
+ if studio.gen_makefile_targets(os.path.abspath("makefile.targets")) is False:
+ print('Fail!')
return
project = ProjectInfo(env)
diff --git a/tools/studio.py b/tools/studio.py
new file mode 100644
index 0000000000..0a23d6488b
--- /dev/null
+++ b/tools/studio.py
@@ -0,0 +1,339 @@
+import os
+import re
+from string import Template
+
+import rtconfig
+
+cproject_temp = """
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"""
+
+project_temp = """
+
+ __project_name_flag__
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.rt-thread.studio.rttnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+"""
+
+projcfg_ini_temp = """#RT-Thread Studio Project Configuration
+#Sat Jan 16 15:18:32 CST 2021
+project_type=rtt
+chip_name=${chip_name}
+cpu_name=None
+target_freq=
+clock_source=
+dvendor_name=
+rx_pin_name=
+rtt_path=
+source_freq=
+csp_path=
+sub_series_name=
+selected_rtt_version=latest
+cfg_version=v3.0
+tool_chain=gcc
+uart_name=
+tx_pin_name=
+rtt_nano_path=
+output_project_path=
+hardware_adapter=J-Link
+project_name=${project_name}"""
+
+eclipse_core_runtime_temp = """content-types/enabled=true
+content-types/org.eclipse.cdt.core.asmSource/file-extensions=s
+eclipse.preferences.version=1"""
+
+makefile_targets_temp = """clean2:
+\t-$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+\t-$(RM) $(OBJS) *.elf
+\t-@echo ' '
+
+*.elf: $(wildcard ../linkscripts/*/*.lds) $(wildcard ../linkscripts/*/*/*.lds)"""
+
+
+def get_mcu_info(uvproj_file_path):
+ if os.path.exists(uvproj_file_path):
+ with open(uvproj_file_path, mode='r') as f:
+ data = f.read()
+ result = re.search("(.*)", data)
+ if result:
+ return result.group(1)
+ else:
+ return ""
+ else:
+ return ""
+
+
+def gen_makefile_targets(output_file_path):
+ try:
+ w_str = makefile_targets_temp
+ dir_name = os.path.dirname(output_file_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ with open(output_file_path, 'w') as f:
+ f.write(w_str)
+ return True
+ except Exception as e:
+ print(e)
+ return False
+
+
+def gen_org_eclipse_core_runtime_prefs(output_file_path):
+ try:
+ w_str = eclipse_core_runtime_temp
+ dir_name = os.path.dirname(output_file_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ with open(output_file_path, 'w') as f:
+ f.write(w_str)
+ return True
+ except Exception as e:
+ print(e)
+ return False
+
+
+def gen_cproject_file(output_file_path):
+ CFLAGS = rtconfig.CFLAGS
+ AFLAGS = rtconfig.AFLAGS
+ LFLAGS = rtconfig.LFLAGS
+ if 'CXXFLAGS' in dir(rtconfig):
+ CXXFLAGS = rtconfig.CXXFLAGS
+ else:
+ CXXFLAGS = ""
+
+ if "-T" in LFLAGS:
+ items = str(LFLAGS).split()
+ t_index = items.index("-T")
+ items[t_index] = ""
+ items[t_index + 1] = ""
+ LFLAGS = " ".join(items)
+
+ try:
+ w_str = cproject_temp
+ if "a_misc_flag" in w_str:
+ w_str = w_str.replace("a_misc_flag", AFLAGS)
+ if "c_misc_flag" in w_str:
+ w_str = w_str.replace("c_misc_flag", CFLAGS)
+ if "cpp_misc_flag" in w_str:
+ w_str = w_str.replace("cpp_misc_flag", CXXFLAGS)
+ if "c_link_misc_flag" in w_str:
+ w_str = w_str.replace("c_link_misc_flag", LFLAGS)
+ if "cpp_link_misc_flag" in w_str:
+ w_str = w_str.replace("cpp_link_misc_flag", LFLAGS)
+
+ dir_name = os.path.dirname(output_file_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ with open(output_file_path, 'w') as f:
+ f.write(w_str)
+ return True
+ except Exception as e:
+ return False
+
+
+def gen_project_file(output_file_path):
+ try:
+ w_str = project_temp
+ dir_name = os.path.dirname(output_file_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ with open(output_file_path, 'w') as f:
+ f.write(w_str)
+ return True
+ except Exception as e:
+ return False
+
+
+def gen_projcfg_ini_file(chip_name, project_name, output_file_path):
+ try:
+ projcfg_file_tmp = Template(projcfg_ini_temp)
+ w_str = projcfg_file_tmp.substitute(project_name=project_name,
+ chip_name=(chip_name))
+
+ dir_name = os.path.dirname(output_file_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ with open(output_file_path, 'w') as f:
+ f.write(w_str)
+ return True
+ except Exception as e:
+ return False