Files
phs_v1.0.1.0/build/scripts/get_warnings.py
2024-09-27 19:16:49 +08:00

126 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python3
#-*- coding: UTF-8 -*-
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Usage: get_warnings.py --build-log-file out/phone-release/build.log \
--warning-out-file out/phone-release/warning_list.txt
Generate the project notice files, including both text and xml files.
"""
import argparse
import os
import sys
import re
import subprocess
def _do_uniq(infile, outfile):
subprocess.call(['sort', '-u', infile, '-o', outfile], shell=False)
def _pick_line(line_info):
result = False
parser_keys = [
": Warning", ": warning", "warning:", "Warning:", "WARNING:"
]
for _key in parser_keys:
if len(re.findall(_key, line_info, re.S)) >= 1:
result = True
break
return result
def _parse(in_name, out_name, prj_dir):
if not os.path.exists(in_name):
print("warning: build log file {} is not exists.".format(in_name))
return False
with open(in_name, "r", encoding='utf-8', errors='ignore') as in_fd:
os.makedirs(os.path.dirname(out_name), exist_ok=True)
with open(out_name, "w") as out_fd:
while True:
line_info = in_fd.readline()
line_info = line_info.replace("\r", "")
if line_info == "":
break
# Solve the non-standard printing in kernel compilation --begin
if (line_info.find("kernel/linux-") >
1) and (": warning:" in line_info):
line_info = line_info[line_info.find("kernel/linux-"):]
# Solve the non-standard printing in kernel compilation --end
if _pick_line(line_info):
while True:
if line_info.startswith("../"):
line_info = line_info[3:]
elif line_info.startswith("./"):
line_info = line_info[2:]
elif line_info.startswith("\""):
line_info = line_info[1:]
elif line_info.startswith(":"):
line_info = line_info[1:]
elif line_info.startswith(" "):
line_info = line_info[1:]
else:
break
# solving relative path
templist = line_info.split(":")
templist[0] = os.path.abspath(templist[0])
templist[0] = templist[0].replace(prj_dir + "/",
"").strip()
temp = ":"
line_info = temp.join(templist)
out_fd.write(line_info)
out_fd.write("\r\n")
return True
def _get_warn(log_file, warn_file, prj_dir):
if not os.path.exists(os.path.dirname(warn_file)):
os.makedirs(os.path.dirname(warn_file), exist_ok=True)
if os.path.exists(warn_file):
os.remove(warn_file)
temp_out_file = os.path.join(os.path.dirname(warn_file),
'temp_warning.txt')
result = _parse(log_file, temp_out_file, prj_dir)
if result:
_do_uniq(temp_out_file, warn_file)
# delete temp file
if os.path.exists(temp_out_file):
os.remove(temp_out_file)
def main(argv):
"""parse warning info from build log."""
parser = argparse.ArgumentParser()
parser.add_argument('--build-log-file', help='log file', required=True)
parser.add_argument('--warning-out-file',
help='result file',
required=True)
args = parser.parse_args(argv)
log_file = args.build_log_file
warn_file = args.warning_out_file
prj_dir = os.getcwd()
_get_warn(log_file, warn_file, prj_dir)
return 0
if __name__ == "__main__":
main(sys.argv[1:])