import sys
import os
import shutil
import argparse
import zipfile
sys.path.append(
os.path.dirname(os.path.dirname(os.path.dirname(
os.path.abspath(__file__)))))
from scripts.util.file_utils import read_json_file, write_json_file
from scripts.util import build_utils
def get_no_src_parts(system_install_info_file: str):
install_parts_info = read_json_file(system_install_info_file)
if install_parts_info is None:
raise Exception("read no src subsystem info file failed.")
parts_name_list = []
for info in install_parts_info:
if 'is_source' not in info:
raise Exception(
"read subsystem info error, missing key is_source.")
if info.get('is_source') is True:
continue
if 'part_name' not in info:
raise Exception("read part info error, missing key part_name.")
part_name = info.get('part_name')
parts_name_list.append(part_name)
return parts_name_list
def generate_binary_sa_archive(parts_list: list, sa_profile_archive_info_file: str,
sa_output_dir: str, depfiles: list):
if not os.path.exists(sa_output_dir):
os.makedirs(sa_output_dir, exist_ok=True)
sa_tuples = []
subsystem_sa_archive_dir = os.path.dirname(sa_profile_archive_info_file)
if not os.path.exists(subsystem_sa_archive_dir):
return sa_tuples
if not os.path.exists(sa_profile_archive_info_file):
print("warning: sa profile archive info file does not exist.")
return sa_tuples
sa_profile_archive_info = read_json_file(sa_profile_archive_info_file)
if sa_profile_archive_info is None:
raise Exception("read sa profile archive info file failed.")
for _part_name in parts_list:
_sa_file_list = sa_profile_archive_info.get(_part_name)
if _sa_file_list is None:
continue
for _sa_file in _sa_file_list:
_sa_file_path = os.path.join(subsystem_sa_archive_dir, _sa_file)
sa_tuples.append((_sa_file_path,
os.path.relpath(_sa_file_path,
subsystem_sa_archive_dir)))
depfiles.append(_sa_file_path)
return sa_tuples
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--system-install-info-file', required=True)
parser.add_argument('--sa-profile-archive-info-file', required=False)
parser.add_argument('--sa-output-dir', required=True)
parser.add_argument('--sa-output-zipfile', required=True)
parser.add_argument('--depfile', required=True)
args = parser.parse_args()
sa_files_list = []
depfiles = []
sa_files_tuples = []
if args.sa_profile_archive_info_file:
depfiles.append(args.sa_profile_archive_info_file)
parts_list = get_no_src_parts(args.system_install_info_file)
sa_files_tuples.extend(
generate_binary_sa_archive(parts_list,
args.sa_profile_archive_info_file,
args.sa_output_dir, depfiles))
with zipfile.ZipFile(args.sa_output_zipfile, 'w') as outfile:
for sa_file_path, sa_file in sa_files_tuples:
build_utils.add_to_zip_hermetic(outfile,
sa_file,
src_path=sa_file_path)
build_utils.write_depfile(args.depfile, args.sa_output_zipfile, depfiles)
return 0
if __name__ == '__main__':
sys.exit(main())