123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- import os
- import shutil
- import re
- import multiprocessing
- def add_summary(text):
- """
- add summary to github action.
- """
- os.system(f'echo "{text}" >> $GITHUB_STEP_SUMMARY ;')
- def run_cmd(cmd, output_info=True):
- """
- run command and return output and result.
- """
- print('\033[1;32m' + cmd + '\033[0m')
- output_str_list = []
- res = 0
- if output_info:
- res = os.system(cmd + " > output.txt 2>&1")
- else:
- res = os.system(cmd + " > /dev/null 2>output.txt")
- with open("output.txt", "r") as file:
- output_str_list = file.readlines()
- for line in output_str_list:
- print(line, end='')
- os.remove("output.txt")
- return output_str_list, res
- def build_bsp(bsp, scons_args=''):
- """
- build bsp.
- cd {rtt_root}
- scons -C bsp/{bsp} --pyconfig-silent > /dev/null
- cd {rtt_root}/bsp/{bsp}
- pkgs --update > /dev/null
- pkgs --list
- cd {rtt_root}
- scons -C bsp/{bsp} -j{nproc} {scons_args}
- cd {rtt_root}/bsp/{bsp}
- scons -c > /dev/null
- 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', output_info=False)
- os.chdir(f'{rtt_root}/bsp/{bsp}')
- run_cmd('pkgs --update', output_info=False)
- run_cmd('pkgs --list')
- nproc = multiprocessing.cpu_count()
- os.chdir(rtt_root)
- cmd = f'scons -C bsp/{bsp} -j{nproc} {scons_args}'
- __, res = run_cmd(cmd, output_info=False)
- if res != 0:
- success = False
- os.chdir(f'{rtt_root}/bsp/{bsp}')
- run_cmd('scons -c', output_info=False)
- pkg_dir = os.path.join(rtt_root, 'bsp', bsp, 'packages')
- shutil.rmtree(pkg_dir, ignore_errors=True)
- return success
- 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 check_scons_args(file_path):
- args = []
- with open(file_path, 'r') as file:
- for line in file:
- match = re.search(r'#\s*scons:\s*(.*)', line)
- if match:
- args.append(match.group(1).strip())
- return ' '.join(args)
- 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)
- attachconfig_dir = os.path.join(rtt_root, 'bsp', bsp, '.ci/attachconfig')
- attach_path = os.path.join(attachconfig_dir, attach_file)
- append_file(attach_path, config_file)
- scons_args = check_scons_args(attach_path)
- res = build_bsp(bsp, scons_args)
- shutil.copyfile(config_bacakup, config_file)
- os.remove(config_bacakup)
- return res
- 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 = build_bsp(bsp)
- if not res:
- print(f"::error::build {bsp} failed")
- add_summary(f"- ❌ build {bsp} failed.")
- failed += 1
- else:
- add_summary(f'- ✅ build {bsp} success.')
- print("::endgroup::")
- attach_dir = os.path.join(rtt_root, 'bsp', bsp, '.ci/attachconfig')
- attach_list = []
- for root, dirs, files in os.walk(attach_dir):
- for file in files:
- file_path = os.path.join(root, file)
- relative_path = os.path.relpath(file_path, attach_dir)
- attach_list.append(relative_path)
- for attach_file in attach_list:
- count += 1
- print(f"::group::\tCompiling BSP: =={count}=== {bsp} {attach_file}===")
- res = build_bsp_attachconfig(bsp, attach_file)
- if not res:
- print(f"::error::build {bsp} {attach_file} failed.")
- add_summary(f'\t- ❌ build {attach_file} failed.')
- failed += 1
- else:
- add_summary(f'\t- ✅ build {attach_file} success.')
- print("::endgroup::")
- exit(failed)
|