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