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