• 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/ohos/config.gni")
16import("//build/config/security/security_config.gni")
17import("//build/ohos/notice/notice.gni")
18import("//build/ohos_var.gni")
19import("//build/templates/metadata/module_info.gni")
20
21default_opt_configs = [
22  "//build/config/compiler:default_symbols",
23  "//build/config/compiler:default_optimization",
24]
25
26debug_level_configs = [
27  "//build/config/compiler:symbols",
28  "//build/config/compiler:no_optimize",
29]
30
31template("ohos_executable") {
32  assert(!defined(invoker.output_dir),
33         "output_dir is not allowed to be defined.")
34
35  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
36    subsystem_name = invoker.subsystem_name
37    part_name = invoker.part_name
38  } else if (defined(invoker.part_name)) {
39    part_name = invoker.part_name
40    _part_subsystem_info_file =
41        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
42    _arguments = [
43      "--part-name",
44      part_name,
45      "--part-subsystem-info-file",
46      rebase_path(_part_subsystem_info_file, root_build_dir),
47    ]
48    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
49    subsystem_name =
50        exec_script(get_subsystem_script, _arguments, "trim string")
51  } else if (defined(invoker.subsystem_name)) {
52    subsystem_name = invoker.subsystem_name
53    part_name = subsystem_name
54  } else {
55    subsystem_name = "common"
56    part_name = subsystem_name
57  }
58  assert(subsystem_name != "")
59  assert(part_name != "")
60
61  if (check_deps) {
62    deps_data = {
63    }
64    module_label = get_label_info(":${target_name}", "label_with_toolchain")
65    module_deps = []
66    if (defined(invoker.deps)) {
67      foreach(dep, invoker.deps) {
68        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
69      }
70    }
71    module_ex_deps = []
72    if (defined(invoker.external_deps) && invoker.external_deps != []) {
73      module_ex_deps = invoker.external_deps
74    }
75    deps_data = {
76      part_name = part_name
77      module_label = module_label
78      deps = module_deps
79      external_deps = module_ex_deps
80    }
81
82    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
83               deps_data,
84               "json")
85  }
86
87  _ohos_test = false
88  if (defined(invoker.ohos_test) && invoker.ohos_test) {
89    output_dir = invoker.test_output_dir
90    _ohos_test = true
91  } else {
92    if (is_standard_system) {
93      output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
94    } else {
95      output_dir = "${root_out_dir}"
96    }
97  }
98
99  _security_config_target = "${target_name}__security_config"
100  ohos_security_config(_security_config_target) {
101    forward_variables_from(invoker,
102                           [
103                             "auto_var_init",
104                             "stack_protector_ret",
105                           ])
106  }
107
108  _sanitize_config_target = "${target_name}__sanitizer_config"
109  ohos_sanitizer_config(_sanitize_config_target) {
110    forward_variables_from(invoker, [ "sanitize" ])
111  }
112
113  _test_target = defined(invoker.testonly) && invoker.testonly
114  if (!_test_target) {
115    _main_target_name = target_name
116    _notice_target = "${_main_target_name}__notice"
117    collect_notice(_notice_target) {
118      forward_variables_from(invoker,
119                             [
120                               "testonly",
121                               "license_as_sources",
122                               "license_file",
123                             ])
124
125      module_name = _main_target_name
126      module_source_dir = get_label_info(":${_main_target_name}", "dir")
127    }
128  }
129  target_label = get_label_info(":${target_name}", "label_with_toolchain")
130  target_toolchain = get_label_info(target_label, "toolchain")
131  executable("${target_name}") {
132    forward_variables_from(invoker,
133                           "*",
134                           [
135                             "configs",
136                             "remove_configs",
137                             "static_link",
138                             "external_deps",
139                             "install_images",
140                             "module_install_dir",
141                             "relative_install_dir",
142                             "symlink_target_name",
143                             "output_dir",
144                             "install_enable",
145                             "version_script",
146                             "license_file",
147                             "license_as_sources",
148                             "use_exceptions",
149                             "use_rtti",
150
151                             # Sanitizer variables
152                             "sanitize",
153                           ])
154    output_dir = output_dir
155
156    if (defined(invoker.configs)) {
157      configs += invoker.configs
158    }
159    if (defined(invoker.remove_configs)) {
160      configs -= invoker.remove_configs
161    }
162    configs += [ ":$_sanitize_config_target" ]
163    configs += [ ":$_security_config_target" ]
164
165    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
166      configs += [ "//build/config/compiler:exceptions" ]
167      configs -= [ "//build/config/compiler:no_exceptions" ]
168    }
169
170    if (defined(invoker.use_rtti) && invoker.use_rtti) {
171      configs += [ "//build/config/compiler:rtti" ]
172      configs -= [ "//build/config/compiler:no_rtti" ]
173    }
174
175    if (!defined(deps)) {
176      deps = []
177    }
178    if (!defined(libs)) {
179      libs = []
180    }
181    if (!defined(include_dirs)) {
182      include_dirs = []
183    }
184    if (!defined(ldflags)) {
185      ldflags = []
186    }
187
188    if (defined(invoker.static_link) && invoker.static_link) {
189      no_default_deps = true
190      configs -= [ "//build/config:executable_config" ]
191      ldflags += [ "-static" ]
192      if (is_ohos && use_musl) {
193        import("//build/config/ohos/musl.gni")
194        deps += [ "//third_party/musl:soft_static_libs" ]
195      }
196    } else if (is_ohos) {
197      if (current_cpu == "arm") {
198        libs += [ "unwind" ]
199      }
200      libs += [ "c++" ]
201    }
202
203    if (!defined(output_name)) {
204      output_name = target_name
205    }
206
207    if (defined(invoker.version_script)) {
208      _version_script = rebase_path(invoker.version_script, root_build_dir)
209      if (!defined(ldflags)) {
210        ldflags = []
211      }
212      ldflags += [
213        "-rdynamic",
214        "-Wl,--version-script=${_version_script}",
215      ]
216    }
217
218    if (defined(invoker.external_deps)) {
219      external_deps_script =
220          rebase_path("//build/templates/common/external_deps_handler.py")
221      external_deps_temp_file =
222          "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json"
223      arguments = [ "--external-deps" ]
224      arguments += invoker.external_deps
225      arguments += [
226        "--parts-src-flag-file",
227        rebase_path(parts_src_flag_file, root_build_dir),
228        "--external-deps-temp-file",
229        rebase_path(external_deps_temp_file, root_build_dir),
230        "--sdk-base-dir",
231        rebase_path("${innersdk_base_dir}", root_build_dir),
232        "--sdk-dir-name",
233        "${innersdk_dir_name}",
234        "--current-toolchain",
235        current_toolchain,
236        "--innerkits-adapter-info-file",
237        rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir),
238      ]
239      if (is_use_sdk) {
240        arguments += [ "--use-sdk" ]
241      }
242      exec_script(external_deps_script, arguments)
243
244      external_deps_info = read_file(external_deps_temp_file, "json")
245      if (defined(external_deps_info.deps)) {
246        deps += external_deps_info.deps
247      }
248      if (defined(external_deps_info.libs)) {
249        libs += external_deps_info.libs
250      }
251      if (defined(external_deps_info.include_dirs)) {
252        include_dirs += external_deps_info.include_dirs
253      }
254    }
255
256    # We don't need to change config when "is_debug==true"
257    # "enable_debug_components" isn't blank means some components using debug level compilation
258    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
259      foreach(component_name, debug_components) {
260        if (part_name == component_name) {
261          configs -= default_opt_configs
262          configs += debug_level_configs
263        }
264      }
265    }
266    if (target_toolchain == "${current_toolchain}") {
267      install_module_info = {
268        module_def = target_label
269        part_name = part_name
270        module_info_file =
271            rebase_path(get_label_info(module_def, "target_out_dir"),
272                        root_build_dir) + "/${target_name}_module_info.json"
273        subsystem_name = subsystem_name
274        part_name = part_name
275        toolchain = current_toolchain
276        toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
277      }
278      metadata = {
279        install_modules = [ install_module_info ]
280      }
281    }
282    if (!_test_target) {
283      deps += [ ":$_notice_target" ]
284    }
285  }
286
287  if (skip_gen_module_info) {
288    not_needed(invoker, "*")
289    not_needed([ "_ohos_test" ])
290  } else if (!_ohos_test) {
291    ohos_module_name = target_name
292    generate_module_info("${ohos_module_name}_info") {
293      module_name = ohos_module_name
294      module_type = "bin"
295
296      module_source_dir = "$root_out_dir"
297      if (defined(output_dir)) {
298        module_source_dir = output_dir
299      }
300
301      module_install_name = ohos_module_name
302      if (defined(invoker.output_name)) {
303        module_install_name = invoker.output_name
304      }
305
306      module_install_images = [ "system" ]
307      if (defined(invoker.install_images)) {
308        module_install_images = []
309        module_install_images += invoker.install_images
310      }
311
312      module_output_extension = executable_extension
313      if (defined(invoker.output_extension)) {
314        module_output_extension = "." + invoker.output_extension
315      }
316
317      if (is_double_framework) {
318        install_enable = false
319      } else {
320        install_enable = true
321      }
322      if (defined(invoker.install_enable)) {
323        install_enable = invoker.install_enable
324      }
325
326      if (defined(invoker.module_install_dir)) {
327        module_install_dir = invoker.module_install_dir
328      }
329
330      if (defined(invoker.relative_install_dir)) {
331        relative_install_dir = invoker.relative_install_dir
332      }
333
334      if (defined(invoker.symlink_target_name)) {
335        symlink_target_name = invoker.symlink_target_name
336      }
337      notice = "$target_out_dir/$ohos_module_name.notice.txt"
338    }
339  }
340}
341
342# Defines a shared_library
343#
344# The shared_library template is used to generated so file.
345#
346# Parameters
347#
348#   subsystem_name (required)
349#   [string]
350#   configs (optional)
351#   [list]
352#   remove_cnofigs (optional)
353#   [list]
354#   version_script (optional)
355#   [string]
356template("ohos_shared_library") {
357  assert(!defined(invoker.output_dir),
358         "output_dir is not allowed to be defined.")
359
360  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
361    subsystem_name = invoker.subsystem_name
362    part_name = invoker.part_name
363  } else if (defined(invoker.part_name)) {
364    part_name = invoker.part_name
365    _part_subsystem_info_file =
366        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
367    _arguments = [
368      "--part-name",
369      part_name,
370      "--part-subsystem-info-file",
371      rebase_path(_part_subsystem_info_file, root_build_dir),
372    ]
373    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
374    subsystem_name =
375        exec_script(get_subsystem_script, _arguments, "trim string")
376  } else if (defined(invoker.subsystem_name)) {
377    subsystem_name = invoker.subsystem_name
378    part_name = subsystem_name
379  } else {
380    subsystem_name = "common"
381    part_name = subsystem_name
382  }
383  assert(subsystem_name != "")
384  assert(part_name != "")
385
386  if (check_deps) {
387    deps_data = {
388    }
389    module_label = get_label_info(":${target_name}", "label_with_toolchain")
390    module_deps = []
391    if (defined(invoker.deps)) {
392      foreach(dep, invoker.deps) {
393        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
394      }
395    }
396    module_ex_deps = []
397    if (defined(invoker.external_deps) && invoker.external_deps != []) {
398      module_ex_deps = invoker.external_deps
399    }
400    deps_data = {
401      part_name = part_name
402      module_label = module_label
403      deps = module_deps
404      external_deps = module_ex_deps
405    }
406    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
407               deps_data,
408               "json")
409  }
410
411  if (is_standard_system) {
412    output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
413  } else {
414    output_dir = "${root_out_dir}"
415  }
416
417  _security_config_target = "${target_name}__security_config"
418  ohos_security_config(_security_config_target) {
419    forward_variables_from(invoker,
420                           [
421                             "auto_var_init",
422                             "stack_protector_ret",
423                           ])
424  }
425
426  _sanitize_config_target = "${target_name}__sanitizer_config"
427  ohos_sanitizer_config(_sanitize_config_target) {
428    forward_variables_from(invoker, [ "sanitize" ])
429  }
430
431  _test_target = defined(invoker.testonly) && invoker.testonly
432  if (!_test_target) {
433    _notice_target = "${target_name}__notice"
434    _main_target_name = target_name
435    collect_notice(_notice_target) {
436      forward_variables_from(invoker,
437                             [
438                               "testonly",
439                               "license_as_sources",
440                               "license_file",
441                             ])
442
443      module_name = _main_target_name
444      module_source_dir = get_label_info(":${_main_target_name}", "dir")
445    }
446  }
447
448  target_label = get_label_info(":${target_name}", "label_with_toolchain")
449  target_toolchain = get_label_info(target_label, "toolchain")
450  shared_library("${target_name}") {
451    forward_variables_from(invoker,
452                           "*",
453                           [
454                             "configs",
455                             "remove_configs",
456                             "no_default_deps",
457                             "external_deps",
458                             "install_images",
459                             "module_install_dir",
460                             "relative_install_dir",
461                             "symlink_target_name",
462                             "output_dir",
463                             "install_enable",
464                             "version_script",
465                             "license_file",
466                             "license_as_sources",
467                             "use_exceptions",
468                             "use_rtti",
469                             "stl",
470
471                             # Sanitizer variables
472                             "sanitize",
473                           ])
474    output_dir = output_dir
475
476    if (!defined(inputs)) {
477      inputs = []
478    }
479
480    if (!defined(ldflags)) {
481      ldflags = []
482    }
483
484    if (defined(invoker.configs)) {
485      configs += invoker.configs
486    }
487    if (defined(invoker.remove_configs)) {
488      configs -= invoker.remove_configs
489    }
490
491    configs += [ ":$_sanitize_config_target" ]
492    configs += [ ":$_security_config_target" ]
493
494    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
495      configs += [ "//build/config/compiler:exceptions" ]
496      configs -= [ "//build/config/compiler:no_exceptions" ]
497    }
498
499    if (defined(invoker.use_rtti) && invoker.use_rtti) {
500      configs += [ "//build/config/compiler:rtti" ]
501      configs -= [ "//build/config/compiler:no_rtti" ]
502    }
503
504    if (!defined(output_name)) {
505      output_name = target_name
506    }
507
508    if (defined(invoker.no_default_deps)) {
509      no_default_deps = invoker.no_default_deps
510    }
511
512    if (defined(invoker.version_script)) {
513      _version_script = rebase_path(invoker.version_script, root_build_dir)
514      inputs += [ invoker.version_script ]
515      ldflags += [ "-Wl,--version-script=${_version_script}" ]
516    }
517
518    if (!defined(ldflags)) {
519      ldflags = []
520    }
521    if (!defined(libs)) {
522      libs = []
523    }
524    if (!defined(cflags_cc)) {
525      cflags_cc = []
526    }
527    if (!defined(deps)) {
528      deps = []
529    }
530    if (is_ohos) {
531      if (defined(invoker.stl)) {
532        cflags_cc += [
533          "-nostdinc++",
534          "-I" + rebase_path(
535                  "//prebuilts/clang/ohos/${host_platform_dir}/llvm_ndk/include/c++/v1",
536                  root_build_dir),
537        ]
538        ldflags += [
539          "-nostdlib++",
540          "-L" + rebase_path("${clang_stl_path}/${abi_target}/c++",
541                             root_build_dir),
542        ]
543
544        libs += [ invoker.stl ]
545      } else {
546        if (current_cpu == "arm") {
547          libs += [ "unwind" ]
548        }
549
550        libs += [ "c++" ]
551      }
552    }
553
554    if (!_test_target) {
555      deps += [ ":$_notice_target" ]
556    }
557    if (!defined(include_dirs)) {
558      include_dirs = []
559    }
560    if (defined(invoker.external_deps)) {
561      external_deps_script =
562          rebase_path("//build/templates/common/external_deps_handler.py")
563      external_deps_temp_file =
564          "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json"
565      arguments = [ "--external-deps" ]
566      arguments += invoker.external_deps
567      arguments += [
568        "--parts-src-flag-file",
569        rebase_path(parts_src_flag_file, root_build_dir),
570        "--external-deps-temp-file",
571        rebase_path(external_deps_temp_file, root_build_dir),
572        "--sdk-base-dir",
573        rebase_path("${innersdk_base_dir}", root_build_dir),
574        "--sdk-dir-name",
575        "${innersdk_dir_name}",
576        "--current-toolchain",
577        current_toolchain,
578        "--innerkits-adapter-info-file",
579        rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir),
580      ]
581      if (is_use_sdk) {
582        arguments += [ "--use-sdk" ]
583      }
584
585      exec_script(external_deps_script, arguments, "string")
586
587      external_deps_info = read_file(external_deps_temp_file, "json")
588      if (defined(external_deps_info.deps)) {
589        deps += external_deps_info.deps
590      }
591      if (defined(external_deps_info.libs)) {
592        libs += external_deps_info.libs
593      }
594      if (defined(external_deps_info.include_dirs)) {
595        include_dirs += external_deps_info.include_dirs
596      }
597    }
598
599    install_module_info = {
600      module_def = target_label
601      module_info_file =
602          rebase_path(get_label_info(module_def, "target_out_dir"),
603                      root_build_dir) + "/${target_name}_module_info.json"
604      subsystem_name = subsystem_name
605      part_name = part_name
606      toolchain = current_toolchain
607      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
608    }
609    metadata = {
610      install_modules = [ install_module_info ]
611    }
612    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
613      foreach(component_name, debug_components) {
614        if (part_name == component_name) {
615          configs -= default_opt_configs
616          configs += debug_level_configs
617        }
618      }
619    }
620
621    module_type_napi = false
622    if (defined(invoker.relative_install_dir) && product_name != "ohos-sdk") {
623      relative_paths = string_split(invoker.relative_install_dir, "/")
624      foreach(p, relative_paths) {
625        if (p == "module") {
626          module_type_napi = true
627        }
628      }
629      if (module_type_napi) {
630        napi_white_list = [
631          "fileio",
632          "downloadsingle",
633          "tel_call_manager_api",
634          "rpc",
635          "color_picker",
636          "accessibility",
637          "stationary",
638          "remote_file_share_native",
639          "window_animation",
640          "cryptoframework_napi",
641          "rdb",
642          "distributeddataobject_impl",
643          "medialibrary",
644          "image",
645          "featureability",
646          "medical",
647          "devicestatus",
648          "hiappevent",
649          "hiappevent_v9",
650          "quickfixmanager_napi",
651        ]
652        foreach(m, napi_white_list) {
653          if (m == target_name) {
654            module_type_napi = false
655          }
656        }
657      }
658    }
659    if (module_type_napi) {
660      if (!defined(invoker.version_script)) {
661        _version_script =
662            rebase_path("//build/templates/cxx/napi.versionscript")
663        inputs += [ _version_script ]
664        ldflags += [ "-Wl,--version-script=${_version_script}" ]
665      }
666    }
667  }
668  if (target_toolchain == "${current_toolchain}") {
669    ohos_module_name = target_name
670    generate_module_info("${ohos_module_name}_info") {
671      module_name = ohos_module_name
672      module_type = "lib"
673      module_source_dir = "$root_out_dir"
674      if (defined(output_dir)) {
675        module_source_dir = output_dir
676      }
677
678      module_install_name = ohos_module_name
679      if (defined(invoker.output_name)) {
680        module_install_name = invoker.output_name
681      }
682
683      module_install_images = [ "system" ]
684      if (defined(invoker.install_images)) {
685        module_install_images = []
686        module_install_images += invoker.install_images
687      }
688
689      module_output_extension = shlib_extension
690      if (defined(invoker.output_extension)) {
691        module_output_extension = "." + invoker.output_extension
692      }
693
694      install_enable = true
695      if (defined(invoker.install_enable)) {
696        install_enable = invoker.install_enable
697      }
698
699      if (defined(invoker.module_install_dir)) {
700        module_install_dir = invoker.module_install_dir
701      }
702
703      if (defined(invoker.relative_install_dir)) {
704        relative_install_dir = invoker.relative_install_dir
705      }
706
707      if (defined(invoker.symlink_target_name)) {
708        symlink_target_name = invoker.symlink_target_name
709      }
710
711      if (defined(invoker.output_prefix_override)) {
712        output_prefix_override = invoker.output_prefix_override
713      }
714      notice = "$target_out_dir/$ohos_module_name.notice.txt"
715    }
716  }
717}
718
719template("ohos_static_library") {
720  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
721    part_name = invoker.part_name
722  } else if (defined(invoker.part_name)) {
723    part_name = invoker.part_name
724  } else if (defined(invoker.subsystem_name)) {
725    part_name = invoker.subsystem_name
726  } else {
727    part_name = "common"
728  }
729  assert(part_name != "")
730
731  if (check_deps) {
732    deps_data = {
733    }
734    module_label = get_label_info(":${target_name}", "label_with_toolchain")
735    module_deps = []
736    if (defined(invoker.deps)) {
737      foreach(dep, invoker.deps) {
738        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
739      }
740    }
741    module_ex_deps = []
742    if (defined(invoker.external_deps) && invoker.external_deps != []) {
743      module_ex_deps = invoker.external_deps
744    }
745    deps_data = {
746      part_name = part_name
747      module_label = module_label
748      deps = module_deps
749      external_deps = module_ex_deps
750    }
751
752    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
753               deps_data,
754               "json")
755  }
756
757  _security_config_target = "${target_name}__security_config"
758  ohos_security_config(_security_config_target) {
759    forward_variables_from(invoker,
760                           [
761                             "auto_var_init",
762                             "stack_protector_ret",
763                           ])
764  }
765
766  _sanitize_config_target = "${target_name}__sanitizer_config"
767  ohos_sanitizer_config(_sanitize_config_target) {
768    forward_variables_from(invoker, [ "sanitize" ])
769  }
770
771  _test_target = defined(invoker.testonly) && invoker.testonly
772  if (!_test_target) {
773    _notice_target = "${target_name}__notice"
774    _main_target_name = target_name
775    collect_notice(_notice_target) {
776      forward_variables_from(invoker,
777                             [
778                               "testonly",
779                               "license_as_sources",
780                               "license_file",
781                             ])
782      module_type = "static_library"
783      module_name = _main_target_name
784      module_source_dir = get_label_info(":${_main_target_name}", "dir")
785    }
786  }
787
788  static_library(target_name) {
789    forward_variables_from(invoker,
790                           "*",
791                           [
792                             "configs",
793                             "remove_configs",
794                             "no_default_deps",
795                             "external_deps",
796                             "license_file",
797                             "license_as_sources",
798                             "use_exceptions",
799                             "use_rtti",
800                             "subsystem_name",
801
802                             # Sanitizer variables
803                             "sanitize",
804                           ])
805    if (defined(invoker.configs)) {
806      configs += invoker.configs
807    }
808    if (defined(invoker.remove_configs)) {
809      configs -= invoker.remove_configs
810    }
811    if (is_standard_system) {
812      configs -= [ "//build/config/compiler:thin_archive" ]
813    }
814    configs += [ ":$_sanitize_config_target" ]
815    configs += [ ":$_security_config_target" ]
816
817    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
818      configs += [ "//build/config/compiler:exceptions" ]
819      configs -= [ "//build/config/compiler:no_exceptions" ]
820    }
821
822    if (defined(invoker.use_rtti) && invoker.use_rtti) {
823      configs += [ "//build/config/compiler:rtti" ]
824      configs -= [ "//build/config/compiler:no_rtti" ]
825    }
826
827    if (defined(invoker.no_default_deps)) {
828      no_default_deps = invoker.no_default_deps
829    }
830
831    if (!defined(deps)) {
832      deps = []
833    }
834    if (!_test_target) {
835      deps += [ ":$_notice_target" ]
836    }
837    if (!defined(libs)) {
838      libs = []
839    }
840    if (!defined(include_dirs)) {
841      include_dirs = []
842    }
843    if (defined(invoker.external_deps)) {
844      external_deps_script =
845          rebase_path("//build/templates/common/external_deps_handler.py")
846      external_deps_temp_file =
847          "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json"
848      arguments = [ "--external-deps" ]
849      arguments += invoker.external_deps
850      arguments += [
851        "--parts-src-flag-file",
852        rebase_path(parts_src_flag_file, root_build_dir),
853        "--external-deps-temp-file",
854        rebase_path(external_deps_temp_file, root_build_dir),
855        "--sdk-base-dir",
856        rebase_path("${innersdk_base_dir}", root_build_dir),
857        "--sdk-dir-name",
858        "${innersdk_dir_name}",
859        "--current-toolchain",
860        current_toolchain,
861        "--innerkits-adapter-info-file",
862        rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir),
863      ]
864      if (is_use_sdk) {
865        arguments += [ "--use-sdk" ]
866      }
867
868      exec_script(external_deps_script, arguments)
869
870      external_deps_info = read_file(external_deps_temp_file, "json")
871      if (defined(external_deps_info.deps)) {
872        deps += external_deps_info.deps
873      }
874      if (defined(external_deps_info.libs)) {
875        libs += external_deps_info.libs
876      }
877      if (defined(external_deps_info.include_dirs)) {
878        include_dirs += external_deps_info.include_dirs
879      }
880    }
881    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
882      foreach(component_name, debug_components) {
883        if (part_name == component_name) {
884          configs -= default_opt_configs
885          configs += debug_level_configs
886        }
887      }
888    }
889  }
890}
891
892template("ohos_source_set") {
893  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
894    part_name = invoker.part_name
895  } else if (defined(invoker.part_name)) {
896    part_name = invoker.part_name
897  } else if (defined(invoker.subsystem_name)) {
898    part_name = invoker.subsystem_name
899  } else {
900    part_name = "common"
901  }
902  assert(part_name != "")
903
904  if (check_deps) {
905    deps_data = {
906    }
907    module_label = get_label_info(":${target_name}", "label_with_toolchain")
908    module_deps = []
909    if (defined(invoker.deps)) {
910      foreach(dep, invoker.deps) {
911        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
912      }
913    }
914    module_ex_deps = []
915    if (defined(invoker.external_deps) && invoker.external_deps != []) {
916      module_ex_deps = invoker.external_deps
917    }
918    deps_data = {
919      part_name = part_name
920      module_label = module_label
921      deps = module_deps
922      external_deps = module_ex_deps
923    }
924    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
925               deps_data,
926               "json")
927  }
928
929  _security_config_target = "${target_name}__security_config"
930  ohos_security_config(_security_config_target) {
931    forward_variables_from(invoker,
932                           [
933                             "auto_var_init",
934                             "stack_protector_ret",
935                           ])
936  }
937
938  _sanitize_config_target = "${target_name}__sanitizer_config"
939  ohos_sanitizer_config(_sanitize_config_target) {
940    forward_variables_from(invoker, [ "sanitize" ])
941  }
942
943  _test_target = defined(invoker.testonly) && invoker.testonly
944  if (!_test_target) {
945    _main_target_name = target_name
946    _notice_target = "${_main_target_name}__notice"
947    collect_notice(_notice_target) {
948      forward_variables_from(invoker,
949                             [
950                               "testonly",
951                               "license_as_sources",
952                               "license_file",
953                             ])
954
955      module_type = "source_set"
956      module_name = _main_target_name
957      module_source_dir = get_label_info(":${_main_target_name}", "dir")
958    }
959  }
960
961  source_set(target_name) {
962    forward_variables_from(invoker,
963                           "*",
964                           [
965                             "configs",
966                             "remove_configs",
967                             "no_default_deps",
968                             "external_deps",
969                             "license_file",
970                             "license_as_sources",
971                             "use_exceptions",
972                             "use_rtti",
973                             "subsystem_name",
974
975                             # Sanitizer variables
976                             "sanitize",
977                           ])
978    if (defined(invoker.configs)) {
979      configs += invoker.configs
980    }
981    if (defined(invoker.remove_configs)) {
982      configs -= invoker.remove_configs
983    }
984
985    configs += [ ":$_sanitize_config_target" ]
986    configs += [ ":$_security_config_target" ]
987
988    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
989      configs += [ "//build/config/compiler:exceptions" ]
990      configs -= [ "//build/config/compiler:no_exceptions" ]
991    }
992
993    if (defined(invoker.use_rtti) && invoker.use_rtti) {
994      configs += [ "//build/config/compiler:rtti" ]
995      configs -= [ "//build/config/compiler:no_rtti" ]
996    }
997
998    if (defined(invoker.no_default_deps)) {
999      no_default_deps = invoker.no_default_deps
1000    }
1001
1002    if (!defined(deps)) {
1003      deps = []
1004    }
1005
1006    if (!_test_target) {
1007      deps += [ ":$_notice_target" ]
1008    }
1009
1010    if (!defined(libs)) {
1011      libs = []
1012    }
1013    if (!defined(include_dirs)) {
1014      include_dirs = []
1015    }
1016    if (defined(invoker.external_deps)) {
1017      external_deps_script =
1018          rebase_path("//build/templates/common/external_deps_handler.py")
1019      external_deps_temp_file =
1020          "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json"
1021      arguments = [ "--external-deps" ]
1022      arguments += invoker.external_deps
1023      arguments += [
1024        "--parts-src-flag-file",
1025        rebase_path(parts_src_flag_file, root_build_dir),
1026        "--external-deps-temp-file",
1027        rebase_path(external_deps_temp_file, root_build_dir),
1028        "--sdk-base-dir",
1029        rebase_path("${innersdk_base_dir}", root_build_dir),
1030        "--sdk-dir-name",
1031        "${innersdk_dir_name}",
1032        "--current-toolchain",
1033        current_toolchain,
1034        "--innerkits-adapter-info-file",
1035        rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir),
1036      ]
1037      if (is_use_sdk) {
1038        arguments += [ "--use-sdk" ]
1039      }
1040
1041      exec_script(external_deps_script, arguments)
1042
1043      external_deps_info = read_file(external_deps_temp_file, "json")
1044      if (defined(external_deps_info.deps)) {
1045        deps += external_deps_info.deps
1046      }
1047      if (defined(external_deps_info.libs)) {
1048        libs += external_deps_info.libs
1049      }
1050      if (defined(external_deps_info.include_dirs)) {
1051        include_dirs += external_deps_info.include_dirs
1052      }
1053    }
1054    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
1055      foreach(component_name, debug_components) {
1056        if (part_name == component_name) {
1057          configs -= default_opt_configs
1058          configs += debug_level_configs
1059        }
1060      }
1061    }
1062  }
1063}
1064