• 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 write_json_file  # noqa: E402
24from scripts.util.build_utils import write_depfile  # noqa: E402
25
26
27def get_source_name(module_type, name, prefix_override, suffix,
28                    alternative_suffix):
29    """Generate source file name by type."""
30    if (module_type == 'lib'
31        or module_type == 'lib64') and not prefix_override:
32        if not name.startswith('lib'):
33            name = 'lib' + name
34    alias = ''
35    if module_type == 'java_library' and alternative_suffix:
36        alias = '%s%s' % (name, alternative_suffix)
37    if suffix:
38        name = '%s%s' % (name, suffix)
39    if module_type == 'none':
40        name = ''
41    return name, alias
42
43
44def get_type_dir(module_type):
45    """Get the install directory by type."""
46    return module_type
47
48
49def _gen_install_dest(base_dir, module_install_dir, relative_install_dir,
50                      module_type):
51    """Generate module install dir by user config."""
52    if module_install_dir != '':
53        _install_dir = os.path.join(base_dir, module_install_dir)
54    elif relative_install_dir != '':
55        _install_dir = os.path.join(base_dir, get_type_dir(module_type),
56                                    relative_install_dir)
57    else:
58        _install_dir = os.path.join(base_dir, get_type_dir(module_type))
59    return _install_dir
60
61
62def gen_install_dests(system_base_dir, ramdisk_base_dir, vendor_base_dir, updater_base_dir,
63                      updater_vendor_base_dir, sys_prod_base_dir, chip_prod_base_dir,
64                      eng_system_base_dir, eng_chipset_base_dir, cloud_rom_base_dir, source_file_name,
65                      install_images, module_install_dir, relative_install_dir, module_type):
66    """Generate module install dir by user config."""
67    dests = []
68    if module_type == "none":
69        return dests
70    dest = ''
71    for image in install_images:
72        if image == 'system':
73            dest = _gen_install_dest(system_base_dir, module_install_dir,
74                                     relative_install_dir, module_type)
75        elif image == 'ramdisk':
76            dest = _gen_install_dest(ramdisk_base_dir, module_install_dir,
77                                     relative_install_dir, module_type)
78        elif image == 'vendor':
79            dest = _gen_install_dest(vendor_base_dir, module_install_dir,
80                                     relative_install_dir, module_type)
81        elif image == 'updater':
82            dest = _gen_install_dest(updater_base_dir, module_install_dir,
83                                     relative_install_dir, module_type)
84        elif image == 'updater_vendor':
85            dest = _gen_install_dest(updater_vendor_base_dir, module_install_dir,
86                                     relative_install_dir, module_type)
87        elif image == 'sys_prod':
88            dest = _gen_install_dest(sys_prod_base_dir, module_install_dir,
89                                     relative_install_dir, module_type)
90        elif image == 'chip_prod':
91            dest = _gen_install_dest(chip_prod_base_dir, module_install_dir,
92                                     relative_install_dir, module_type)
93        elif image == 'eng_system':
94            dest = _gen_install_dest(eng_system_base_dir, module_install_dir,
95                                     relative_install_dir, module_type)
96        elif image == 'eng_chipset':
97            dest = _gen_install_dest(eng_chipset_base_dir, module_install_dir,
98                                     relative_install_dir, module_type)
99        elif image == 'cloud_rom':
100            dest = _gen_install_dest(cloud_rom_base_dir, module_install_dir,
101                                     relative_install_dir, module_type)
102        dests.append(os.path.join(dest, source_file_name))
103    return dests
104
105
106def gen_module_info_data(args):
107    module_source = ''
108    module_alt_source = ''
109    source_file_name = ''
110    if args.prebuilt:
111        source_file_name = os.path.basename(args.module_source)
112        module_source = args.module_source
113        if module_source.startswith("//"):
114            module_source = module_source[2:]
115    # when the app is compiled by hvigor, that means module_type == "app" and suffix == "".
116    elif args.type == "app" and not args.suffix:
117        source_file_name = ""
118        alt_source_file_name = ""
119        module_source = args.install_name
120        module_alt_source = alt_source_file_name
121    else:
122        source_file_name, alt_source_file_name = get_source_name(
123            args.type, args.install_name, args.prefix_override, args.suffix,
124            args.alternative_suffix)
125        module_source = source_file_name
126        module_alt_source = alt_source_file_name
127
128    install_dests = []
129    if args.install_images:
130        install_dests = gen_install_dests(
131            args.system_base_dir, args.ramdisk_base_dir, args.vendor_base_dir, args.updater_base_dir,
132            args.updater_vendor_base_dir, args.sys_prod_base_dir, args.chip_prod_base_dir,
133            args.eng_system_base_dir, args.eng_chipset_base_dir, args.cloud_rom_base_dir, source_file_name,
134            args.install_images, args.module_install_dir, args.relative_install_dir, args.type)
135
136    module_info_data = gen_module_info(args.type, args.target_label,
137                                       args.label_name, args.source_dir,
138                                       module_source, module_alt_source,
139                                       install_dests, args.symlink_target,
140                                       args.install_enable, args.collect,
141                                       args.notice, args)
142    return module_info_data
143
144
145def gen_module_info(module_type, module_label, module_name, source_dir,
146                    module_source, module_alt_source, install_dests,
147                    symlink_target, install_enable, collect, notice, args):
148    """Generate module install info."""
149    source = os.path.join(source_dir, module_source)
150    data = {
151        'type': module_type,
152        'label': module_label,
153        'label_name': module_name,
154        'source': source,
155        'dest': install_dests,
156        'collect': collect,
157        'install_enable': install_enable
158    }
159    if notice:
160        data['notice'] = notice
161    if args.part_name:
162        data['part_name'] = args.part_name
163    if args.subsystem_name:
164        data['subsystem_name'] = args.subsystem_name
165    if args.shlib_type:
166        data['shlib_type'] = args.shlib_type
167    if args.innerapi_tags:
168        data['innerapi_tags'] = args.innerapi_tags
169    if args.version_script:
170        data['version_script'] = args.version_script
171    if module_type == 'java_library':
172        data['alternative_source'] = os.path.join(source_dir,
173                                                  module_alt_source)
174    if args.symlink_ext:
175        data['symlink_ext'] = args.symlink_ext
176    if args.symlink_path:
177        data['symlink_path'] = args.symlink_path
178    if symlink_target:
179        data['symlink'] = symlink_target
180    if args.softlink_create_path:
181        data['softlink_create_path'] = args.softlink_create_path
182    return data
183
184
185def create_module_info_parser():
186    parser = argparse.ArgumentParser()
187    parser.add_argument('--system-base-dir', required=True)
188    parser.add_argument('--ramdisk-base-dir', required=True)
189    parser.add_argument('--vendor-base-dir', required=True)
190    parser.add_argument('--updater-base-dir', required=True)
191    parser.add_argument('--updater_vendor-base-dir', required=True)
192    parser.add_argument('--eng_system-base-dir', required=True)
193    parser.add_argument('--eng_chipset-base-dir', required=True)
194    parser.add_argument('--sys_prod-base-dir', required=True)
195    parser.add_argument('--chip_prod-base-dir', required=True)
196    parser.add_argument('--cloud_rom-base-dir', required=True)
197    parser.add_argument('--label-name', help='module name', required=True)
198    parser.add_argument('--target-label', help='target label', required=True)
199    parser.add_argument('--type', help='module type', required=True)
200    parser.add_argument('--source-dir', help='', required=True)
201    parser.add_argument('--install-images', nargs='+', help='')
202    parser.add_argument('--install-name', help='', required=False, default='')
203    parser.add_argument('--suffix', help='', required=False)
204    parser.add_argument('--alternative-suffix',
205                        help='alternative extension for java library targets',
206                        required=False)
207    parser.add_argument('--symlink-target', nargs='+', help='', required=False)
208    parser.add_argument('--output-file', help='', required=True)
209    parser.add_argument('--prebuilt', dest='prebuilt', action='store_true')
210    parser.add_argument('--no-prebuilt', dest='prebuilt', action='store_false')
211    parser.set_defaults(prebuilt=False)
212    parser.add_argument('--module-source', help='', required=False)
213    parser.add_argument('--install-enable', dest='install_enable', action='store_false')
214    parser.set_defaults(install_enable=True)
215    parser.add_argument('--collect', dest='collect', action='store_true')
216    parser.add_argument('--notice', help='path to notice')
217    parser.set_defaults(collect=False)
218    parser.add_argument('--module-install-dir', help='', required=False, default='')
219    parser.add_argument('--relative-install-dir', help='', required=False, default='')
220    parser.add_argument('--part-name', help='', required=False, default='')
221    parser.add_argument('--subsystem-name', help='', required=False, default='')
222    parser.add_argument('--shlib-type', help='', required=False, default='')
223    parser.add_argument('--innerapi-tags', nargs='+', help='', required=False, default='')
224    parser.add_argument('--symlink-ext', nargs='+', help='', required=False, default='')
225    parser.add_argument('--symlink-path', help='', required=False, default='')
226    parser.add_argument('--softlink-create-path', help='', required=False, default='')
227    parser.add_argument('--version_script', help='', required=False, default='')
228    parser.add_argument('--prefix-override', dest='prefix_override', action='store_true')
229    parser.add_argument('--no-prefix-override', dest='prefix_override', action='store_false')
230    parser.set_defaults(prefix_override=False)
231    parser.add_argument('--depfile', required=False)
232    return parser
233
234
235def main():
236    args = create_module_info_parser().parse_args()
237
238    # write module info file
239    write_json_file(args.output_file, gen_module_info_data(args))
240
241    if args.depfile:
242        _dep_files = []
243        write_depfile(args.depfile, args.output_file, _dep_files, add_pydeps=False)
244    return 0
245
246
247if __name__ == '__main__':
248    sys.exit(main())
249