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
|
# 2018-05-30 Bernard The first version
|
||||||
# 2023-03-03 Supperthomas Add the vscode workspace config file
|
# 2023-03-03 Supperthomas Add the vscode workspace config file
|
||||||
# 2024-12-13 Supperthomas covert compile_commands.json to vscode workspace 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
|
Utils for VSCode
|
||||||
"""
|
"""
|
||||||
|
@ -63,7 +65,7 @@ def build_tree(paths):
|
||||||
tree = {}
|
tree = {}
|
||||||
current_working_directory = os.getcwd()
|
current_working_directory = os.getcwd()
|
||||||
current_folder_name = os.path.basename(current_working_directory)
|
current_folder_name = os.path.basename(current_working_directory)
|
||||||
#过滤异常和不存在的路径
|
# Filter out invalid and non-existent paths
|
||||||
relative_dirs = []
|
relative_dirs = []
|
||||||
for path in paths:
|
for path in paths:
|
||||||
normalized_path = os.path.normpath(path)
|
normalized_path = os.path.normpath(path)
|
||||||
|
@ -90,7 +92,7 @@ def extract_source_dirs(compile_commands):
|
||||||
if file_path.endswith('.c'):
|
if file_path.endswith('.c'):
|
||||||
dir_path = os.path.dirname(file_path)
|
dir_path = os.path.dirname(file_path)
|
||||||
source_dirs.add(dir_path)
|
source_dirs.add(dir_path)
|
||||||
# command 或者arguments
|
# command or arguments
|
||||||
command = entry.get('command') or entry.get('arguments')
|
command = entry.get('command') or entry.get('arguments')
|
||||||
|
|
||||||
if isinstance(command, str):
|
if isinstance(command, str):
|
||||||
|
@ -105,7 +107,7 @@ def extract_source_dirs(compile_commands):
|
||||||
elif part.startswith('/I'):
|
elif part.startswith('/I'):
|
||||||
include_dir = part[2:] if len(part) > 2 else parts[i + 1]
|
include_dir = part[2:] if len(part) > 2 else parts[i + 1]
|
||||||
source_dirs.add(os.path.abspath(include_dir))
|
source_dirs.add(os.path.abspath(include_dir))
|
||||||
#print(f"Source Directories: {source_dirs}")
|
|
||||||
return sorted(source_dirs)
|
return sorted(source_dirs)
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,8 +116,7 @@ def is_path_in_tree(path, tree):
|
||||||
current_level = tree
|
current_level = tree
|
||||||
found_first_node = False
|
found_first_node = False
|
||||||
root_key = list(tree.keys())[0]
|
root_key = list(tree.keys())[0]
|
||||||
#print(root_key)
|
|
||||||
#print(path)
|
|
||||||
index_start = parts.index(root_key)
|
index_start = parts.index(root_key)
|
||||||
length = len(parts)
|
length = len(parts)
|
||||||
try:
|
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'
|
workspace_filename = f'{current_folder_name}.code-workspace'
|
||||||
# print(workspace_data)
|
|
||||||
with open(workspace_filename, 'w') as f:
|
with open(workspace_filename, 'w') as f:
|
||||||
json.dump(workspace_data, f, indent=4)
|
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):
|
if not is_path_in_tree(dir_path, filtered_tree):
|
||||||
exclude_fold.add(dir_path)
|
exclude_fold.add(dir_path)
|
||||||
|
|
||||||
#print("Excluded Folders:")
|
|
||||||
#print(exclude_fold)
|
|
||||||
generate_code_workspace_file(exclude_fold,command_json_path,root_path)
|
generate_code_workspace_file(exclude_fold,command_json_path,root_path)
|
||||||
|
|
||||||
def delete_repeatelist(data):
|
def delete_repeatelist(data):
|
||||||
|
@ -340,6 +338,51 @@ def GenerateVSCode(env):
|
||||||
|
|
||||||
return
|
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):
|
def GenerateVSCodeWorkspace(env):
|
||||||
"""
|
"""
|
||||||
Generate vscode.code files
|
Generate vscode.code files
|
||||||
|
@ -349,6 +392,26 @@ def GenerateVSCodeWorkspace(env):
|
||||||
# get the launch directory
|
# get the launch directory
|
||||||
cwd = GetLaunchDir()
|
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
|
# check if .vscode folder exists, if not, create it
|
||||||
if not os.path.exists(os.path.join(cwd, '.vscode')):
|
if not os.path.exists(os.path.join(cwd, '.vscode')):
|
||||||
os.mkdir(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.write(json.dumps(json_obj, ensure_ascii=False, indent=4))
|
||||||
vsc_file.close()
|
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!')
|
print('Done!')
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue