| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  | import json | 
					
						
							|  |  |  |  | import os | 
					
						
							|  |  |  |  | import sys | 
					
						
							|  |  |  |  | import time | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | '''
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 这个文件用于编译时输出编译符号,在makefile.cfg中调用 | 
					
						
							|  |  |  |  | 自动更新vscode的c/c++配置 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 2024.9.28 | 
					
						
							|  |  |  |  |     根据脚本位置来确定位置文件路径 | 
					
						
							|  |  |  |  |     使用非冗余的路径 | 
					
						
							|  |  |  |  |     使用宏定义字符转义 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | '''
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | def unescape(line:str): | 
					
						
							|  |  |  |  |   table=[("\\\"","\""),("\\<","<"),("\\>",">"),("\\$","$"),("\\(","("),("\\)",")")] | 
					
						
							|  |  |  |  |   for item in table: | 
					
						
							|  |  |  |  |     line=line.replace(item[0],item[1]) | 
					
						
							|  |  |  |  |   # 删除多余的 $ 符号 | 
					
						
							|  |  |  |  |   line=line.replace('$','') | 
					
						
							|  |  |  |  |   return line | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  | def main(flag_file:str,target:str): | 
					
						
							|  |  |  |  |     make_flags=flag_file | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  |     top_path=os.path.split(sys.argv[0])[0] | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  |     current_path=os.path.abspath('.') | 
					
						
							|  |  |  |  |     if(make_flags!='clear'): | 
					
						
							|  |  |  |  |         with open(make_flags,encoding='utf-8') as f: | 
					
						
							|  |  |  |  |             flags=f.read() | 
					
						
							|  |  |  |  |         print(time.strftime("%Y-%m-%d %H:%M:%S"),"append vscode setting.") | 
					
						
							|  |  |  |  |         print('\ttarget: ',target) | 
					
						
							|  |  |  |  |     else: | 
					
						
							|  |  |  |  |         flags="" | 
					
						
							|  |  |  |  |         print(time.strftime("%Y-%m-%d %H:%M:%S"),"clear vscode setting.") | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  |     cfgs_file_path=f'{top_path}/.vscode/c_cpp_properties.json' | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  |     with open(cfgs_file_path,encoding='utf-8') as f: | 
					
						
							|  |  |  |  |         cfgs=f.read() | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     flags_list=flags.split() | 
					
						
							|  |  |  |  |     flags_list=list(set(flags_list)) | 
					
						
							|  |  |  |  |     inc_list=[] | 
					
						
							|  |  |  |  |     def_list=[] | 
					
						
							|  |  |  |  |     for item in flags_list: | 
					
						
							|  |  |  |  |         if(item[:2]=='-D'): | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  |             def_list.append(unescape(item[2:])) | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  |         elif(item[:2]=='-I'): | 
					
						
							|  |  |  |  |             p=item[2:] | 
					
						
							|  |  |  |  |             if(p[0]!='/'): | 
					
						
							|  |  |  |  |                 p=os.path.join(current_path,p) | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  |                 p=os.path.normpath(p) | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  |             if(os.path.exists(p)): | 
					
						
							|  |  |  |  |                 inc_list.append(p) | 
					
						
							|  |  |  |  |             else: | 
					
						
							|  |  |  |  |                 print("\tinvalid inc path: ",p) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     cfg=json.loads(cfgs) | 
					
						
							|  |  |  |  |     predef_info=cfg["configurations"][0] | 
					
						
							|  |  |  |  |     if(make_flags!='clear'): | 
					
						
							|  |  |  |  |         predef_info["name"]="myname" | 
					
						
							|  |  |  |  |         for item in inc_list: | 
					
						
							| 
									
										
										
										
											2024-09-28 19:35:52 +08:00
										 |  |  |  |             # 只有路径列表中不存在时才添加 | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |  |             if(item not in predef_info["includePath"]): | 
					
						
							|  |  |  |  |                 predef_info["includePath"].append(item) | 
					
						
							|  |  |  |  |         for item in def_list: | 
					
						
							|  |  |  |  |             if(item not in predef_info["defines"]): | 
					
						
							|  |  |  |  |                 predef_info["defines"].append(item) | 
					
						
							|  |  |  |  |     else: | 
					
						
							|  |  |  |  |         predef_info["includePath"]=[] | 
					
						
							|  |  |  |  |         predef_info["defines"]=[] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     with open(cfgs_file_path,mode='w+', encoding='utf-8') as f: | 
					
						
							|  |  |  |  |         f.write(json.dumps(cfg,sort_keys=True, indent=2, separators=(',', ': '))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | if __name__=="__main__": | 
					
						
							|  |  |  |  |     if(len(sys.argv)>=2): | 
					
						
							|  |  |  |  |         if(len(sys.argv)>=3): | 
					
						
							|  |  |  |  |             target=sys.argv[2] | 
					
						
							|  |  |  |  |         else: | 
					
						
							|  |  |  |  |             target="null" | 
					
						
							|  |  |  |  |         main(sys.argv[1],target) | 
					
						
							|  |  |  |  |     else: | 
					
						
							|  |  |  |  |         print("kill me.") | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 |