# Copyright 2013 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/clang/clang.gni") import("//build/config/ohos/config.gni") import("//build/rust/rustc_toolchain.gni") import("//build/toolchain/gcc_toolchain.gni") declare_args() { # Whether unstripped binaries, i.e. compiled with debug symbols, should be # considered runtime_deps rather than stripped ones. ohos_unstripped_runtime_outputs = true ohos_extra_cflags = "" ohos_extra_cppflags = "" ohos_extra_cxxflags = "" ohos_extra_asmflags = "" ohos_extra_ldflags = "" } # The ohos clang toolchains share most of the same parameters, so we have this # wrapper around gcc_toolchain to avoid duplication of logic. # # Parameters: # - toolchain_root # Path to cpu-specific toolchain within the ndk. # - sysroot # Sysroot for this architecture. # - lib_dir # Subdirectory inside of sysroot where libs go. # - binary_prefix # Prefix of compiler executables. template("ohos_clang_toolchain") { gcc_toolchain(target_name) { assert(defined(invoker.toolchain_args), "toolchain_args must be defined for ohos_clang_toolchain()") toolchain_args = invoker.toolchain_args toolchain_args.current_os = "ohos" # Output linker map files for binary size analysis. enable_linker_map = true ohos_libc_dir = rebase_path(invoker.sysroot + "/" + invoker.lib_dir, root_build_dir) libs_section_prefix = "${ohos_libc_dir}/Scrt1.o" libs_section_prefix += " ${ohos_libc_dir}/crti.o" libs_section_postfix = "${ohos_libc_dir}/crtn.o" if (invoker.target_name == "ohos_clang_arm") { abi_target = "arm-linux-ohos" } else if (invoker.target_name == "ohos_clang_arm64") { abi_target = "aarch64-linux-ohos" } else if (invoker.target_name == "ohos_clang_riscv64") { abi_target = "riscv64-linux-ohos" } else if (invoker.target_name == "ohos_clang_x86_64") { abi_target = "x86_64-linux-ohos" } if (is_legacy) { clang_rt_dir = rebase_path("${clang_lib_base_path}/${abi_target}/nanlegacy", root_build_dir) } else { clang_rt_dir = rebase_path("${clang_lib_base_path}/${abi_target}", root_build_dir) } solink_libs_section_prefix = "${ohos_libc_dir}/crti.o" solink_libs_section_prefix += " ${clang_rt_dir}/clang_rt.crtbegin.o" solink_libs_section_postfix = "${ohos_libc_dir}/crtn.o" solink_libs_section_postfix += " ${clang_rt_dir}/clang_rt.crtend.o" _prefix = rebase_path("${clang_base_path}/bin", root_build_dir) cc = "${_prefix}/clang" cxx = "${_prefix}/clang++" ar = "${_prefix}/llvm-ar" ld = cxx readelf = "${_prefix}/llvm-readobj" nm = "${_prefix}/llvm-nm" if (!is_debug) { strip = rebase_path("${clang_base_path}/bin/llvm-strip", root_build_dir) use_unstripped_as_runtime_outputs = ohos_unstripped_runtime_outputs } extra_cflags = ohos_extra_cflags extra_cppflags = ohos_extra_cppflags extra_cxxflags = ohos_extra_cxxflags extra_asmflags = ohos_extra_asmflags extra_ldflags = ohos_extra_ldflags # Don't use .cr.so for loadable_modules since they are always loaded via # absolute path. loadable_module_extension = ".so" rust_abi_target = invoker.rust_abi_target if (rust_abi_target == "armv7-linux-ohos") { cc_command_args = "--target=${rust_abi_target} -Clinker=$cxx -Clink-arg=-lunwind -Clink-arg=-fuse-ld=lld -Clink-arg=-v -Clink-arg=--target=${abi_target} -Clink-arg=--sysroot=$musl_path -C target-feature=-crt-static -L $musllib -L${clang_base_path}/lib/${abi_target}/c++" } else if (rust_abi_target == "aarch64-linux-ohos") { cc_command_args = "--target=${rust_abi_target} -Clinker=$cxx -Clink-arg=-lunwind -Clink-arg=-fuse-ld=lld -Clink-arg=-v -Clink-arg=--target=${abi_target} -Clink-arg=--sysroot=$musl_path -C target-feature=-crt-static -L $musllib -L${clang_base_path}/lib/${abi_target}/c++" } else if (rust_abi_target == "x86_64-unknown-linux-ohos") { cc_command_args = "--target=${rust_abi_target} -Clinker=$cxx -Clink-arg=-lunwind -Clink-arg=-fuse-ld=lld -Clink-arg=-v -Clink-arg=--target=${abi_target} -Clink-arg=--sysroot=$musl_path -C target-feature=-crt-static -L $musllib -L${clang_base_path}/lib/${abi_target}/c++" } else if (rust_abi_target == "x86_64-unknown-linux-gnu") { cc_command_args = "--target=${rust_abi_target} -Clinker=$cxx -Clink-arg=-fuse-ld=lld -Clink-arg=-v -Clink-arg=--target=${abi_target}" } else if (rust_abi_target == "riscv64-unknown-linux-ohos") { cc_command_args = "--target=${rust_abi_target} -Clinker=$cxx -Clink-arg=-lunwind -Clink-arg=-fuse-ld=lld -Clink-arg=-v -Clink-arg=--target=${abi_target} -Clink-arg=--sysroot=$musl_path -C target-feature=-crt-static -L $musllib -L${clang_base_path}/lib/${abi_target}/c++" } } }