最近想移植个LVGL玩玩,发现文件实在是太多了,加的手疼都没搞完,实在不想搞了就去找脚本和工具,基本没找到一个。。。。。。

主要是自己也懒得去研究写脚本,偶然搜到了一个博主写的脚本,原博客地址:https://blog.csdn.net/riyue2044/article/details/139424599

但是有以下问题:

1.这个脚本的.h文件也加在了分组下面,这样一般是部队的,应该加在Target的C/C++的Include path里面

2.脚本没有重复添加检测,导致如果多次添加,会损坏工程文件

3.输入是命令行式的,使用者可能会忘了参数具体设置

之前没接触过XML,python也不熟,所以研究了一下,做以下修改

1.把之前的命令行式的输入改为先运行再输入,会提示具体的参数设置,有默认参数,是以我的工程包来写的

2.把.h文件路径直接加在了Target的C/C++的Include path里面

3.加入文件路径检测,重复添加不会导致文件损坏

4.加入更多提示

5.加入三种模式    0:.c文件和.h路径会一起添加 1:只加.c文件 2:只加.h路径

使用方法:需要安装python,或者用python打包成exe文件也可

脚本需放在keil工程目录,需要添加的目录则以相对路径填充,比如"../../../external/lvgl",需要注意的是分组需要提前在keil里面创建好,这个懒得改了,有需要的朋友可以自行修改

脚本内容如下:

  1 import os
