最近想移植个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. Exception in thread "main" java.util.NoSuchElementException

    Exception in thread "main" java.util.NoSuchElementException 用了两个scanner的时候,执行程序发生报错:Except ...

  2. 力扣784(java)-字母大小写全排列(中等)

    题目: 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串. 返回 所有可能得到的字符串集合 .以 任意顺序 返回输出. 示例 1: 输入:s = " ...

  3. eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术

    ​简介:如何使用 socket eBPF进一步提升Service 网络的转发性能? ​ 背景介绍 Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成.其中 ...

  4. Android项目架构设计深入浅出

    ​简介:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构. ​ 作者 | 璞珂 来源 | 阿里技术公众号 前言:本文结合个人在架构设计上的思考和理解,介绍如何从 ...

  5. 一键入门到精通:sd-webui-prompt-all-in-one 项目大揭秘!

    今天向大家推荐一个宝藏项目.在创意无限的AI艺术生成世界中,sd-webui-prompt-all-in-one 项目如一股清流,为广大创作者和开发者带来了前所未有的便捷和灵感.这不仅仅是一个项目,它 ...

  6. Java简单实现MQ架构和思路02

    Java MQ的100个功能清单 有重复的 一个消息队列(MQ)可以有以下功能: 批量发送消息:允许将多个消息打包成一个批次发送,可以减少网络传输开销和提高系统吞吐量. 消息过期时间:消息可以设置一个 ...

  7. 2022年官网下安装Tomcat最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 ...

  8. 4G EPS 中的小区搜索

    目录 文章目录 目录 前文列表 小区搜索(Cell Search)流程 PSS(主同步信号)与 SSS(辅同步信号) DL-RS(下行参考信号) PBCH(物理广播信道) PDSCH(物理下行共享信道 ...

  9. k8s快捷命令

    查看node使用率: for i in `kubectl get nodes|awk '{print $1}'|sed '1d'`;do  echo "=========>" ...

  10. 一文教你基于LangChain和ChatGLM3搭建本地知识库问答

    本文分享自华为云社区<[云驻共创]LangChain+ChatGLM3实现本地知识库,转华为云ModelArts,实现大模型AI应用开发> ,作者:叶一一. 一.前言 本期华为云的讲师是华 ...