LPT26x-HSF-4MB-Hilink_14.2..../build/script/hdbxml/mk_hso_prim_xml.py
2025-05-13 22:00:58 +08:00

659 lines
23 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# coding=utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2021-2022. All rights reserved.
import os
import re
import sys
import platform
import string
import shutil
import time
import json
import xml.etree.ElementTree as ET
py_version = platform.python_version()
def timestamp():
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
##########################################################################
#
# 日志内容提取函数
#
##########################################################################
# 日志状态机处理流程:
# LOG_ENTRY_FINDING -- 查找日志接口
# LOG_ENTRY_FOUNDED -- 日志接口匹配,查找日志内容
# LOG_CONT_ENTRY_FINDING -- 日志内容入口匹配,以“号开关,以”号结束
# LOG_CONT_END_FOUNING -- 日志内容查找
# LOG_EXIT_FINDING -- 日志线束符匹配
# 全局变量
aich_name = ""
log_info_list = [] # 日志信息列表,【文件号, 行号, 日志内容】
g_undefine_id = [] # 保存未定义的FileId
g_fsm_status = "LOG_ENTRY_FINDING"
g_log_key_find = 0 # 状态位判断是否查找到日志关键字0否1是
g_log_str = ""
g_log_str_full = ""
g_log_entry = [
r"LOG_PRINT[0-4](\s*)\(",
r"log_print[0-4](\s*)\(",
r"acore_log[0-4](\s*)\(",
r"[printlog]{3,5}_alter(\s*)\(",
r"[PRINTLOG]{3,5}_ALTER(\s*)\(",
r"_LOG[0-4]{1,2}(\s*)\(",
r"(DBG|INFO|ERR|WARN)_LOG(\s*)\(",
# BTH
r"(dbg|info|err|warn)_log(\s*)\(",
r"(dbg|info|err|warn)_log[0-4](\s*)\(",
# diag common
r"diag_(error|warning|info|debug)_log(\d*)(\s*)\(",
r"PRINT_(DEBUG|INFO|ERR|WARN)(\s*)\(",
r"print_(debug|info|err|warn)(\s*)\(",
r"_log_(err|warn|info|debug)(\s*)\(",
# GPU
r"(vau|dpu|jpeg|gmmu|vg)_(err|info|dbg|print)(\s*)\(",
# WIFI
r"oam_(error|warning|info)_log[0-4](\s*)\(",
r"alg_ar_dbg_log[0-4](\s*)\(",
r"common_log_dbg[0-4](\s*)\(",
# GPU
r"GRAPHIC_LOG(F|E|W|I|D|P)(\s*)\(",
r"DISP_LOG(E|W|I|D)(\s*)\(",
r"LV_LOG(E|W|I)(\s*)\(",
# Meida
r"ALOG(V|D|I|W|E)(\s*)\(",
r"MEDIA_(DEBUG|ERR|WARNING|INFO|FATAL)_LOG(\s*)\(",
r"HMF_LOG(F|E|W|I)(\s*)\(",
r"MEDIA_HAL_LOG(V|D|I|W|E)(\s*)\(",
r"CHECK_NULL_(RETURN|RETURN_NONE)(\s*)\(",
r"CHECK_FAILED_(RETURN|RETURN_NONE|PRINT|RETURN_WITH_UNLOCK)(\s*)\(",
r"CHK_NULL_(RETURN|RETURN_NONE|RETURN_WITH_UNLOCK)(\s*)\(",
r"CHK_FAILED_(RETURN|NO_RETURN)(\s*)\(",
r"(CHK_COND_RETURN|CHK_FALSE_RETURN|CHECK_STATE_SAME_RETURN)(\s*)\(",
# OHOS
r"HILOG_(DEBUG|ERROR|FATAL|INFO|WARN)(\s*)\(",
r"SAMGR_LOG_(ERROR|FATAL|INFO|WARN)(\s*)\(",
# app
r"WEARABLE_LOG(D|I|W|E)(\s*)\(",
# plat
r"hcc_printf_err_log(\s*)\(",
# audio
r"audio_log[0-4](\s*)\(",
] # 日志关键字规则
# DSP日志关键字规则不要改变顺序慎重修改
g_audio_log_entry = [
r"sap_(alert|fatal|err|warn|dbg|trace)_log_(s32|bool)(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_u32(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_h32(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_float(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_void(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_ret(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_fun(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_null_pointer(\s*)\(",
r"audio_func_enter(\s*)\(",
r"audio_func_exit(\s*)\(",
r"sap_(alert|fatal|err|warn|dbg|trace)_log_info(\s*)\(",
r"audio_log_(alert|fatal|err|warn|dbg|trace)(\s*)\(",
] # DSP日志关键字规则不要改变顺序慎重修改
g_audio_log_key_index = -1
g_audio_log_addition_info = [" = %d",
" = %u",
" = 0x%08X",
" = %f",
" = %p",
"Error Code: [0x%08X]",
" Failed, Error Code: [0x%08X]",
" = %p, Null Pointer!\\n",
"enter...",
"exit..."]
g_log_full_cont = '\"(.*)\"\s*[,|)]'
# 用于记录日志行数,日志多行时可能是第一行,有可能是最后一行;
# 0 表示第一行 1表示最后一行
g_log_entry_or_end_flag = -1
XML_PATH="build/config/target_config/<chip>/hdb_config/database_cfg/mk_hdb_xml.json"
def get_log_level(str):
m = re.search(r'LOG_LEVEL_ERROR|ERR_LOG|err_log|(GRAPHIC|DISP|LV)_LOGF|(GRAPHIC|DISP|LV)_LOGE|WEARABLE_LOGE|_ERR|print_err|ERROR|FATAL', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'(CHK|CHECK)_NULL_RETURN|(CHK|CHECK)_NULL_RETURN_NONE|(CHK|CHECK)_FAILED_RETURN|CHECK_FAILED_RETURN_NONE', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'CHECK_FAILED_PRINT|CHECK_FAILED_RETURN_WITH_UNLOCK|CHK_NULL_RETURN_WITH_UNLOCK|CHK_FAILED_NO_RETURN', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'CHK_COND_RETURN|CHK_FALSE_RETURN', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'LOG_LEVEL_WARNING|WARN_LOG|warn_log|warning_log|(GRAPHIC|DISP|LV)_LOGW|WEARABLE_LOGW|_WARN|print_warn', str)
if m is not None:
return 3,'WARNING'
m = re.search(r'alg_ar_dbg|common_log_dbg', str)
if m is not None:
return 3,'WARNING'
m = re.search(r'LOG_LEVEL_INFO|INFO_LOG|info_log|(GRAPHIC|DISP|LV)_LOGI|GRAPHIC_LOGP|WEARABLE_LOGI|_INFO|print_info', str)
if m is not None:
return 5,'INFO'
m = re.search(r'CHECK_STATE_SAME_RETURN', str)
if m is not None:
return 5,'INFO'
m = re.search(r'LOG_LEVEL_DBG|(DBG|DEBUG)_LOG|(dbg|debug)_log|(GRAPHIC|DISP|LV)_LOGD|WEARABLE_LOGD|_DEBUG|print_debug', str)
if m is not None:
return 6,'DBG'
m = re.search(r'_error_log|_log_err|_ERROR_|(vau|dpu|jpeg|gmmu|vg)_err|ALOGE|MEDIA_(ERR|FATAL)_LOG|HMF_LOG(F|E)|MEDIA_HAL_LOGE', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'_warning_log|_log_warn|_WARNING_|ALOGW|HMF_LOGW|MEDIA_HAL_LOGW', str)
if m is not None:
return 3,'WARNING'
m = re.search(r'_info_log|_log_info|_INFO_|(vau|dpu|jpeg|gmmu|vg)_info|ALOGI|MEDIA_INFO_LOG|HMF_LOGI|MEDIA_HAL_LOGI', str)
if m is not None:
return 5,'INFO'
m = re.search(r'_debug_log|_log_debug|(vau|dpu|jpeg|gmmu|vg)_(dbg|print)|ALOG(V|D)|MEDIA_DEBUG_LOG|MEDIA_HAL_LOG(V|D)', str)
if m is not None:
return 6,'DBG'
print("no match for :%s" % str)
return 7, 'no match'
# DSP日志级别识别慎重修改
def get_audio_log_level(str):
m = re.search(r'_alert|_err|_fatal', str)
if m is not None:
return 2,'ERROR'
m = re.search(r'_warn', str)
if m is not None:
return 3,'WARNING'
m = re.search(r'_trace', str)
if m is not None:
return 5,'INFO'
m = re.search(r'_dbg', str)
if m is not None:
return 6,'DBG'
m = re.search(r'_enter|_exit', str)
if m is not None:
return 5,'INFO'
print("audio log no match for :%s" % str)
return 7, 'no match'
def add_content_to_xml(data, msg_root_element):
prim_pri = data["LEVEL_STR"]
prim_sz = data["FMT"]
prim_line = data["LINE_NUM"]
prim_file = data["FILE_NAME"]
prim_file_id = data["FILE_ID"]
args_count = data["ARGS_COUNT"]
mod_id = data["MOD_ID"]
level = data["LEVEL_NUM"]
new_element = ET.Element('')
new_element.tag = 'MSG'
new_element.attrib['STRUCTURE'] = "%s%d" % ("diag_log_msg", args_count)
new_element.attrib['NAME'] = "%s @%s(%d),%s" % (prim_sz, prim_file, prim_line, prim_pri)
#sdt log_id to hso msg_id
#log_flg mod_id file_id line_num level
#1bit 4bit 10bit 14bit 3bit
msg_id = (1 << 31) | (mod_id << 27) | (prim_file_id << 17) | (prim_line << 3) | level
new_element.attrib['ID'] = hex(msg_id)
new_element.tail = '\n\t\t\t'
msg_root_element.append(new_element)
# 根据日志状态机流程逐行解析日志内容
def parse_log_from_line(line):
global g_fsm_status
global g_log_str
global g_log_str_full
global g_log_str_full_flag
global g_log_entry
global g_log_full_cont
global g_log_entry_or_end_flag
global g_log_key_find
global g_audio_log_key_index
findkey = 0
# 匹配日志接口
if "LOG_ENTRY_FINDING" == g_fsm_status:
g_log_entry_or_end_flag = -1
g_audio_log_key_index = -1
g_log_str = ""
g_log_str_full = ""
for x in g_log_entry:
m = re.search(x, line.strip())
if m is not None:
findkey = 1
break
if 1 == findkey:
g_fsm_status = "LOG_ENTRY_FOUNDED"
g_log_str_full += line
g_log_entry_or_end_flag = 0
g_log_key_find = 1
parse_log_from_line(line)
# SAP log
find_audio_key = 0
index = 0
for x in g_audio_log_entry:
m = re.search(x, line.strip())
if m is not None:
find_audio_key = 1
break
index = index + 1
if 1 == find_audio_key:
g_fsm_status = "LOG_ENTRY_FOUNDED"
g_log_str_full += line
g_log_entry_or_end_flag = 0
g_audio_log_key_index = index
g_log_key_find = 1
parse_log_from_line(line)
else:
return
# 日志接口匹配,确认是否完整日志;确认日志是否正常结束
elif "LOG_ENTRY_FOUNDED" == g_fsm_status:
if g_audio_log_key_index >= 0 and g_audio_log_key_index <= 4: # such as "sap_alert_log_u32"
m1 = re.search("\(\s*(\S+)\s*\)", line)
if m1 is not None:
g_log_str = m1.groups()[0] + g_audio_log_addition_info[g_audio_log_key_index] + '\0';
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
elif g_audio_log_key_index == 5: # such as "sap_fatal_log_err_code"
m1 = re.search("\(\s*(\w+)\s*\)", line)
if m1 is not None:
g_log_str = g_audio_log_addition_info[g_audio_log_key_index] + '\0';
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
elif g_audio_log_key_index == 6: # such as "sap_err_log_fun_err"
m1 = re.search("\(\s*(\w+)\s*,", line)
if m1 is not None:
g_log_str = "Call " + m1.groups()[0] + g_audio_log_addition_info[g_audio_log_key_index] + '\0';
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
elif g_audio_log_key_index == 7: # such as "sap_err_log_null_pointer"
m1 = re.search("\(\s*(\S+)\s*\)", line)
if m1 is not None:
g_log_str = m1.groups()[0] + g_audio_log_addition_info[g_audio_log_key_index] + '\0';
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
elif g_audio_log_key_index == 8 or g_audio_log_key_index == 9: # such as "audio_func_enter"
m1 = re.search("\(\)", line)
if m1 is not None:
g_log_str = g_audio_log_addition_info[g_audio_log_key_index] + '\0';
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
else:
m1 = re.search(g_log_full_cont, line) # 完整日志格式
m2 = re.search("\"(.+)", line) # 部分日志格式 ,引号开头
if m1 is not None:
g_log_str = m1.groups()[0] + '\0'
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
elif m2 is not None:
g_fsm_status = "LOG_CONT_END_FINDING"
g_log_str = m2.groups()[0] # 引号后面的内容为日志内容
m1 = re.search(r'(.+)"\s*[,|)]', line)
if m1 is not None:
g_fsm_status = "LOG_EXIT_FINDING"
if "LOG_ENTRY_FOUNDED" == g_fsm_status:
m3 = re.search(r"\)[\s]*\;", line.strip())
if m3 is not None:
g_fsm_status = "LOG_ENTRY_FINDING"
g_log_entry_or_end_flag = -1
g_audio_log_key_index = -1
if g_log_str_full.find(line) == -1:
g_log_str_full += line
# 匹配部分日志接口
elif "LOG_CONT_END_FINDING" == g_fsm_status:
m = re.search(r"[\s]+(.+)\"", line)
if m is not None:
temp = m.groups()[0]
m1 = re.search(r'(.+)"\s*[,|)]', line) #部分日志可以跨多行
if m1 is None:
g_log_str += temp
else:
g_log_str += (temp + '\0')
g_fsm_status = "LOG_EXIT_FINDING"
parse_log_from_line(line)
else:
g_log_str += line.strip() # 纯日志内容 ,继续找日志
if g_log_str_full.find(line) == -1:
g_log_str_full += line
# 匹配日志结束符
elif "LOG_EXIT_FINDING" == g_fsm_status:
m = re.search(r"\)[\s]*\;", line.strip())
if m is not None:
g_fsm_status = "LOG_ENTRY_FINDING" # 继续逐行扫描下一条日志入口
g_log_entry_or_end_flag = 1
if g_log_str_full.find(line) == -1:
g_log_str_full += line
g_file_id_dict = {} # file_id_str file_id_num
g_last_file_id_num = 0
g_moudle_id = {
'wifi' : 0,
'bt' : 1,
'gnss' :2,
'dsp' : 3,
'pf' : 4,
'media' : 5,
'nfc': 6,
'app' : 7,
'gpu': 8,
'gui' : 9,
'slp' : 10,
'bth' : 11,
'ohos' : 12,
}
def parse_single_source_file(cfilepath, auto_def, module_name):
global g_log_key_find
global g_log_str
global g_fsm_status
global log_info_list
global g_audio_log_key_index
curr_line_num = 0 # 当前行行号
file_id_num = 0 # 本文件号
line_num_save = 0
log_info_list = []
m = re.search(r"\w.[cC|hH]", cfilepath)
if m is None:
print("Error!%s is not C or H File" % cfilepath)
return
# 增加对文件中换行符的处理
destfile = cfilepath + "_temp"
modify_newline_on_linux(cfilepath, destfile)
# 打开源文件,读取文件内容
try:
if py_version.startswith("3"):
try:
with open(destfile, 'r', encoding="UTF-8") as fd_src:
datalines = [line for line in fd_src]
except Exception:
with open(destfile, 'r', encoding="ISO-8859-1") as fd_src:
datalines = [line for line in fd_src]
else:
with open(destfile, 'r') as fd_src:
datalines = [line for line in fd_src]
except Exception:
print("open file %s failed." % cfilepath)
return
os.remove(destfile)
if module_name not in g_file_id_dict:
return
_, filename = os.path.split(cfilepath)
if auto_def:
file_id_str = filename.replace('.' , '_').upper()
if file_id_str not in g_file_id_dict[module_name]:
return
g_fsm_status = "LOG_ENTRY_FINDING"
else:
m = re.search(r"#define[\s]+THIS_FILE_ID[\s]+([\w]*)", '\n'.join(datalines))
if m is None:
return 0
file_id_str = m.group(1)
g_fsm_status = "LOG_ENTRY_FINDING"
# 遍历行内容
for line in datalines:
# 行号加1
curr_line_num += 1
m = re.search(r'^\/\/', line.strip())
if m is not None:
continue
# 判断是否可识别的普通日志文件
parse_log_from_line(line)
if 1 == g_log_key_find:
try:
file_id_num = g_file_id_dict[module_name][file_id_str]
moudle_id_num = g_moudle_id[module_name]
except KeyError:
#print(
# "warning: Moudle:%s, %s not defined. fileName[%s]." %
# (moudle_name, file_id_str, filename))
g_undefine_id.append((file_id_str, filename))
break
g_log_key_find = 0
line_num_save = curr_line_num
# 解析日志,判断是否找到,如果找到写入文件
if 1 == g_log_entry_or_end_flag:
g_log_str = g_log_str.replace('\\r', "") # 清除\r\n空格
g_log_str = g_log_str.replace('\\n', "")
g_log_str = g_log_str.replace('\r', "") # 清除\r\n空格
g_log_str = g_log_str.replace('\n', "")
g_log_str = g_log_str.replace("\\", "")
g_log_str = g_log_str.replace('""', "")
g_log_str = g_log_str.replace("\000", "")
g_log_str.strip()
if (g_audio_log_key_index != -1):
level_num, level_str = get_audio_log_level(g_log_str_full)
else:
level_num, level_str = get_log_level(g_log_str_full)
data = { }
data["MOD_ID"] = moudle_id_num
data["FILE_ID"] = file_id_num
if (aich_name == "cortex_m7"):
data["LINE_NUM"] = line_num_save
else:
data["LINE_NUM"] = curr_line_num
data["FMT"] = g_log_str
data["LEVEL_NUM"] = level_num
data["LEVEL_STR"] = level_str
data["ARGS_COUNT"] = g_log_str.count("%")
data["FILE_NAME"] = cfilepath.split('/')[-1]
log_info_list.append(data)
g_log_key_find = 0
g_audio_log_key_index = -1
return 0
# 保存FILD_ID
def save_file_id_dict(line_str, moudle_name):
global g_file_id_dict
global g_last_file_id_num
file_id_str = ''
file_id_num = 0
if line_str == '':
return 0
m2 = re.search("[^A-Za-z0-9_=]", line_str)
if m2 is None:
m1 = line_str.split('=') # XXXXXXX = dddd,
if len(m1) == 2:
file_id_str = m1[0] # 获取file id字符串
file_id_num = m1[1]
g_file_id_dict[moudle_name][file_id_str] = int(file_id_num)
g_last_file_id_num = int(file_id_num) + 1
else:
file_id_str = line_str
g_file_id_dict[moudle_name][file_id_str] = g_last_file_id_num
g_last_file_id_num += 1
else:
return -1
return 0
# 打印fileid的映射字典
def print_file_id_dict():
print(timestamp() + " start to print FileIdDict::")
for system_name in g_file_id_dict:
for key in g_file_id_dict[system_name]:
print(timestamp() + " key:%s value:%d" % (key,\
g_file_id_dict[system_name][key]))
# 获取FILE_ID枚举值
def get_file_id_enum_in_file(h_file_path):
global g_file_id_dict
global g_last_file_id_num
g_last_file_id_num = 0
moudle_name = os.path.basename(h_file_path).split('_')[-1][:-2]
# btc将file_id头文件迁移后取名为log_def_btc.h 实际moudle_name任是bt
# bth将file_id头文件迁移后取名为log_def_bth.h 实际moudle_name任是bt
if moudle_name == 'btc':
moudle_name = 'bt'
if chip == 'bs25' and core_name == 'bt_core' and moudle_name == "bth":
moudle_name = 'bt'
if moudle_name not in g_file_id_dict:
g_file_id_dict[moudle_name] = {}
m = re.search(r'\w+\.h$', h_file_path)
if m is None:
print(timestamp() + ' Wrong type file, please input head file path.')
return -1
if not os.path.exists(h_file_path):
print(timestamp() + ' Head file [%s] did not exist.' % (h_file_path))
return 0
try:
if py_version.startswith("3"):
with open(h_file_path, 'r', encoding="UTF-8") as fd:
id_file = fd.read()
else:
with open(h_file_path, 'r') as fd:
id_file = fd.read()
except Exception as e:
print(e)
return -1
id_list = re.search(r"typedef enum[\s]*\{([\d\D]*?)\}", id_file).group(1)
id_list = id_list.replace(',', '').replace(' ', '').split('\n')
for line_str in id_list:
line_str = line_str.strip().split("/")[0]
save_file_id_dict(line_str, moudle_name)
return 0
def get_file_id_enum_in_paths(h_file_paths):
for h_file in h_file_paths:
if not h_file:
continue
if get_file_id_enum_in_file(h_file) != 0:
return -1
return 0
# 文件换行符处理
def modify_newline_on_linux(srcfile, destfile):
with open(srcfile, "rb") as fsrc, open(destfile, "wb") as fdest:
while True:
cs = fsrc.read(1)
if len(cs) > 0:
if cs == "\r":
fdest.write(cs)
cs = fsrc.read(1)
if cs != "\n":
fdest.write("\n")
fdest.write(cs)
else:
fdest.write(cs)
else:
fdest.write(cs)
else:
break
#mkdir ${target} ${root} ${chip} ${core}
def generate_db_temp_dir(sys_argv):
root = sys_argv[2]
chip = sys_argv[3]
core_name = sys_argv[4]
in_path = XML_PATH
in_path = in_path.replace('<chip>', chip)
# get global settings
db_conf = None
conf = os.path.join(root, in_path)
with open(conf, 'r') as f:
db_conf = json.load(f)
base_file_dir = os.path.join(os.path.join(root, db_conf["HDB_XML_TEMP_BASE_DIR"]), core_name)
if not os.path.exists(base_file_dir):
os.makedirs(base_file_dir)
#${target} ${root} ${chip} ${core} ${src_file} ${file_id_dir}
def generate_db_xml(root, core_name, auto_def, module_name, src_file, closed_flag):
global log_info_list
if not os.path.isfile(src_file):
return
# get global settings
db_conf = None
conf = os.path.join(root, in_path)
with open(conf, 'r') as f:
db_conf = json.load(f)
parse_single_source_file(src_file, auto_def, module_name)
if len(log_info_list) == 0:
return
_, filename = os.path.split(src_file)
filename = filename + ".xml"
if (closed_flag != True):
base_file_dir = os.path.join(os.path.join(root, db_conf["HDB_XML_TEMP_BASE_DIR"]), core_name)
else:
base_file_dir = os.path.join(os.path.join(root, db_conf["HDB_XML_TEMP_BASE_DIR"]), "closed_comp")
if not os.path.exists(base_file_dir):
os.makedirs(base_file_dir)
dst_xml_full_name = os.path.join(base_file_dir, filename)
msg_root_element = ET.Element('MSG_LOG')
for data in log_info_list:
add_content_to_xml(data, msg_root_element)
tree = ET.ElementTree(msg_root_element)
tree.write(dst_xml_full_name)
# main
if __name__ == "__main__":
if (sys.argv[1] == "mkdir"):
generate_db_temp_dir(sys.argv)
sys.exit(0)
root = sys.argv[1]
chip = sys.argv[2]
core_name = sys.argv[3]
aich_name = sys.argv[4]
in_path = XML_PATH
in_path = in_path.replace('<chip>', chip)
auto_def = sys.argv[5]
if auto_def == "TRUE" or auto_def == "True":
auto_def = True
else:
auto_def = False
module_name = sys.argv[6]
closed_flag = sys.argv[7]
if closed_flag == "TRUE" or closed_flag == "True":
closed_flag = True
else:
closed_flag = False
info_file = sys.argv[8]
try:
with open(info_file, 'r') as f:
text = f.read()
file_id_dir = text.split("####")[0].split(',')
src_files = text.split("####")[1].split(',')
if file_id_dir != None and get_file_id_enum_in_paths(file_id_dir) != 0:
sys.exit(1)
for src_file in src_files:
src_file = src_file.strip()
generate_db_xml(root, core_name, auto_def, module_name, src_file, closed_flag)
except:
print("[WARN] open %s exception" % info_file)