147 lines
4.1 KiB
Python
147 lines
4.1 KiB
Python
import sys
|
|
import os
|
|
import datetime
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
# 定义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 \"0.01\"\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()
|
|
|
|
|
|
|