1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# Copyright (c) 2023 Huawei Device Co., Ltd.
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#     http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import argparse
17import os
18import sys
19
20sys.path.append(
21    os.path.dirname(os.path.dirname(os.path.dirname(
22        os.path.abspath(__file__)))))
23from scripts.util.file_utils import read_json_file # noqa: E402
24
25
26def check_parts_deps(args, external_part_name: str, parts_deps_info: dict):
27    compile_standard_allow_file = args.compile_standard_allow_file
28    compile_standard_allow_info = read_json_file(compile_standard_allow_file)
29    added_self_part_allow_list = compile_standard_allow_info.get("external_deps_added_self_part_module", [])
30    bundle_not_add_allow_list = compile_standard_allow_info.get("external_deps_bundle_not_add", [])
31    if external_part_name == args.part_name:
32        message = "{} in target {} is dependency within part {}, Need to used deps".format(
33            external_part_name, args.target_path, args.part_name)
34        if args.target_path in added_self_part_allow_list:
35            print(f"[0/0] WARNING: {message}")
36            return
37        else:
38            raise Exception(message)
39
40    _tips_info = "{} depend part {}, need set part deps info to".format(
41        args.target_path, external_part_name)
42
43    part_deps_info = parts_deps_info.get(args.part_name)
44    if not part_deps_info:
45        _warning_info = "{} {}.".format(_tips_info, args.part_name)
46    elif not part_deps_info.get('components') or \
47        not external_part_name in part_deps_info.get('components'):
48        _warning_info = "{} {}.".format(_tips_info, part_deps_info.get('build_config_file'))
49    else:
50        _warning_info = ""
51
52    if _warning_info != "":
53        if args.target_path in bundle_not_add_allow_list:
54            print(f"[0/0] WARNING: {_warning_info}")
55        else:
56            raise Exception(_warning_info)
57
58    return
59
60
61def check(args) -> list:
62    depfiles = []
63    if len(args.external_deps) == 0:
64        return depfiles
65
66    external_deps = args.external_deps
67
68    parts_deps_file = 'build_configs/parts_info/parts_deps.json'
69    parts_deps_info = read_json_file(parts_deps_file)
70    if parts_deps_info is None:
71        raise Exception("read pre_build parts_deps failed.")
72    depfiles.append(parts_deps_file)
73
74    for external_lib in external_deps:
75        deps_desc = external_lib.split(':')
76        external_part_name = deps_desc[0]
77        check_parts_deps(args, external_part_name, parts_deps_info)
78
79    return depfiles
80
81
82def main():
83    parser = argparse.ArgumentParser()
84    parser.add_argument('--external-deps', nargs='*', required=True)
85    parser.add_argument('--part-name', required=True, default='')
86    parser.add_argument('--target-path', required=True, default='')
87    parser.add_argument('--output', required=True, default='')
88    args = parser.parse_args()
89
90    check(args)
91
92    return 0
93
94
95if __name__ == '__main__':
96    sys.exit(main())
97