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/python.gni") 15import("//build/ohos/build_var.gni") 16import("//build/ohos/notice/notice.gni") 17import("//build/version.gni") 18 19sdk_base_build_gn = "//build/ohos/sdk/BUILD.gn" 20generated_files_dir = get_path_info(sdk_base_build_gn, "gen_dir") 21generated_sdk_module_install_paths = 22 "${generated_files_dir}/ohos_sdk_install_paths.json" 23 24sdk_system_windows = "windows" 25sdk_system_linux = "linux" 26sdk_system_darwin = "darwin" 27sdk_system_ohos = "ohos" 28 29ohos_sdk_out_dir = "$product_output_dir/${product_name}" 30ohos_sdk_copy_dir = "$root_build_dir/${product_name}" 31 32declare_args() { 33 sdk_check_flag = true 34 sdk_for_hap_build = false 35} 36 37declare_args() { 38 enable_sign = false 39} 40 41sdk_toolchains = { 42 linux = "//build/toolchain/linux:clang_x64" 43 windows = "//build/toolchain/mingw:mingw_x86_64" 44 ohos = "//build/toolchain/ohos:ohos_clang_arm64" 45 46 if (host_cpu == "arm64") { 47 darwin = "//build/toolchain/mac:clang_arm64" 48 } else { 49 darwin = "//build/toolchain/mac:clang_x64" 50 } 51} 52 53if (host_cpu == "arm64") { 54 arch = "arm64" 55} else if (host_cpu == "riscv64") { 56 arch = "riscv64" 57} else { 58 arch = "x64" 59} 60 61if (sdk_platform == "default") { 62 if (host_os == "mac") { 63 sdk_systems = [ sdk_system_darwin ] 64 } else { 65 sdk_systems = [ 66 sdk_system_windows, 67 sdk_system_linux, 68 sdk_system_ohos, 69 ] 70 } 71} else if (sdk_platform == "mac") { 72 sdk_systems = [ sdk_system_darwin ] 73} else if (sdk_platform == "win") { 74 sdk_systems = [ sdk_system_windows ] 75} else if (sdk_platform == "linux") { 76 sdk_systems = [ sdk_system_linux ] 77} else if (sdk_platform == "ohos") { 78 sdk_systems = [ sdk_system_ohos ] 79} 80 81if (use_current_sdk) { 82 sdk_systems = [] 83 sdk_systems += [ sdk_system_linux ] 84} 85 86template("copy_and_archive") { 87 assert(defined(invoker.dest_dir)) 88 assert(defined(invoker.sdk_system)) 89 assert(defined(invoker.sdk_type)) 90 assert(defined(invoker.sdk_modules_desc_file)) 91 forward_variables_from(invoker, 92 [ 93 "testonly", 94 "sdk_class", 95 ]) 96 action_with_pydeps(target_name) { 97 deps = [] 98 if (defined(invoker.deps)) { 99 deps += invoker.deps 100 } 101 102 script = "//build/ohos/sdk/copy_sdk_modules.py" 103 depfile = "$target_gen_dir/$target_name.d" 104 105 _sdk_output_archive = 106 "$ohos_sdk_out_dir/${invoker.sdk_system}/${invoker.zipfile_name}" 107 _notice_output_archive = "${sdk_notice_archive_dir}/${invoker.sdk_system}-${invoker.sdk_type}.zip" 108 109 if (use_current_sdk) { 110 _sdk_output_archive = "$ohos_sdk_out_dir/${sdk_class}/${invoker.sdk_system}/${invoker.zipfile_name}" 111 _notice_output_archive = "${sdk_notice_archive_dir}/${sdk_class}/${invoker.sdk_system}-${invoker.sdk_type}.zip" 112 } 113 114 outputs = [ 115 _sdk_output_archive, 116 _notice_output_archive, 117 ] 118 119 args = [ 120 "--sdk-modules-desc-file", 121 rebase_path(invoker.sdk_modules_desc_file, root_build_dir), 122 "--dest-dir", 123 rebase_path(invoker.dest_dir, root_build_dir), 124 "--sdk-output-archive", 125 rebase_path(_sdk_output_archive, root_build_dir), 126 "--notice-output-archive", 127 rebase_path(_notice_output_archive, root_build_dir), 128 "--depfile", 129 rebase_path(depfile, root_build_dir), 130 "--archive-dir", 131 rebase_path("${invoker.dest_dir}/${invoker.sdk_type}", root_build_dir), 132 ] 133 134 archive_path_args = [ 135 "--sdk-archive-paths-file", 136 rebase_path(generated_sdk_module_install_paths, root_build_dir), 137 ] 138 139 if (use_current_sdk) { 140 archive_path_args = [] 141 archive_path_args += [ 142 "--sdk-archive-paths-file", 143 rebase_path( 144 "${generated_files_dir}/${sdk_class}/${sdk_class}_sdk_install_paths.json", 145 root_build_dir), 146 ] 147 } 148 149 args += archive_path_args 150 151 if (defined(invoker.zip_prefix_path)) { 152 args += [ 153 "--zip-prefix-path", 154 invoker.zip_prefix_path, 155 ] 156 } 157 158 if (use_current_sdk) { 159 enable_archive_sdk = false 160 } 161 162 if (enable_archive_sdk) { 163 args += [ "--enable-archive-sdk=${enable_archive_sdk}" ] 164 } 165 } 166} 167 168template("make_sdk_modules") { 169 assert(defined(invoker.zipfile_name)) 170 assert(defined(invoker.sdk_modules)) 171 assert(defined(invoker.sdk_toolchain)) 172 assert(defined(invoker.sdk_type)) 173 assert(defined(invoker.sdk_system)) 174 175 if (invoker.sdk_modules == []) { 176 not_needed(invoker, [ "sdk_toolchain" ]) 177 } 178 copy_and_archive(target_name) { 179 forward_variables_from(invoker, 180 [ 181 "testonly", 182 "sdk_system", 183 "sdk_type", 184 "zipfile_name", 185 "sdk_class", 186 ]) 187 _sdk_modules = [] 188 _sdk_module_infos = [] 189 190 foreach(_label, invoker.sdk_modules) { 191 _target_label = get_label_info(_label, "label_no_toolchain") 192 sources = [ _target_label ] 193 if (sources == []) { 194 _sdk_modules += [ _target_label ] 195 } else { 196 _sdk_modules += [ "${_target_label}(${invoker.sdk_toolchain})" ] 197 } 198 sources = [] 199 } 200 not_needed(invoker, [ "sdk_toolchain" ]) 201 202 foreach(_label, _sdk_modules) { 203 _module_info_file = get_label_info(_label, "target_out_dir") + "/" + 204 get_label_info(_label, "name") + "_module_info.json" 205 _sdk_module_infos += [ 206 { 207 label = get_label_info(_label, "label_no_toolchain") 208 module_info_file = rebase_path(_module_info_file, root_build_dir) 209 }, 210 ] 211 } 212 sdk_modules_desc_file = "${target_gen_dir}/${target_name}_sdk_modules.json" 213 write_file(sdk_modules_desc_file, _sdk_module_infos, "json") 214 215 deps = _sdk_modules 216 if (defined(invoker.deps)) { 217 deps += invoker.deps 218 } 219 220 dest_dir = "${ohos_sdk_copy_dir}/${sdk_system}" 221 if (use_current_sdk) { 222 dest_dir = "${root_build_dir}/${sdk_class}-current-sdk/${sdk_system}/${api_version}" 223 } 224 225 zip_prefix_path = "${invoker.sdk_type}" 226 } 227} 228 229template("make_linux_sdk_modules") { 230 make_sdk_modules(target_name) { 231 forward_variables_from(invoker, 232 [ 233 "testonly", 234 "zipfile_name", 235 "sdk_modules", 236 "sdk_type", 237 "sdk_class", 238 "deps", 239 ]) 240 sdk_toolchain = sdk_toolchains.linux 241 sdk_system = sdk_system_linux 242 } 243} 244 245template("make_windows_sdk_modules") { 246 make_sdk_modules(target_name) { 247 forward_variables_from(invoker, 248 [ 249 "testonly", 250 "zipfile_name", 251 "sdk_modules", 252 "sdk_type", 253 "sdk_class", 254 "deps", 255 ]) 256 sdk_toolchain = sdk_toolchains.windows 257 sdk_system = sdk_system_windows 258 } 259} 260 261template("make_darwin_sdk_modules") { 262 make_sdk_modules(target_name) { 263 forward_variables_from(invoker, 264 [ 265 "testonly", 266 "zipfile_name", 267 "sdk_modules", 268 "sdk_type", 269 "sdk_class", 270 "deps", 271 ]) 272 sdk_toolchain = sdk_toolchains.darwin 273 sdk_system = sdk_system_darwin 274 } 275} 276 277template("make_ohos_sdk_modules") { 278 make_sdk_modules(target_name) { 279 forward_variables_from(invoker, 280 [ 281 "testonly", 282 "zipfile_name", 283 "sdk_modules", 284 "sdk_type", 285 "deps", 286 ]) 287 sdk_toolchain = sdk_toolchains.ohos 288 sdk_system = sdk_system_ohos 289 } 290} 291 292template("current_sdk") { 293 # parse the sdk description file 294 forward_variables_from(invoker, 295 [ 296 "sdk_desc_file", 297 "sdk_class", 298 ]) 299 300 hap_build_sdk_description_file = "${generated_files_dir}/${sdk_class}/${sdk_class}_sdk_description_hap.json" 301 hap_build_sdk_config_parser = 302 "//build/ohos/sdk/generate_hap_build_sdk_config.py" 303 hap_build_sdk_args = [ 304 "--sdk-description-file", 305 rebase_path(sdk_desc_file, root_build_dir), 306 "--output-hap-build-sdk-desc-file", 307 rebase_path(hap_build_sdk_description_file, root_build_dir), 308 ] 309 exec_script(hap_build_sdk_config_parser, hap_build_sdk_args) 310 311 sdk_desc_file = hap_build_sdk_description_file 312 sdk_parse_script = "//build/ohos/sdk/parse_sdk_description.py" 313 314 gen_sdk_modules_gni = 315 "${generated_files_dir}/${sdk_class}/${sdk_class}_sdk_modules.gni" 316 gen_sdk_module_install_paths = 317 "${generated_files_dir}/${sdk_class}/${sdk_class}_sdk_install_paths.json" 318 gen_sdk_types_file = 319 "${generated_files_dir}/${sdk_class}/generated_sdk_types.txt" 320 321 parse_args = [ 322 "--sdk-description-file", 323 rebase_path(sdk_desc_file, root_build_dir), 324 "--sdk-modules-gni", 325 rebase_path(gen_sdk_modules_gni, root_build_dir), 326 "--sdk-install-info-file", 327 rebase_path(gen_sdk_module_install_paths, root_build_dir), 328 "--sdk-types-file", 329 rebase_path(gen_sdk_types_file, root_build_dir), 330 "--base-platform", 331 "phone", 332 "--variant-to-product", 333 rebase_path("//build/ohos/sdk/variant_to_product.json", root_build_dir), 334 "--source-root-dir", 335 rebase_path("//", root_build_dir), 336 "--node-js", 337 rebase_path(nodejs, root_build_dir), 338 ] 339 foreach(p, target_platform_list) { 340 parse_args += [ 341 "--platforms", 342 p, 343 ] 344 } 345 346 exec_script(sdk_parse_script, parse_args) 347 348 sdk_types = read_file(gen_sdk_types_file, "list lines") 349 350 generate_all_types_sdk_script = "//build/ohos/sdk/generate_all_types_sdk.py" 351 generated_build_gn = "${generated_files_dir}/${sdk_class}/BUILD.gn" 352 generate_args = [ 353 "--sdk-modules", 354 "ohos_sdk_modules", 355 "--output", 356 rebase_path(generated_build_gn, root_build_dir), 357 "--current-dir", 358 get_path_info(sdk_base_build_gn, "dir"), 359 "--generated-sdk-modules-gni", 360 gen_sdk_modules_gni, 361 "--type2displayname", 362 rebase_path("//build/ohos/sdk/type_to_display_name.json", root_build_dir), 363 "--api-version", 364 api_version, 365 "--release-type", 366 release_type, 367 "--meta-version", 368 meta_version, 369 "--sdk-class", 370 sdk_class, 371 ] 372 373 if (use_current_sdk) { 374 generate_args += [ "--use-current-sdk" ] 375 } 376 377 generate_args += [ 378 "--sdk-systems", 379 "linux", 380 ] 381 382 foreach(sdk_type, sdk_types) { 383 generate_args += [ 384 "--sdk-types", 385 sdk_type, 386 ] 387 } 388 389 exec_script(generate_all_types_sdk_script, generate_args) 390 391 group(target_name) { 392 deps = [] 393 deps += [ "${generated_files_dir}/${sdk_class}:generated_ohos_sdk" ] 394 } 395} 396