15f9996aaSopenharmony_ci#!/usr/bin/env python 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd. 45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License. 65f9996aaSopenharmony_ci# You may obtain a copy of the License at 75f9996aaSopenharmony_ci# 85f9996aaSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 95f9996aaSopenharmony_ci# 105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and 145f9996aaSopenharmony_ci# limitations under the License. 155f9996aaSopenharmony_ci 165f9996aaSopenharmony_ciimport sys 175f9996aaSopenharmony_ciimport os 185f9996aaSopenharmony_ciimport shutil 195f9996aaSopenharmony_ciimport argparse 205f9996aaSopenharmony_ciimport zipfile 215f9996aaSopenharmony_cisys.path.append( 225f9996aaSopenharmony_ci os.path.dirname(os.path.dirname(os.path.dirname( 235f9996aaSopenharmony_ci os.path.abspath(__file__))))) 245f9996aaSopenharmony_cifrom scripts.util.file_utils import read_json_file, write_json_file # noqa: E402 255f9996aaSopenharmony_cifrom scripts.util import build_utils # noqa: E402 265f9996aaSopenharmony_ci 275f9996aaSopenharmony_ci 285f9996aaSopenharmony_cidef get_no_src_parts(system_install_info_file: str): 295f9996aaSopenharmony_ci install_parts_info = read_json_file(system_install_info_file) 305f9996aaSopenharmony_ci if install_parts_info is None: 315f9996aaSopenharmony_ci raise Exception("read no src subsystem info file failed.") 325f9996aaSopenharmony_ci parts_name_list = [] 335f9996aaSopenharmony_ci for info in install_parts_info: 345f9996aaSopenharmony_ci if 'is_source' not in info: 355f9996aaSopenharmony_ci raise Exception( 365f9996aaSopenharmony_ci "read subsystem info error, missing key is_source.") 375f9996aaSopenharmony_ci if info.get('is_source') is True: 385f9996aaSopenharmony_ci continue 395f9996aaSopenharmony_ci if 'part_name' not in info: 405f9996aaSopenharmony_ci raise Exception("read part info error, missing key part_name.") 415f9996aaSopenharmony_ci 425f9996aaSopenharmony_ci part_name = info.get('part_name') 435f9996aaSopenharmony_ci parts_name_list.append(part_name) 445f9996aaSopenharmony_ci return parts_name_list 455f9996aaSopenharmony_ci 465f9996aaSopenharmony_ci 475f9996aaSopenharmony_cidef generate_binary_sa_archive(parts_list: list, sa_profile_archive_info_file: str, 485f9996aaSopenharmony_ci sa_output_dir: str, depfiles: list): 495f9996aaSopenharmony_ci if not os.path.exists(sa_output_dir): 505f9996aaSopenharmony_ci os.makedirs(sa_output_dir, exist_ok=True) 515f9996aaSopenharmony_ci sa_tuples = [] 525f9996aaSopenharmony_ci subsystem_sa_archive_dir = os.path.dirname(sa_profile_archive_info_file) 535f9996aaSopenharmony_ci if not os.path.exists(subsystem_sa_archive_dir): 545f9996aaSopenharmony_ci return sa_tuples 555f9996aaSopenharmony_ci if not os.path.exists(sa_profile_archive_info_file): 565f9996aaSopenharmony_ci print("warning: sa profile archive info file does not exist.") 575f9996aaSopenharmony_ci return sa_tuples 585f9996aaSopenharmony_ci 595f9996aaSopenharmony_ci sa_profile_archive_info = read_json_file(sa_profile_archive_info_file) 605f9996aaSopenharmony_ci if sa_profile_archive_info is None: 615f9996aaSopenharmony_ci raise Exception("read sa profile archive info file failed.") 625f9996aaSopenharmony_ci 635f9996aaSopenharmony_ci for _part_name in parts_list: 645f9996aaSopenharmony_ci _sa_file_list = sa_profile_archive_info.get(_part_name) 655f9996aaSopenharmony_ci if _sa_file_list is None: 665f9996aaSopenharmony_ci continue 675f9996aaSopenharmony_ci for _sa_file in _sa_file_list: 685f9996aaSopenharmony_ci _sa_file_path = os.path.join(subsystem_sa_archive_dir, _sa_file) 695f9996aaSopenharmony_ci sa_tuples.append((_sa_file_path, 705f9996aaSopenharmony_ci os.path.relpath(_sa_file_path, 715f9996aaSopenharmony_ci subsystem_sa_archive_dir))) 725f9996aaSopenharmony_ci depfiles.append(_sa_file_path) 735f9996aaSopenharmony_ci return sa_tuples 745f9996aaSopenharmony_ci 755f9996aaSopenharmony_ci 765f9996aaSopenharmony_cidef main(): 775f9996aaSopenharmony_ci parser = argparse.ArgumentParser() 785f9996aaSopenharmony_ci parser.add_argument('--system-install-info-file', required=True) 795f9996aaSopenharmony_ci parser.add_argument('--sa-profile-archive-info-file', required=False) 805f9996aaSopenharmony_ci parser.add_argument('--sa-output-dir', required=True) 815f9996aaSopenharmony_ci parser.add_argument('--sa-output-zipfile', required=True) 825f9996aaSopenharmony_ci parser.add_argument('--depfile', required=True) 835f9996aaSopenharmony_ci args = parser.parse_args() 845f9996aaSopenharmony_ci 855f9996aaSopenharmony_ci sa_files_list = [] 865f9996aaSopenharmony_ci depfiles = [] 875f9996aaSopenharmony_ci sa_files_tuples = [] 885f9996aaSopenharmony_ci if args.sa_profile_archive_info_file: 895f9996aaSopenharmony_ci depfiles.append(args.sa_profile_archive_info_file) 905f9996aaSopenharmony_ci parts_list = get_no_src_parts(args.system_install_info_file) 915f9996aaSopenharmony_ci sa_files_tuples.extend( 925f9996aaSopenharmony_ci generate_binary_sa_archive(parts_list, 935f9996aaSopenharmony_ci args.sa_profile_archive_info_file, 945f9996aaSopenharmony_ci args.sa_output_dir, depfiles)) 955f9996aaSopenharmony_ci with zipfile.ZipFile(args.sa_output_zipfile, 'w') as outfile: 965f9996aaSopenharmony_ci for sa_file_path, sa_file in sa_files_tuples: 975f9996aaSopenharmony_ci build_utils.add_to_zip_hermetic(outfile, 985f9996aaSopenharmony_ci sa_file, 995f9996aaSopenharmony_ci src_path=sa_file_path) 1005f9996aaSopenharmony_ci build_utils.write_depfile(args.depfile, args.sa_output_zipfile, depfiles) 1015f9996aaSopenharmony_ci return 0 1025f9996aaSopenharmony_ci 1035f9996aaSopenharmony_ci 1045f9996aaSopenharmony_ciif __name__ == '__main__': 1055f9996aaSopenharmony_ci sys.exit(main()) 106