2 import glob
3 import xml.etree.ElementTree as ET
4 import argparse
5
6 def indent(elem, level=0):
7 """ Helper function to indent the XML for pretty printing. """
8 i = "\n" + level * " "
9 if len(elem):
10 if not elem.text or not elem.text.strip():
11 elem.text = i + " "
12 if not elem.tail or not elem.tail.strip():
13 elem.tail = i
14 for elem in elem:
15 indent(elem, level + 1)
16 if not elem.tail or not elem.tail.strip():
17 elem.tail = i
18 else:
19 if level and (not elem.tail or not elem.tail.strip()):
20 elem.tail = i
21 if not elem.tail:
22 elem.tail = "\n"
23
24 def add_files_to_group(uvprojx_file_path, mode,folder_path, group_name_target):
25 # 改变文件扩展名从 .uvprojx 到 .xml
26 base, ext = os.path.splitext(uvprojx_file_path)
27 if ext != '.uvprojx':
28 print("工程文件扩展名不正确")
29 return
30
31 xml_path = base + '.xml'
32 os.rename(uvprojx_file_path, xml_path)
33
34 try:
35 #解析XML文件
36 tree = ET.parse(xml_path)
37 #获取根节点
38 root = tree.getroot()
39
40 if mode == 0 or mode == 1:
41 # 找到指定GroupName的Group节点
42 target_group = None
43 for group in root.findall('.//Group'):
44 group_name = group.find('GroupName')
45 if group_name is not None and group_name.text == group_name_target:
46 target_group = group
47 break
48
49 if target_group is None:
50 print(f"未发现 '{group_name_target}' 分组,请先创建分组后再尝试")
51 # 将文件扩展名改回 .uvprojx
52 os.rename(xml_path, uvprojx_file_path)
53 return
54
55 # 找到目标 Group 节点下的 Files 节点,如果不存在则创建一个
56 files_node = target_group.find('Files')
57 if files_node is None:
58 files_node = ET.SubElement(target_group, 'Files')
59
60 #寻找头文件分组
61 if mode == 0 or mode == 2:
62 print("寻找头文件分组......")
63 target_header = None
64 heard_inc = None
65 target_header = root.find('.//Cads')
66 if target_header == None:
67 print("未发现头文件分组Cads")
68 return
69 else:
70 heard_inc = target_header.find('VariousControls')
71 if heard_inc == None:
72 print("未发现头文件分组VariousControls")
73 return
74 else:
75 heard_inc = heard_inc.find('IncludePath')
76 if heard_inc == None:
77 print("未发现头文件分组IncludePath")
78 return
79 else:
80 print("找到头文件分组")
81
82
83
84 #下面没有节点
85 if mode == 0 or mode == 1:
86 creat_dot = 0 #是否需要创建节点标志,如果有重复则跳过
87 init_creat = 0
88 file_init = files_node.find('File')
89 if file_init == None:
90 creat_dot = 1
91 init_creat = 1
92 print("初始节点为空需要创建节点")
93
94 # 遍历指定文件夹,查找所有 .c 文件
95 if mode == 0 or mode == 2:
96 #print(heard_inc.text)
97 heard_data = heard_inc.text
98
99 for subdir, _, files in os.walk(folder_path):
100 #.h路径
101 if mode == 0 or mode == 2:
102 dir_path = os.path.relpath(subdir, start=os.path.dirname(xml_path))
103 if dir_path in heard_inc.text:
104 print("需要添加的头文件路径已存在本次跳过")
105 else:
106 heard_data = heard_data + dir_path + ";"
107
108 #.c添加到分组
109 if mode == 0 or mode == 1:
110 for file in files:
111 if file.endswith('.c'):
112 # 计算相对路径
113 file_path = os.path.relpath(os.path.join(subdir, file), start=os.path.dirname(xml_path))
114 #print("路径",file_path)
115 file_check = files_node.findall('File')
116 if init_creat == 0:
117 #print("长度",len(file_check))
118 #遍历当前分组下的节点,检测是否已经包含了该路径,如果有直接跳过
119 for i in range(len(file_check)):
120 if file_path in file_check[i].find("FilePath").text:
121 print("节点已存在本次跳过")
122 creat_dot = 0
123 break
124 else:
125 if i == len(file_check) - 1:
126 creat_dot = 1
127 print("节点不存在,创建节点")
128 else:
129 creat_dot = 0
130 continue
131 if creat_dot == 1:
132 # 创建 File 节点并添加到 Files 节点下
133 file_node = ET.SubElement(files_node, 'File')
134 file_name_node = ET.SubElement(file_node, 'FileName')
135 file_name_node.text = file
136 file_type_node = ET.SubElement(file_node, 'FileType')
137 file_type_node.text = '1' # .c 文件类型都为 1
138
139 file_path_node = ET.SubElement(file_node, 'FilePath')
140 file_path_node.text = file_path
141 creat_dot = 0
142 init_creat = 0
143
144 if mode == 0 or mode == 2:
145 heard_data = heard_data.rstrip(";") #移除最后一个多加的;
146 heard_inc.text = heard_data
147 #print(heard_inc.text)
148
149 # 格式化 XML
150 indent(root)
151
152 # 保存修改后的 XML 文件
153 tree.write(xml_path, encoding='utf-8', xml_declaration=True)
154 print("已完成")
155
156 except ET.ParseError as e:
157 print(f"ParseError: {e}")
158 with open(xml_path, 'r', encoding='utf-8') as file:
159 lines = file.readlines()
160 start = max(0, e.position[0] - 5)
161 end = min(len(lines), e.position[0] + 5)
162 print("Context around the error:")
163 for i in range(start, end):
164 print(f"{i+1}: {lines[i].strip()}")
165
166 finally:
167 # 将文件扩展名改回 .uvprojx
168 os.rename(xml_path, uvprojx_file_path)
169
170 #寻找工程文件
171 def find_uvprojx_file():
172 uvprojx_files = glob.glob("*.uvprojx")
173 if not uvprojx_files:
174 print("未找到工程文件,请把此文件放在keil工程目录下")
175 return None
176 elif len(uvprojx_files) > 1:
177 print("在当前目录中找到多个.uvprojx文件:")
178 for i, file in enumerate(uvprojx_files, start=1):
179 print(f"{i}. {file}")
180 print("请确保目录中只有一个.uvprojx文件")
181 return None
182 else:
183 return uvprojx_files[0]
184
185 if __name__ == "__main__":
186 print("keil一键添加文件和头文件路径脚本\n\
187 需放在keil同级目录下\n\
188 参数格式,参数用空格隔开:不可重复添加\n\
189 默认模式:0\n\
190 路径:\"../../../external/lvgl\"\n\
191 分组:\"lvgl\"\n\
192 1.添加模式 0:全部添加(.c文件全添加到分组.h文件夹加入include路径里) 1:只添加.c文件到分组 2:只添加.h文件夹到include里\n\
193 2.要添加的文件夹路径,请使用相对路径\n\
194 3.要添加的分组名称,如果没有分组需要先去keil手动添加分组\n")
195
196 param = input("请输入参数:")
197
198 if param:
199 #print(param)
200 args = param.split()
201 args[0] = int(args[0])
202 print(args)
203 else:
204 args = [0,"../../../external/lvgl","lvgl"]
205 print("使用默认参数:",args)
206 uvprojx_file_path = find_uvprojx_file()
207 if uvprojx_file_path:
208 add_files_to_group(uvprojx_file_path, args[0],args[1],args[2])

