rt-thread/tools/ci/bsp_buildings.py

161 lines
4.1 KiB
Python

import os
import re
import glob
import shutil
import multiprocessing
def add_summary(text):
"""
add summary to github action.
"""
os.system(f'echo "{text}" >> $GITHUB_STEP_SUMMARY ;')
def run_cmd(cmd):
"""
run command and return output and result.
"""
print('\033[1;32m' + cmd + '\033[0m')
res = os.system(cmd + " > output.txt 2>&1")
with open("output.txt", "r") as file:
output = file.readlines()
for line in output:
print(line, end='')
os.remove("output.txt")
return output, res
def build_bsp(bsp):
"""
build bsp.
cd {rtt_root}
scons -C bsp/{bsp} --pyconfig-silent
cd {rtt_root}/bsp/{bsp}
pkgs --upgrade-script-force
pkgs --update
pkgs --list
cd {rtt_root}
scons -C bsp/{bsp} -j{nproc} --debug=time
cd {rtt_root}/bsp/{bsp}
scons -c
rm -rf packages
"""
success = True
os.chdir(rtt_root)
if os.path.exists(f"{rtt_root}/bsp/{bsp}/Kconfig"):
os.chdir(rtt_root)
run_cmd(f'scons -C bsp/{bsp} --pyconfig-silent')
os.chdir(f'{rtt_root}/bsp/{bsp}')
run_cmd('pkgs --update')
run_cmd('pkgs --list')
nproc = multiprocessing.cpu_count()
os.chdir(rtt_root)
output, res = run_cmd(f'scons -C bsp/{bsp} -j{nproc} --debug=time')
total_time = 0
for line in output:
pattern = r"Total command execution time: (\d+\.\d+) seconds"
match = re.search(pattern, line)
if match:
total_time = match.group(1)
break
if res != 0:
success = False
os.chdir(f'{rtt_root}/bsp/{bsp}')
run_cmd('scons -c')
pkg_dir = os.path.join(rtt_root, 'bsp', bsp, 'packages')
shutil.rmtree(pkg_dir, ignore_errors=True)
return success, total_time
def append_file(source_file, destination_file):
"""
append file to another file.
"""
with open(source_file, 'r') as source:
with open(destination_file, 'a') as destination:
for line in source:
destination.write(line)
def build_bsp_attachconfig(bsp, attach_file):
"""
build bsp with attach config.
cp bsp/{bsp}/.config bsp/{bsp}/.config.origin
cat .ci/attachconfig/{attach_file} >> bsp/{bsp}/.config
build_bsp()
cp bsp/{bsp}/.config.origin bsp/{bsp}/.config
rm bsp/{bsp}/.config.origin
"""
config_file = os.path.join(rtt_root, 'bsp', bsp, '.config')
config_bacakup = config_file+'.origin'
shutil.copyfile(config_file, config_bacakup)
append_file(attach_file, config_file)
res, total_time = build_bsp(bsp)
shutil.copyfile(config_bacakup, config_file)
os.remove(config_bacakup)
return res, total_time
if __name__ == "__main__":
"""
build all bsp and attach config.
1. build all bsp.
2. build all bsp with attach config.
"""
failed = 0
count = 0
rtt_root = os.getcwd()
srtt_bsp = os.getenv('SRTT_BSP').split(',')
for bsp in srtt_bsp:
count += 1
print(f"::group::Compiling BSP: =={count}=== {bsp} ====")
res, total_time = build_bsp(bsp)
if not res:
print(f"::error::build {bsp} failed")
add_summary(f"- ❌ build {bsp} failed in {total_time} s.")
failed += 1
else:
add_summary(f'- ✅ build {bsp} success in {total_time} s.')
print("::endgroup::")
attach_dir = os.path.join(rtt_root, 'bsp', bsp, '.ci/attachconfig')
attach_files = glob.glob(os.path.join(attach_dir, '*.attach'))
for attach_file in attach_files:
count += 1
attach = os.path.basename(attach_file)
print(f"::group::\tCompiling BSP: =={count}=== {bsp} {attach}===")
res, total_time = build_bsp_attachconfig(bsp, attach_file)
if not res:
print(f"::error::build {bsp} {attach} failed.")
add_summary(f'\t- ❌ build {attach} failed in {total_time} s.')
failed += 1
else:
add_summary(f'\t- ✅ build {attach} success in {total_time} s.')
print("::endgroup::")
exit(failed)