1# Copyright (C) 2021 Huawei Device Co., Ltd.
2# Copyright (C) 2019 The Android Open Source Project
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15import("//build/config/clang/clang.gni")
16import("//build/ohos/ndk/ndk.gni")
17import("//third_party/musl/musl_config.gni")
18import("//third_party/musl/musl_src.gni")
19import("//third_party/musl/musl_template.gni")
20
21musl_target_out_dir = "${root_out_dir}/obj/third_party/musl"
22ndk_musl_include = "ndk_musl_include"
23interface_musl_dir = "//interface/sdk_c/third_party/musl"
24
25if (host_os == "mac") {
26  if (host_cpu == "arm64") {
27    toolchains_file_name = "darwin-arm64"
28    deps_name = "darwin_arm64"
29  } else {
30    toolchains_file_name = "darwin-x86_64"
31    deps_name = "darwin_x86_64"
32  }
33
34  darwin_system_toolchains_dir = "${toolchains_dir}/${toolchains_file_name}"
35  ohos_ndk_toolchains("${deps_name}") {
36    dest_dir = "$ndk_darwin_toolchains_out_dir"
37    sources = [
38      "${darwin_system_toolchains_dir}/llvm/NOTICE",
39      "${darwin_system_toolchains_dir}/llvm/bin",
40      "${darwin_system_toolchains_dir}/llvm/include",
41      "${darwin_system_toolchains_dir}/llvm/lib",
42      "${darwin_system_toolchains_dir}/llvm/libexec",
43      "${darwin_system_toolchains_dir}/llvm/python3",
44      "${darwin_system_toolchains_dir}/llvm/script",
45      "${darwin_system_toolchains_dir}/llvm/share",
46    ]
47    license_file = "${darwin_system_toolchains_dir}/llvm/NOTICE"
48  }
49
50  action("darwin_toolchain") {
51    outputs = [ "${ndk_darwin_toolchains_out_dir}" ]
52    script = "toolchain.sh"
53    args =
54        [ "-i" ] + [ rebase_path("${darwin_system_toolchains_dir}/libcxx-ndk") ]
55    args += [ "-o" ] + [ rebase_path("${ndk_darwin_toolchains_out_dir}") ]
56    args +=
57        [ "-l" ] + [ rebase_path("${darwin_system_toolchains_dir}/llvm/bin") ]
58    if (host_cpu == "arm64") {
59      deps = [ ":darwin_arm64" ]
60    } else {
61      deps = [ ":darwin_x86_64" ]
62    }
63  }
64} else {
65  windows_x86_64_toolchain_dir = "${toolchains_dir}/windows-x86_64"
66  ohos_arm64_toolchain_dir = "${toolchains_dir}/ohos-arm64"
67  if (host_cpu == "arm64") {
68    linux_aarch64_toolchains_dir = "${toolchains_dir}/linux-aarch64"
69    ohos_ndk_toolchains("linux_arm64") {
70      dest_dir = "$ndk_linux_toolchains_out_dir"
71      sources = [
72        "${linux_aarch64_toolchains_dir}/llvm/NOTICE",
73        "${linux_aarch64_toolchains_dir}/llvm/bin",
74        "${linux_aarch64_toolchains_dir}/llvm/include",
75        "${linux_aarch64_toolchains_dir}/llvm/lib",
76        "${linux_aarch64_toolchains_dir}/llvm/libexec",
77        "${linux_aarch64_toolchains_dir}/llvm/python3",
78        "${linux_aarch64_toolchains_dir}/llvm/script",
79        "${linux_aarch64_toolchains_dir}/llvm/share",
80      ]
81      license_file = "${linux_aarch64_toolchains_dir}/llvm/NOTICE"
82    }
83  } else {
84    linux_x86_64_toolchains_dir = "${toolchains_dir}/linux-x86_64"
85    ohos_ndk_toolchains("linux_x86_64") {
86      dest_dir = "$ndk_linux_toolchains_out_dir"
87      sources = [
88        "${linux_x86_64_toolchains_dir}/llvm/NOTICE",
89        "${linux_x86_64_toolchains_dir}/llvm/bin",
90        "${linux_x86_64_toolchains_dir}/llvm/include",
91        "${linux_x86_64_toolchains_dir}/llvm/lib",
92        "${linux_x86_64_toolchains_dir}/llvm/libexec",
93        "${linux_x86_64_toolchains_dir}/llvm/python3",
94        "${linux_x86_64_toolchains_dir}/llvm/script",
95        "${linux_x86_64_toolchains_dir}/llvm/share",
96      ]
97      license_file = "${linux_x86_64_toolchains_dir}/llvm/NOTICE"
98    }
99  }
100
101  ohos_ndk_toolchains("windows_x86_64") {
102    dest_dir = "$ndk_windows_toolchains_out_dir"
103    sources = [
104      "${windows_x86_64_toolchain_dir}/llvm/NOTICE",
105      "${windows_x86_64_toolchain_dir}/llvm/bin",
106      "${windows_x86_64_toolchain_dir}/llvm/include",
107      "${windows_x86_64_toolchain_dir}/llvm/lib",
108      "${windows_x86_64_toolchain_dir}/llvm/libexec",
109      "${windows_x86_64_toolchain_dir}/llvm/script",
110      "${windows_x86_64_toolchain_dir}/llvm/share",
111    ]
112    args = [ "--follow-all-symlinks" ]
113    license_file = "${windows_x86_64_toolchain_dir}/llvm/NOTICE"
114  }
115
116  ohos_ndk_toolchains("ohos_arm64") {
117    dest_dir = "$ndk_ohos_toolchains_out_dir"
118    sources = [
119      "${ohos_arm64_toolchain_dir}/llvm/bin",
120      "${ohos_arm64_toolchain_dir}/llvm/include",
121      "${ohos_arm64_toolchain_dir}/llvm/lib",
122      "${ohos_arm64_toolchain_dir}/llvm/libexec",
123      "${ohos_arm64_toolchain_dir}/llvm/python3",
124      "${ohos_arm64_toolchain_dir}/llvm/share",
125    ]
126  }
127
128  action("linux_toolchain") {
129    outputs = [ "${ndk_linux_toolchains_out_dir}" ]
130    script = "toolchain.sh"
131    if (host_cpu == "arm64") {
132      args = [ "-i" ] +
133             [ rebase_path("${linux_aarch64_toolchains_dir}/libcxx-ndk") ]
134    } else {
135      args = [ "-i" ] +
136             [ rebase_path("${linux_x86_64_toolchains_dir}/libcxx-ndk") ]
137    }
138    args += [ "-o" ] + [ rebase_path("${ndk_linux_toolchains_out_dir}") ]
139    if (host_cpu == "arm64") {
140      args +=
141          [ "-l" ] + [ rebase_path("${linux_aarch64_toolchains_dir}/llvm/bin") ]
142    } else {
143      args +=
144          [ "-l" ] + [ rebase_path("${linux_x86_64_toolchains_dir}/llvm/bin") ]
145    }
146    if (host_cpu == "arm64") {
147      deps = [ ":linux_arm64" ]
148    } else {
149      deps = [ ":linux_x86_64" ]
150    }
151  }
152
153  action("windows_toolchain") {
154    outputs = [ "${ndk_windows_toolchains_out_dir}" ]
155    script = "toolchain.sh"
156    args =
157        [ "-i" ] + [ rebase_path("${windows_x86_64_toolchain_dir}/libcxx-ndk") ]
158    args += [ "-o" ] + [ rebase_path("${ndk_windows_toolchains_out_dir}") ]
159
160    if (host_cpu == "arm64") {
161      args +=
162          [ "-l" ] + [ rebase_path("${linux_aarch64_toolchains_dir}/llvm/bin") ]
163    } else {
164      args +=
165          [ "-l" ] + [ rebase_path("${linux_x86_64_toolchains_dir}/llvm/bin") ]
166    }
167    deps = [ ":windows_x86_64" ]
168  }
169
170  action("ohos_toolchain") {
171    outputs = [ "${ndk_ohos_toolchains_out_dir}" ]
172    script = "toolchain.sh"
173    args = [ "-i" ] + [ rebase_path("${ohos_arm64_toolchain_dir}/libcxx-ndk") ]
174    args += [ "-o" ] + [ rebase_path("${ndk_ohos_toolchains_out_dir}") ]
175    if (host_cpu == "arm64") {
176      args +=
177          [ "-l" ] + [ rebase_path("${linux_aarch64_toolchains_dir}/llvm/bin") ]
178    } else {
179      args +=
180          [ "-l" ] + [ rebase_path("${linux_x86_64_toolchains_dir}/llvm/bin") ]
181    }
182    deps = [ ":ohos_arm64" ]
183  }
184}
185
186group("ndk_toolchain") {
187  if (host_os == "mac") {
188    deps = [ ":darwin_toolchain" ]
189  } else {
190    deps = [
191      ":linux_toolchain",
192      ":ohos_toolchain",
193      ":windows_toolchain",
194    ]
195  }
196}
197
198group("musl_sysroot") {
199  deps = [
200    ":copy_musl_sysroot",
201    ":musl_arm_bits_arm32",
202    ":musl_arm_uapi_arm32",
203    ":musl_bits_aarch64",
204    ":musl_bits_x86_64",
205  ]
206}
207
208action("copy_ndk_uapi") {
209  outputs = [ "${musl_target_out_dir}/${ndk_musl_include}/linux" ]
210  script = "${musl_dir}/scripts/copy_uapi.sh"
211  args = [ "-i" ] + [ rebase_path("${musl_uapi_dir}") ]
212  args +=
213      [ "-o" ] + [ rebase_path("${musl_target_out_dir}/${ndk_musl_include}") ]
214  args += [ "-t" ] + [ "${musl_arch}" ]
215}
216
217action("copy_ndk_musl_headers") {
218  outputs = [ "${musl_target_out_dir}/${ndk_musl_include}" ]
219  script = "copy_ndk_musl_headers.sh"
220  args = [ "-i" ] + [ rebase_path("${interface_musl_dir}/${ndk_musl_include}") ]
221  args +=
222      [ "-o" ] + [ rebase_path("${musl_target_out_dir}/${ndk_musl_include}") ]
223  deps = [ ":copy_ndk_uapi" ]
224}
225
226action("copy_musl_sysroot") {
227  outputs = [ "${ndk_headers_out_dir}" ]
228  script = "copy_musl_sysroot.sh"
229  args =
230      [ "-i" ] + [ rebase_path("${musl_target_out_dir}/${ndk_musl_include}") ]
231  args += [ "-o" ] + [ rebase_path("${ndk_headers_out_dir}") ]
232  args += [ "-t" ] + [ "${musl_arch}" ]
233  deps = [ ":copy_ndk_musl_headers" ]
234}
235
236musl_libs_arm32 = [
237  "//third_party/musl:create_alltypes_h(//build/toolchain/ohos:ohos_clang_arm)",
238  "//third_party/musl:create_syscall_h(//build/toolchain/ohos:ohos_clang_arm)",
239  "//third_party/musl:musl_copy_inc_bits(//build/toolchain/ohos:ohos_clang_arm)",
240]
241
242musl_libs_aarch64 = [
243  "//third_party/musl:create_alltypes_h(//build/toolchain/ohos:ohos_clang_arm64)",
244  "//third_party/musl:create_syscall_h(//build/toolchain/ohos:ohos_clang_arm64)",
245  "//third_party/musl:musl_copy_inc_bits(//build/toolchain/ohos:ohos_clang_arm64)",
246]
247
248musl_libs_x86_64 = [
249  "//third_party/musl:create_alltypes_h(//build/toolchain/ohos:ohos_clang_x86_64)",
250  "//third_party/musl:create_syscall_h(//build/toolchain/ohos:ohos_clang_x86_64)",
251  "//third_party/musl:musl_copy_inc_bits(//build/toolchain/ohos:ohos_clang_x86_64)",
252]
253
254musl_lib_arm32 = [
255  "//third_party/musl:soft_musl_crt_install_action(//build/toolchain/ohos:ohos_clang_arm)",
256  "//third_party/musl:soft_libc_musl_static(//build/toolchain/ohos:ohos_clang_arm)",
257  "//third_party/musl:soft_libm(//build/toolchain/ohos:ohos_clang_arm)",
258  "//third_party/musl:soft_libdl(//build/toolchain/ohos:ohos_clang_arm)",
259  "//third_party/musl:soft_libpthread(//build/toolchain/ohos:ohos_clang_arm)",
260  "//third_party/musl:soft_libcrypt(//build/toolchain/ohos:ohos_clang_arm)",
261  "//third_party/musl:soft_libutil(//build/toolchain/ohos:ohos_clang_arm)",
262  "//third_party/musl:soft_libxnet(//build/toolchain/ohos:ohos_clang_arm)",
263  "//third_party/musl:soft_libresolv(//build/toolchain/ohos:ohos_clang_arm)",
264  "//third_party/musl:soft_librt(//build/toolchain/ohos:ohos_clang_arm)",
265]
266
267musl_lib_arm64 = [
268  "//third_party/musl:soft_musl_crt_install_action(//build/toolchain/ohos:ohos_clang_arm64)",
269  "//third_party/musl:soft_libc_musl_static(//build/toolchain/ohos:ohos_clang_arm64)",
270  "//third_party/musl:soft_libm(//build/toolchain/ohos:ohos_clang_arm64)",
271  "//third_party/musl:soft_libdl(//build/toolchain/ohos:ohos_clang_arm64)",
272  "//third_party/musl:soft_libpthread(//build/toolchain/ohos:ohos_clang_arm64)",
273  "//third_party/musl:soft_libcrypt(//build/toolchain/ohos:ohos_clang_arm64)",
274  "//third_party/musl:soft_libutil(//build/toolchain/ohos:ohos_clang_arm64)",
275  "//third_party/musl:soft_libxnet(//build/toolchain/ohos:ohos_clang_arm64)",
276  "//third_party/musl:soft_libresolv(//build/toolchain/ohos:ohos_clang_arm64)",
277  "//third_party/musl:soft_librt(//build/toolchain/ohos:ohos_clang_arm64)",
278]
279
280musl_lib_x86_64 = [
281  "//third_party/musl:soft_musl_crt_install_action(//build/toolchain/ohos:ohos_clang_x86_64)",
282  "//third_party/musl:soft_libc_musl_static(//build/toolchain/ohos:ohos_clang_x86_64)",
283  "//third_party/musl:soft_libm(//build/toolchain/ohos:ohos_clang_x86_64)",
284  "//third_party/musl:soft_libdl(//build/toolchain/ohos:ohos_clang_x86_64)",
285  "//third_party/musl:soft_libpthread(//build/toolchain/ohos:ohos_clang_x86_64)",
286  "//third_party/musl:soft_libcrypt(//build/toolchain/ohos:ohos_clang_x86_64)",
287  "//third_party/musl:soft_libutil(//build/toolchain/ohos:ohos_clang_x86_64)",
288  "//third_party/musl:soft_libxnet(//build/toolchain/ohos:ohos_clang_x86_64)",
289  "//third_party/musl:soft_libresolv(//build/toolchain/ohos:ohos_clang_x86_64)",
290  "//third_party/musl:soft_librt(//build/toolchain/ohos:ohos_clang_x86_64)",
291]
292
293## arm-linux-ohos asm directory
294ohos_ndk_copy("musl_arm_uapi_arm32") {
295  dest_dir = "$ndk_os_irrelevant_out_dir/sysroot/usr/include/arm-linux-ohos"
296
297  sources =
298      [ "//kernel/linux/patches/linux-5.10/prebuilts/usr/include/asm-arm/asm" ]
299  args = [ "--ignore-stale" ]
300}
301
302## arm-linux-ohos bits directory
303ohos_copy("musl_arm_bits_arm32") {
304  deps = musl_libs_arm32
305  sources = []
306  sources_temp = [
307    "alltypes.h",
308    "syscall.h",
309  ]
310  sources_temp += musl_inc_bits_files
311  sources_orig = get_path_info(sources_temp, "file")
312
313  # print("${sources_orig}")
314
315  foreach(s, sources_orig) {
316    sources += [ get_label_info(deps[0], "target_out_dir") +
317                 "/usr/include/arm-linux-ohos/bits/${s}" ]
318  }
319  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/include/arm-linux-ohos/bits/{{source_file_part}}" ]
320}
321
322## aarch64-linux-ohos bits directory
323ohos_copy("musl_bits_aarch64") {
324  deps = musl_libs_aarch64
325  sources = []
326  sources_temp = [
327    "alltypes.h",
328    "syscall.h",
329  ]
330  sources_temp += musl_inc_bits_files
331  sources_orig = get_path_info(sources_temp, "file")
332
333  # print("${sources_orig}")
334
335  foreach(s, sources_orig) {
336    sources += [ get_label_info(deps[0], "target_out_dir") +
337                 "/usr/include/aarch64-linux-ohos/bits/${s}" ]
338  }
339  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/include/aarch64-linux-ohos/bits/{{source_file_part}}" ]
340}
341
342## x86_64-linux-ohos bits directory
343ohos_copy("musl_bits_x86_64") {
344  deps = musl_libs_x86_64
345  sources = []
346  sources_temp = [
347    "alltypes.h",
348    "syscall.h",
349  ]
350  sources_temp += musl_inc_bits_files
351  sources_orig = get_path_info(sources_temp, "file")
352
353  # print("${sources_orig}")
354
355  foreach(s, sources_orig) {
356    sources += [ get_label_info(deps[0], "target_out_dir") +
357                 "/usr/include/x86_64-linux-ohos/bits/${s}" ]
358  }
359  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/include/x86_64-linux-ohos/bits/{{source_file_part}}" ]
360}
361
362ohos_copy("musl_ndk_libs_arm32") {
363  deps = musl_lib_arm32
364  crt_dir = "${root_build_dir}/obj/third_party/musl/usr/lib/arm-linux-ohos"
365  sources = [
366    "${crt_dir}/Scrt1.o",
367    "${crt_dir}/crt1.o",
368    "${crt_dir}/crti.o",
369    "${crt_dir}/crtn.o",
370    "${crt_dir}/rcrt1.o",
371  ]
372  sources += [ get_label_info(deps[0], "target_out_dir") +
373               "/usr/lib/arm-linux-ohos/libm.a" ]
374  sources += [ get_label_info(deps[0], "target_out_dir") +
375               "/usr/lib/arm-linux-ohos/libdl.a" ]
376  sources += [ get_label_info(deps[0], "target_out_dir") +
377               "/usr/lib/arm-linux-ohos/libc.a" ]
378  sources += [ get_label_info(deps[0], "target_out_dir") +
379               "/usr/lib/arm-linux-ohos/libcrypt.a" ]
380  sources += [ get_label_info(deps[0], "target_out_dir") +
381               "/usr/lib/arm-linux-ohos/libpthread.a" ]
382  sources += [ get_label_info(deps[0], "target_out_dir") +
383               "/usr/lib/arm-linux-ohos/libresolv.a" ]
384  sources += [ get_label_info(deps[0], "target_out_dir") +
385               "/usr/lib/arm-linux-ohos/librt.a" ]
386  sources += [ get_label_info(deps[0], "target_out_dir") +
387               "/usr/lib/arm-linux-ohos/libutil.a" ]
388  sources += [ get_label_info(deps[0], "target_out_dir") +
389               "/usr/lib/arm-linux-ohos/libxnet.a" ]
390
391  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/lib/arm-linux-ohos/{{source_file_part}}" ]
392}
393
394ohos_copy("musl_ndk_libs_aarch64") {
395  deps = musl_lib_arm64
396  sources = [ get_label_info(deps[0], "target_out_dir") +
397              "/usr/lib/aarch64-linux-ohos/Scrt1.o" ]
398  sources += [ get_label_info(deps[0], "target_out_dir") +
399               "/usr/lib/aarch64-linux-ohos/crt1.o" ]
400  sources += [ get_label_info(deps[0], "target_out_dir") +
401               "/usr/lib/aarch64-linux-ohos/crti.o" ]
402  sources += [ get_label_info(deps[0], "target_out_dir") +
403               "/usr/lib/aarch64-linux-ohos/crtn.o" ]
404  sources += [ get_label_info(deps[0], "target_out_dir") +
405               "/usr/lib/aarch64-linux-ohos/rcrt1.o" ]
406  sources += [ get_label_info(deps[0], "target_out_dir") +
407               "/usr/lib/aarch64-linux-ohos/libc.a" ]
408  sources += [ get_label_info(deps[0], "target_out_dir") +
409               "/usr/lib/aarch64-linux-ohos/libdl.a" ]
410  sources += [ get_label_info(deps[0], "target_out_dir") +
411               "/usr/lib/aarch64-linux-ohos/libm.a" ]
412  sources += [ get_label_info(deps[0], "target_out_dir") +
413               "/usr/lib/aarch64-linux-ohos/libcrypt.a" ]
414  sources += [ get_label_info(deps[0], "target_out_dir") +
415               "/usr/lib/aarch64-linux-ohos/libpthread.a" ]
416  sources += [ get_label_info(deps[0], "target_out_dir") +
417               "/usr/lib/aarch64-linux-ohos/libresolv.a" ]
418  sources += [ get_label_info(deps[0], "target_out_dir") +
419               "/usr/lib/aarch64-linux-ohos/librt.a" ]
420  sources += [ get_label_info(deps[0], "target_out_dir") +
421               "/usr/lib/aarch64-linux-ohos/libutil.a" ]
422  sources += [ get_label_info(deps[0], "target_out_dir") +
423               "/usr/lib/aarch64-linux-ohos/libxnet.a" ]
424
425  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/lib/aarch64-linux-ohos/{{source_file_part}}" ]
426}
427
428ohos_copy("musl_ndk_libs_x86_64") {
429  deps = musl_lib_x86_64
430  crt_dir = "${root_build_dir}/obj/third_party/musl/usr/lib/x86_64-linux-ohos"
431  sources = [
432    "${crt_dir}/Scrt1.o",
433    "${crt_dir}/crt1.o",
434    "${crt_dir}/crti.o",
435    "${crt_dir}/crtn.o",
436    "${crt_dir}/rcrt1.o",
437  ]
438  sources += [ get_label_info(deps[0], "target_out_dir") +
439               "/usr/lib/x86_64-linux-ohos/libc.a" ]
440  sources += [ get_label_info(deps[0], "target_out_dir") +
441               "/usr/lib/x86_64-linux-ohos/libdl.a" ]
442  sources += [ get_label_info(deps[0], "target_out_dir") +
443               "/usr/lib/x86_64-linux-ohos/libm.a" ]
444  sources += [ get_label_info(deps[0], "target_out_dir") +
445               "/usr/lib/x86_64-linux-ohos/libcrypt.a" ]
446  sources += [ get_label_info(deps[0], "target_out_dir") +
447               "/usr/lib/x86_64-linux-ohos/libpthread.a" ]
448  sources += [ get_label_info(deps[0], "target_out_dir") +
449               "/usr/lib/x86_64-linux-ohos/libresolv.a" ]
450  sources += [ get_label_info(deps[0], "target_out_dir") +
451               "/usr/lib/x86_64-linux-ohos/librt.a" ]
452  sources += [ get_label_info(deps[0], "target_out_dir") +
453               "/usr/lib/x86_64-linux-ohos/libutil.a" ]
454  sources += [ get_label_info(deps[0], "target_out_dir") +
455               "/usr/lib/x86_64-linux-ohos/libxnet.a" ]
456
457  outputs = [ "$ndk_os_irrelevant_out_dir/sysroot/usr/lib/x86_64-linux-ohos/{{source_file_part}}" ]
458}
459
460ohos_ndk_copy("copy_compatible_config") {
461  dest_dir = "$ndk_os_irrelevant_out_dir"
462  sources =
463      [ "//interface/sdk_c/third_party/musl/ndk_script/compatible_config.json" ]
464  args = [ "--ignore-stale" ]
465}
466