• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# Copyright (c) 2021 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, write_json_file  # noqa: E402
24
25
26def get_toolchain(current_variant, external_part_variants, platform_toolchain):
27    if current_variant == 'phone':
28        toolchain = platform_toolchain.get(current_variant)
29        required_include_dir = False
30    else:
31        if current_variant in external_part_variants:
32            toolchain = platform_toolchain.get(current_variant)
33            required_include_dir = False
34        else:
35            toolchain = platform_toolchain.get('phone')
36            required_include_dir = True
37    return toolchain, required_include_dir
38
39
40def _get_external_module_info(parts_inner_kits_info, external_part_name,
41                              external_module_name, adapted_part_name):
42    _inner_kits_info_dict = parts_inner_kits_info.get(external_part_name)
43    if _inner_kits_info_dict is None:
44        raise Exception(
45            "external dep part '{}' doesn't exist.".format(external_part_name))
46    if external_module_name in _inner_kits_info_dict:
47        external_module_desc_info = _inner_kits_info_dict.get(
48            external_module_name)
49    elif adapted_part_name:
50        _new_kits_info_dict = parts_inner_kits_info.get(adapted_part_name)
51        if _new_kits_info_dict is None:
52            raise Exception(
53                "part '{}' doesn't exist.".format(adapted_part_name))
54        external_module_desc_info = _new_kits_info_dict.get(
55            external_module_name)
56        if external_module_desc_info is None:
57            raise Exception(
58                "external dep module '{}' doesn't exist in part '{}'.".format(
59                    external_module_name, adapted_part_name))
60    else:
61        raise Exception(
62            "external dep module '{}' doesn't exist in part '{}'.".format(
63                external_module_name, external_part_name))
64    return external_module_desc_info
65
66
67def _get_external_module_from_sdk(sdk_base_dir, external_part_name,
68                                  external_module_name, adapted_part_name):
69    _sdk_info_file = os.path.join(sdk_base_dir, external_part_name,
70                                  "sdk_info.json")
71    subsystem_sdk_info = read_json_file(_sdk_info_file)
72    if subsystem_sdk_info is None:
73        raise Exception("part '{}' doesn't exist in sdk modules.".format(
74            external_part_name))
75
76    _adapted = False
77    if external_module_name in subsystem_sdk_info:
78        sdk_module_info = subsystem_sdk_info.get(external_module_name)
79    elif adapted_part_name:
80        _new_sdk_info_file = os.path.join(sdk_base_dir, adapted_part_name,
81                                          "sdk_info.json")
82        _new_subsystem_sdk_info = read_json_file(_new_sdk_info_file)
83        if _new_subsystem_sdk_info is None:
84            raise Exception("part '{}' doesn't exist sdk modules.".format(
85                adapted_part_name))
86        sdk_module_info = _new_subsystem_sdk_info.get(external_module_name)
87        if sdk_module_info is None:
88            raise Exception(
89                "external dep module '{}' doesn't exist in part '{}'.".format(
90                    external_module_name, adapted_part_name))
91        _adapted = True
92    else:
93        raise Exception(
94            "external dep module '{}' doesn't exist in part '{}'.".format(
95                external_module_name, external_part_name))
96    return sdk_module_info, _adapted
97
98
99def _get_inner_kits_adapter_info(innerkits_adapter_info_file):
100    _parts_compatibility = {}
101    if os.path.exists(innerkits_adapter_info_file):
102        inner_kits_adapter_info = read_json_file(innerkits_adapter_info_file)
103        if inner_kits_adapter_info is None:
104            raise Exception("read inner_kits_adapter info failed.")
105        _parts_compatibility.update(inner_kits_adapter_info)
106    return _parts_compatibility
107
108
109def main():
110    parser = argparse.ArgumentParser()
111    parser.add_argument('--external-deps', nargs='*', required=True)
112    parser.add_argument('--parts-src-flag-file', required=True)
113    parser.add_argument('--sdk-base-dir', required=True)
114    parser.add_argument('--sdk-dir-name', required=True)
115    parser.add_argument('--external-deps-temp-file', required=True)
116    parser.add_argument('--use-sdk', dest='use_sdk', action='store_true')
117    parser.set_defaults(use_sdk=False)
118    parser.add_argument('--current-toolchain', required=False, default='')
119    parser.add_argument(
120        '--innerkits-adapter-info-file',
121        default='../../build/ohos/inner_kits_adapter.json')
122    args = parser.parse_args()
123
124    if len(args.external_deps) == 0:
125        result = {}
126        write_json_file(args.external_deps_temp_file, result)
127        return 0
128
129    # parts info
130    parts_src_flag = read_json_file(args.parts_src_flag_file)
131    # external deps list
132    external_deps = args.external_deps
133    # sdk base dir
134    sdk_base_dir = args.sdk_base_dir
135    sdk_dir_name = args.sdk_dir_name
136    use_sdk = args.use_sdk
137
138    deps = []
139    libs = []
140    include_dirs = []
141
142    # load inner kits info file
143    inner_kits_info_file = 'build_configs/parts_info/inner_kits_info.json'
144    all_kits_info_dict = read_json_file(inner_kits_info_file)
145    if all_kits_info_dict is None:
146        raise Exception("read pre_build inner_kits_info failed.")
147
148    # load parts variants
149    parts_variants_info_file = 'build_configs/parts_info/parts_variants.json'
150    all_parts_variants_info = read_json_file(parts_variants_info_file)
151    if all_parts_variants_info is None:
152        raise Exception("read pre_build parts_variants failed.")
153
154    # load toolchains info
155    toolchain_variant_info_file = os.path.join('build_configs',
156                                               'platforms_info',
157                                               'toolchain_to_variant.json')
158    toolchain_variant_info = read_json_file(toolchain_variant_info_file)
159    if toolchain_variant_info is None:
160        raise Exception("read pre_build parts_variants failed.")
161    toolchain_platform = toolchain_variant_info.get('toolchain_platform')
162    current_variant = toolchain_platform.get(args.current_toolchain)
163    if not current_variant:
164        current_variant = 'phone'
165    platform_toolchain = toolchain_variant_info.get('platform_toolchain')
166
167    # compatibility interim
168    _parts_compatibility = _get_inner_kits_adapter_info(
169        args.innerkits_adapter_info_file)
170
171    for external_lib in external_deps:
172        deps_desc = external_lib.split(':')
173        external_part_name = deps_desc[0]
174        external_module_name = deps_desc[1]
175
176        # Usually the value is None
177        _adapted_part_name = _parts_compatibility.get(external_part_name)
178
179        # Check if the subsystem has source code
180        if not use_sdk and external_part_name in parts_src_flag:
181            external_module_desc_info = _get_external_module_info(
182                all_kits_info_dict, external_part_name, external_module_name,
183                _adapted_part_name)
184            dep_label = external_module_desc_info['label']
185
186            part_variants_info = all_parts_variants_info.get(external_part_name)
187            if part_variants_info is None:
188                raise Exception(
189                    "external deps part '{}' variants info is None.".format(
190                        external_part_name))
191            toolchain, required_include_dir = get_toolchain(
192                current_variant, part_variants_info.keys(), platform_toolchain)
193            dep_label_with_tc = "{}({})".format(dep_label, toolchain)
194            deps += [dep_label_with_tc]
195
196            if required_include_dir is True and external_module_desc_info.get(
197                    'type') == 'so':
198                include_dir = external_module_desc_info.get('header_base')
199                include_dirs.append(include_dir)
200
201            # sdk prebuilt
202            if external_module_desc_info['prebuilt_enable']:
203                libs += [external_module_desc_info['prebuilt_source']]
204        else:
205            sdk_module_info, adapted_ok = _get_external_module_from_sdk(
206                sdk_base_dir, external_part_name, external_module_name,
207                _adapted_part_name)
208
209            if adapted_ok is True:
210                _external_part_name = _adapted_part_name
211            else:
212                _external_part_name = external_part_name
213            deps += [
214                "//{}/{}:{}".format(sdk_dir_name, _external_part_name,
215                                    external_module_name)
216            ]
217            # java sdk module does not need to add libs
218            if not (sdk_module_info.get('type')
219                    and sdk_module_info.get('type') == 'jar'):
220                external_lib_source = sdk_module_info.get('source')
221                libs += [
222                    "//{}/{}/{}".format(sdk_dir_name, _external_part_name,
223                                        external_lib_source)
224                ]
225
226    result = {}
227    if deps:
228        result['deps'] = deps
229    if libs:
230        result['libs'] = libs
231    if include_dirs:
232        result['include_dirs'] = include_dirs
233
234    write_json_file(args.external_deps_temp_file, result)
235    return 0
236
237
238if __name__ == '__main__':
239    sys.exit(main())
240