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