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