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