mirror of https://github.com/RT-Thread/rt-thread
[tools] Add workspace generation for RT-Thread root directory.
This commit is contained in:
parent
1a07d6926b
commit
0f478b6496
|
@ -22,6 +22,8 @@
|
|||
# 2018-05-30 Bernard The first version
|
||||
# 2023-03-03 Supperthomas Add the vscode workspace config file
|
||||
# 2024-12-13 Supperthomas covert compile_commands.json to vscode workspace file
|
||||
# 2025-07-05 Bernard Add support for generating .vscode/c_cpp_properties.json
|
||||
# and .vscode/settings.json files
|
||||
"""
|
||||
Utils for VSCode
|
||||
"""
|
||||
|
@ -63,7 +65,7 @@ def build_tree(paths):
|
|||
tree = {}
|
||||
current_working_directory = os.getcwd()
|
||||
current_folder_name = os.path.basename(current_working_directory)
|
||||
#过滤异常和不存在的路径
|
||||
# Filter out invalid and non-existent paths
|
||||
relative_dirs = []
|
||||
for path in paths:
|
||||
normalized_path = os.path.normpath(path)
|
||||
|
@ -90,7 +92,7 @@ def extract_source_dirs(compile_commands):
|
|||
if file_path.endswith('.c'):
|
||||
dir_path = os.path.dirname(file_path)
|
||||
source_dirs.add(dir_path)
|
||||
# command 或者arguments
|
||||
# command or arguments
|
||||
command = entry.get('command') or entry.get('arguments')
|
||||
|
||||
if isinstance(command, str):
|
||||
|
@ -105,7 +107,7 @@ def extract_source_dirs(compile_commands):
|
|||
elif part.startswith('/I'):
|
||||
include_dir = part[2:] if len(part) > 2 else parts[i + 1]
|
||||
source_dirs.add(os.path.abspath(include_dir))
|
||||
#print(f"Source Directories: {source_dirs}")
|
||||
|
||||
return sorted(source_dirs)
|
||||
|
||||
|
||||
|
@ -114,8 +116,7 @@ def is_path_in_tree(path, tree):
|
|||
current_level = tree
|
||||
found_first_node = False
|
||||
root_key = list(tree.keys())[0]
|
||||
#print(root_key)
|
||||
#print(path)
|
||||
|
||||
index_start = parts.index(root_key)
|
||||
length = len(parts)
|
||||
try:
|
||||
|
@ -155,7 +156,6 @@ def generate_code_workspace_file(source_dirs,command_json_path,root_path):
|
|||
}
|
||||
}
|
||||
workspace_filename = f'{current_folder_name}.code-workspace'
|
||||
# print(workspace_data)
|
||||
with open(workspace_filename, 'w') as f:
|
||||
json.dump(workspace_data, f, indent=4)
|
||||
|
||||
|
@ -193,8 +193,6 @@ def command_json_to_workspace(root_path,command_json_path):
|
|||
if not is_path_in_tree(dir_path, filtered_tree):
|
||||
exclude_fold.add(dir_path)
|
||||
|
||||
#print("Excluded Folders:")
|
||||
#print(exclude_fold)
|
||||
generate_code_workspace_file(exclude_fold,command_json_path,root_path)
|
||||
|
||||
def delete_repeatelist(data):
|
||||
|
@ -340,6 +338,51 @@ def GenerateVSCode(env):
|
|||
|
||||
return
|
||||
|
||||
import os
|
||||
|
||||
def find_rtconfig_dirs(bsp_dir, project_dir):
|
||||
"""
|
||||
Search for subdirectories containing 'rtconfig.h' under 'bsp_dir' (up to 4 levels deep), excluding 'project_dir'.
|
||||
|
||||
Args:
|
||||
bsp_dir (str): The root directory to search (absolute path).
|
||||
project_dir (str): The subdirectory to exclude from the search (absolute path).
|
||||
|
||||
Returns
|
||||
list: A list of absolute paths to subdirectories containing 'rtconfig.h'.
|
||||
"""
|
||||
|
||||
result = []
|
||||
project_dir = os.path.normpath(project_dir)
|
||||
|
||||
# list the bsp_dir to add result
|
||||
list = os.listdir(bsp_dir)
|
||||
for item in list:
|
||||
item = os.path.join(bsp_dir, item)
|
||||
|
||||
# if item is a directory
|
||||
if not os.path.isdir(item):
|
||||
continue
|
||||
|
||||
# print(item, project_dir)
|
||||
if not project_dir.startswith(item):
|
||||
result.append(os.path.abspath(item))
|
||||
|
||||
parent_dir = os.path.dirname(project_dir)
|
||||
|
||||
if parent_dir != bsp_dir:
|
||||
list = os.listdir(parent_dir)
|
||||
for item in list:
|
||||
item = os.path.join(parent_dir, item)
|
||||
rtconfig_path = os.path.join(item, 'rtconfig.h')
|
||||
if os.path.isfile(rtconfig_path):
|
||||
abs_path = os.path.abspath(item)
|
||||
if abs_path != project_dir:
|
||||
result.append(abs_path)
|
||||
|
||||
# print(result)
|
||||
return result
|
||||
|
||||
def GenerateVSCodeWorkspace(env):
|
||||
"""
|
||||
Generate vscode.code files
|
||||
|
@ -349,6 +392,26 @@ def GenerateVSCodeWorkspace(env):
|
|||
# get the launch directory
|
||||
cwd = GetLaunchDir()
|
||||
|
||||
# get .vscode/workspace.json file
|
||||
workspace_file = os.path.join(cwd, '.vscode', 'workspace.json')
|
||||
if not os.path.exists(workspace_file):
|
||||
print('Workspace file not found, skip generating.')
|
||||
return
|
||||
|
||||
try:
|
||||
# read the workspace file
|
||||
with open(workspace_file, 'r') as f:
|
||||
workspace_data = json.load(f)
|
||||
|
||||
# get the bsp directories from the workspace data, bsps/folder
|
||||
bsp_dir = os.path.join(cwd, workspace_data.get('bsps', {}).get('folder', ''))
|
||||
if not bsp_dir:
|
||||
print('No BSP directories found in the workspace file, skip generating.')
|
||||
return
|
||||
except Exception as e:
|
||||
print('Error reading workspace file, skip generating.')
|
||||
return
|
||||
|
||||
# check if .vscode folder exists, if not, create it
|
||||
if not os.path.exists(os.path.join(cwd, '.vscode')):
|
||||
os.mkdir(os.path.join(cwd, '.vscode'))
|
||||
|
@ -391,6 +454,36 @@ def GenerateVSCodeWorkspace(env):
|
|||
vsc_file.write(json.dumps(json_obj, ensure_ascii=False, indent=4))
|
||||
vsc_file.close()
|
||||
|
||||
# generate .vscode/settings.json
|
||||
vsc_settings = {}
|
||||
settings_path = os.path.join(cwd, '.vscode/settings.json')
|
||||
if os.path.exists(settings_path):
|
||||
with open(settings_path, 'r') as f:
|
||||
# read the existing settings file and load to vsc_settings
|
||||
vsc_settings = json.load(f)
|
||||
|
||||
vsc_file = open(settings_path, 'w')
|
||||
if vsc_file:
|
||||
vsc_settings['files.exclude'] = {
|
||||
"**/__pycache__": True,
|
||||
"tools/kconfig-frontends": True,
|
||||
}
|
||||
|
||||
result = find_rtconfig_dirs(bsp_dir, os.getcwd())
|
||||
if result:
|
||||
# sort the result
|
||||
result = sorted(result, key=lambda x: x.lower())
|
||||
for item in result:
|
||||
# make the path relative to the current working directory
|
||||
rel_path = os.path.relpath(item, cwd)
|
||||
# add the path to files.exclude
|
||||
vsc_settings['files.exclude'][rel_path] = True
|
||||
|
||||
vsc_settings['search.exclude'] = vsc_settings['files.exclude']
|
||||
# write the settings to the file
|
||||
vsc_file.write(json.dumps(vsc_settings, ensure_ascii=False, indent=4))
|
||||
vsc_file.close()
|
||||
|
||||
print('Done!')
|
||||
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue