154 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import sys
 | |
| import os
 | |
| import datetime
 | |
| from datetime import datetime, timedelta
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| # 定义软件版本号
 | |
| SOFT_VERION = "0.10"
 | |
| 
 | |
| 
 | |
| 
 | |
| # 定义mod文件的名称和路径
 | |
| MOD_FILE="mod_signals.c"
 | |
| MOD_PATH="./source/task/"
 | |
| INFO_FILE="./source/main/compiler_info.h"
 | |
| 
 | |
| 
 | |
| # 找到文件夹中指定后缀的文件
 | |
| def find_file(path:str,fix:str):
 | |
|     file_list=[]
 | |
|     for file_name in os.listdir(path):
 | |
|         if file_name.endswith(fix):
 | |
|             file_list.append(os.path.join(path, file_name))
 | |
|     return file_list
 | |
| 
 | |
| # 找到 signal 关键字 定义的行
 | |
| def find_signal_def(file):
 | |
|     list_signal=[]
 | |
|     with open(file,encoding="utf-8") as f:
 | |
|         list_str=f.readlines()
 | |
|         for i in list_str:
 | |
|             if(i[0:6]=="signal"):
 | |
|                 list_signal.append(i)
 | |
|     return list_signal
 | |
| 
 | |
| # 截取参数列表中的变量名
 | |
| def split_par_name(par_str:str):
 | |
|     ret_str=""
 | |
|     if(par_str.count('*')>0):
 | |
|         ret_str=par_str.split("*")[1].strip()
 | |
|     else:
 | |
|         ret_str=par_str.split(" ")[1]
 | |
|     return ret_str
 | |
| 
 | |
| # 生成一个信号函数的实现
 | |
| def def_signal_fun(line:str):
 | |
|     # 删除多余空格
 | |
|     line=' '.join(line.split())
 | |
|     # print(line)
 | |
|     list_str=line.split('(')
 | |
|     fun_name=list_str[0].split(' ')[1]
 | |
|     param_str=list_str[1].split(')')[0]
 | |
|     params=[]
 | |
|     # 有","则至少有两个参数否则可能有一个参数,可能没有
 | |
|     if(param_str.count(',')>0):
 | |
|         params=param_str.split(',')
 | |
|         for i in range(len(params)):
 | |
|             params[i]=params[i].strip()
 | |
|     else:
 | |
|         t_str=param_str.strip()
 | |
|         if(len(t_str)>0)and(t_str!="void"):
 | |
|             params.append(t_str)
 | |
|     # print(fun_name,params)
 | |
|     params_num=len(params)
 | |
|     fun_str=""
 | |
|     fun_str+="void "+fun_name+"("
 | |
|     for i in range(params_num):
 | |
|         fun_str+=params[i]
 | |
|         if(i<len(params)-1):
 | |
|             fun_str+=","
 | |
|     fun_str+=")\n{\n"
 | |
|     if(params_num-1>0):
 | |
|         fun_str+="  uint32_t param[{d}];\n".format(d=params_num-1)
 | |
|     for i in range(params_num-1):
 | |
|         fun_str+="  param[{d1}]=(uint32_t){d2};\n".format(d1=i,d2=split_par_name(params[i+1]))
 | |
|     if(params_num-1>0):
 | |
|         fun_str+="  _signal_emit({d1},{d2},param,{d3});\n".format(d1=split_par_name(params[0]),d2=fun_name,d3=params_num-1)
 | |
|     else:
 | |
|         fun_str+="  _signal_emit({d1},{d2},0,{d3});\n".format(d1=split_par_name(params[0]),d2=fun_name,d3=params_num-1)
 | |
|     fun_str+="}\n"
 | |
|     fun_str+="signal_export({d});\r\n\r\n\r\n\r\n".format(d=fun_name)
 | |
|     # print(fun_str)
 | |
|     return fun_str
 | |
| 
 | |
| # 遍历路径中的 .h 文件 返回找到的文件和信号声明
 | |
| def ergodic_signal_fun(path):
 | |
|     fun_str=""
 | |
|     list_file=find_file(path,".h")
 | |
|     for i in list_file:
 | |
|         list_signal=find_signal_def(i)
 | |
|         for j in list_signal:
 | |
|             fun_str+=def_signal_fun(j)
 | |
|     return list_file,fun_str
 | |
| 
 | |
| # 创建 mod 文件
 | |
| def mod_file_creat(file_path):
 | |
|     with open(file_path,"w+") as f:
 | |
|         list_file,fun_str=ergodic_signal_fun(MOD_PATH)
 | |
|         f.write("#include \"stdlib.h\"\n")
 | |
|         f.write("#include \"signal.h\"\n")
 | |
|         for i in list_file:
 | |
|             f.write("#include \""+i.split("/")[-1]+"\"\n")
 | |
|         f.write("\n\n\n\n\n\n")
 | |
|         f.write(fun_str)
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| # 获取北京时间
 | |
| def get_date():
 | |
|     now_time = datetime.utcnow()
 | |
|     utc_time = now_time + timedelta(hours=8)  # UTC只是比北京时间提前了8个小时
 | |
|     utc_time = utc_time.strftime("%Y%m%d")
 | |
|     return utc_time
 | |
| 
 | |
| # 获取北京时间
 | |
| def get_time():
 | |
|     now_time = datetime.utcnow()
 | |
|     utc_time = now_time + timedelta(hours=8)  # UTC只是比北京时间提前了8个小时
 | |
|     utc_time = utc_time.strftime("%Y-%m-%d %H:%M:%S")
 | |
|     return utc_time
 | |
| 
 | |
| 
 | |
| # 生成编译信息头文件
 | |
| def creat_compile_info(dst:str):
 | |
|     utc_time=get_time()
 | |
|     if os.path.exists(dst):
 | |
|         os.remove(dst)
 | |
|     with open(dst,"w") as f:
 | |
|         f.write("#ifndef compiler_info__\n")
 | |
|         f.write("#define compiler_info__\n\n\n\n\n\n\n")
 | |
|         f.write("#define BUILD_DATE  \""+utc_time+"\"\n")
 | |
|         f.write("#define SOFT_VERSION  \""+SOFT_VERION+"\"\n")
 | |
|         f.write("\n\n\n\n\n\n\n#endif\n")
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     creat_compile_info(INFO_FILE)
 | |
|     mod_file_creat(MOD_PATH+MOD_FILE)
 | |
|     print("prepare success.\n")
 | |
| 
 | |
| 
 | |
| 
 | |
| if __name__=="__main__":
 | |
|     main()
 | |
| 
 | |
| 
 | |
| 
 | 
