• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6#     http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14import("//build/config/clang/clang.gni")
15import("//build/config/python.gni")
16import("//build/ohos/notice/notice.gni")
17import("//build/templates/metadata/module_info.gni")
18
19template("ohos_copy") {
20  assert(defined(invoker.sources),
21         "sources must be defined for ${target_name}.")
22  assert(defined(invoker.outputs),
23         "outputs must be defined for ${target_name}.")
24
25  _is_test_target = defined(invoker.testonly) && invoker.testonly
26  _is_prebuilt = defined(invoker.prebuilt) && invoker.prebuilt
27  assert(_is_prebuilt != "")  # Mark as used
28
29  # module_info generation is bypassed for prebuilt static library
30  _bypass_module_info_generation =
31      defined(invoker.bypass_module_info_generation) &&
32      invoker.bypass_module_info_generation
33  _main_target_name = target_name
34  _target_label =
35      get_label_info(":${_main_target_name}", "label_with_toolchain")
36  assert(_target_label != "")  # Mark as used
37
38  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
39    _subsystem_name = invoker.subsystem_name
40    _part_name = invoker.part_name
41  } else if (defined(invoker.part_name)) {
42    _part_name = invoker.part_name
43    _part_subsystem_info_file =
44        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
45    _arguments = [
46      "--part-name",
47      _part_name,
48      "--part-subsystem-info-file",
49      rebase_path(_part_subsystem_info_file, root_build_dir),
50    ]
51    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
52    _subsystem_name =
53        exec_script(get_subsystem_script, _arguments, "trim string")
54  } else if (defined(invoker.subsystem_name)) {
55    _subsystem_name = invoker.subsystem_name
56    _part_name = _subsystem_name
57  } else {
58    _subsystem_name = "build"
59    _part_name = "build_framework"
60  }
61  assert(_subsystem_name != "")  # Mark as used
62  assert(_part_name != "")  # Mark as used
63
64  _deps = []
65  if (defined(invoker.deps)) {
66    _deps += invoker.deps
67  }
68
69  if (!_is_test_target) {
70    _notice_target = "${_main_target_name}__notice"
71
72    # Prebuilt target has some lexing error character
73    _notice_target = string_replace(_notice_target, "@", "_")
74    _notice_target = string_replace(_notice_target, "+", "_")
75    collect_notice(_notice_target) {
76      forward_variables_from(invoker,
77                             [
78                               "testonly",
79                               "license_as_sources",
80                               "license_file",
81                               "sources",
82                             ])
83      source_list = sources
84      module_name = _main_target_name
85      module_source_dir = get_label_info(":${_main_target_name}", "dir")
86    }
87    _deps += [ ":$_notice_target" ]
88  }
89
90  if (!_bypass_module_info_generation) {
91    _module_info_target = "${_main_target_name}_info"
92    generate_module_info(_module_info_target) {
93      forward_variables_from(invoker,
94                             [
95                               "module_install_dir",
96                               "relative_install_dir",
97                               "module_source_dir",
98                               "module_install_name",
99                               "module_type",
100                               "install_enable",
101                             ])
102      module_name = _main_target_name
103      if (!defined(module_type)) {
104        module_type = "unknown"
105      }
106      if (!defined(module_source_dir)) {
107        module_source_dir = "${target_out_dir}"
108      }
109
110      if (_is_prebuilt) {
111        _outputs = invoker.outputs
112        module_source = string_replace(_outputs[0], "${target_out_dir}/", "", 1)
113      }
114      prebuilt = _is_prebuilt
115
116      if (!defined(install_enable)) {
117        install_enable = false
118      }
119
120      part_name = _part_name
121      subsystem_name = _subsystem_name
122
123      module_install_images = [ "system" ]
124      if (defined(invoker.install_images)) {
125        module_install_images = []
126        module_install_images += invoker.install_images
127      }
128
129      if (defined(invoker.symlink_target_name)) {
130        symlink_target_name = invoker.symlink_target_name
131      }
132
133      if (defined(invoker.innerapi_tags)) {
134        innerapi_tags = invoker.innerapi_tags
135      }
136
137      notice = "$target_out_dir/$_main_target_name.notice.txt"
138    }
139    if (!skip_gen_module_info) {
140      _deps += [ ":$_module_info_target" ]
141    }
142  }
143
144  if (defined(invoker.enable_strip) && invoker.enable_strip) {
145    action_with_pydeps(target_name) {
146      forward_variables_from(invoker,
147                             [
148                               "testonly",
149                               "visibility",
150                               "public_configs",
151                               "public_external_deps",
152                               "sources",
153                               "outputs",
154                             ])
155      deps = _deps
156      script = "//build/templates/common/delete_symbol.py"
157      args = [
158        "--strip",
159        rebase_path("${clang_base_path}/bin/llvm-strip", root_build_dir),
160        "--input",
161        rebase_path(sources[0], root_build_dir),
162        "--output",
163        rebase_path(outputs[0], root_build_dir),
164      ]
165
166      if (!_bypass_module_info_generation) {
167        _install_module_info = {
168          module_def = _target_label
169          module_info_file =
170              rebase_path(get_label_info(_target_label, "target_out_dir"),
171                          root_build_dir) +
172              "/${_main_target_name}_module_info.json"
173          subsystem_name = _subsystem_name
174          part_name = _part_name
175          toolchain = current_toolchain
176          toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
177        }
178
179        metadata = {
180          install_modules = [ _install_module_info ]
181        }
182      }
183    }
184  } else {
185    copy(target_name) {
186      forward_variables_from(invoker,
187                             [
188                               "testonly",
189                               "visibility",
190                               "public_configs",
191                               "public_external_deps",
192                               "sources",
193                               "outputs",
194                             ])
195      deps = _deps
196
197      if (!_bypass_module_info_generation) {
198        _install_module_info = {
199          module_def = _target_label
200          module_info_file =
201              rebase_path(get_label_info(_target_label, "target_out_dir"),
202                          root_build_dir) +
203              "/${_main_target_name}_module_info.json"
204          subsystem_name = _subsystem_name
205          part_name = _part_name
206          toolchain = current_toolchain
207          toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
208        }
209
210        metadata = {
211          install_modules = [ _install_module_info ]
212        }
213      }
214    }
215  }
216}
217