Keil一键添加.c文件和头文件路径脚本--可遍历添加整个文件夹的更多相关文章

  1. VC++ 6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...

  2. 如何在Qt Creator中添加库文件和头文件目录

    在使用QtCreator开发图像处理程序的时候想加入Opencv库来处理图形,添加头文件,需要编辑工程文件夹下的.pro文件在文件中添加以下内容,即可包含头文件的文件夹: INCLUDEPATH += ...

  3. Qt添加库文件和头文件目录(QCreator)

    在使用QtCreator开发图像处理程序的时候想加入Opencv库来处理图形,添加头文件,需要编辑工程文件夹下的.pro文件在文件中添加以下内容,即可包含头文件的文件夹: INCLUDEPATH += ...

  4. VC6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“ ...

  5. VC 6.0中添加库文件和头文件 【转】

    本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools&g ...

  6. 永远也记不住的linux环境变量,库文件,头文件,交叉编译...

    一.环境变量1.node-v4.9.1-linux-armv7l1)安装cp node-v4.9.1-linux-armv7l.tar.gz /usr/local/cd /usr/local/tar ...

  7. eclipse插件SCON的SConscript文件和头文件以及C文件包含路径

    1. 本次的头文件路径\Hi2110-B657SP3-SDK\src_release_657SP3\src\lib\onenet\public,以此例子作为研究,本次开发使用eclipse,用到SCO ...

  8. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    今天,在vs2013中新建了一个placard.json文件,当我用jq读取它的时候,去提示404,直接在浏览器访问这个文件,提示: HTTP 错误 404.3 – Not Found 由于扩展配置问 ...

  9. 解决问题:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    WindowServer2012服务器,添加角色安装完.netframework和iis之后,运行aspx页面就报如下错误: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法 ...

  10. 自定义C/C++头文件以及头文件重复定义解决

    今天再看二叉树的知识,看着看着就看到C/C++的头文件及头文件重复定义这一块去了.以前就看到过这个问题,但是自己一直没有用到这方面的东西,今天遇到就顺便总结一下,等以后忘了再回来看看. 首先明确一点C ...

随机推荐

  1. axiso封装

    import axios from 'axios';import {Message } from 'element-ui'//element-ui提示框组件import config from './ ...

  2. 力扣596(MySQL)-超过5名学生的课(简单)

    题目: 表: Courses 编写一个SQL查询来报告 至少有5个学生 的所有班级. 以 任意顺序 返回结果表. 查询结果格式如下所示 示例1:  解题思路: 使用group by按 班级 进行分组后 ...

  3. Serverless JOB | 传统任务新变革

    简介: SAE Job 重点解决了用户的效率和成本问题,在兼具传统任务使用体验和功能的同时按需使用,按量计费,做到低门槛任务上云,节省闲置资源成本. Job 作为一种运完即停的负载类型,在企业级开发中 ...

  4. 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践

    简介: Threat Hunting 平台的架构与设计,及以降低 IO 为目标的优化与探索.为什么以及如何使用块索引. 本文整理自 360 政企安全集团的大数据工程师苏军以及刘佳在 Flink For ...

  5. 阿里云OSS文件上传几种方法(主要是前端)

    目录 零.准备 一.服务端签名后直传 1. 阿里云控制台配置 2. 后端接口开发(PHP) 3. 前端获取签名后上传 二.使用STS临时凭证进行上传 1. 后端接口开发(node) 2. 前端获取临时 ...

  6. 错误记录——mysql5.7连接失败,服务无法启动

    起因: 上周安装完mysql后,成功新建了数据库,一切都是正常的,于是就先搁置一旁.今天周一过来,却突然发现无法连接mysql了. 过程: 第一反应是服务没有启动,毕竟重启了电脑,说不定是服务没有自动 ...

  7. Swift中Tuple的比较

    Swift中Tuple的比较遵循如下规则: 1 被比较的Tuple中包含的元素个数必须一样,并且对应元素的类型也必须一样: 2 比较的结果由整个Tuple的比较结果来决定.比如,如果是相等比较,那么必 ...

  8. Swift中的Tuple类型

    Swift中的Tuple类型可以包含任何值,并且这些值的类型可以互相不一样.Tuple本身比较简单,需要记得也就是访问Tuple的方式. 使用变量名访问 let http404Error = (404 ...

  9. ssh端口转发实际应用

    目录 1 ssh本地端口转发 2 ssh远程端口转发 3 跨网络访问(网关功能) 4 动态端口转发(KX上网) SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.而且,SSH 还能够 ...

  10. 【工程实践】go语言实现MerkleTree

    简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其哈希值: 非叶子节点(包括中间节点和根节点)的内容为它的两个孩子节点内容的哈希值. 所以底层 ...