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