blob: 2197384d068edccd11f4b72e6fbe026731451bc9 [file] [log] [blame]
# Copyright 2016 The Fuchsia 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/board.gni")
import("//build/config/build_id.gni")
import("//build/config/clang/clang.gni")
import("//build/config/current_target_tuple.gni")
import("//build/config/fuchsia/target_api_level.gni")
import("//build/config/sanitizers/sanitizer_default_options.gni")
import("//build/config/sysroot.gni")
import("//build/icu/third_party_icu_headers.gni")
import("//build/toolchain/ccache.gni")
import("//build/toolchain/rbe.gni")
import("//src/lib/icu/third_party_icu_headers.gni")
if (support_rust) {
import("//build/rust/config.gni")
import("//zircon/public/sysroot/rust.gni")
}
# ccache, at least in some configurations, caches preprocessed content. This
# means that by the time the compiler sees it, macros are unrolled. A number
# of gcc and clang diagnostics are conditioned on whether the source is part
# of a macro or not. This is because a "reasonable" looking macro invocation
# may end up doing something silly internally. This can mean self assignment
# and tautological comparisons, since macros are not typed. Macros also tend
# to over-parenthesize, and so on. This particular list of options was found
# via trial and error, and might be the best way of keeping the build quiet.
config("ccache") {
cflags = [
"-Wno-error",
"-Qunused-arguments",
"-Wno-parentheses-equality",
"-Wno-self-assign",
"-Wno-tautological-compare",
"-Wno-unused-command-line-argument",
]
asmflags = cflags
}
config("compiler") {
configs = [
":compiler_sysroot",
":compiler_target",
":compiler_fuchsia_api_level",
]
if (board_configs != []) {
configs += board_configs
} else {
configs += [ "//build/config:cpu_baseline" ]
}
if (use_ccache) {
configs += [ ":ccache" ]
}
ldflags = []
if (build_id_format != "") {
ldflags += [ "-Wl,--build-id=$build_id_format" ]
}
if (support_rust) {
if (!is_debug) {
# https://fxbug.dev/42166874#c15: forcing one codegen unit produces
# smaller binaries but makes builds slower.
# Enforce one codegen unit only when we really care about
# size (release builds).
configs += [ "//build/config/rust:one_codegen_unit" ]
}
# TODO(phosek): this is inefficient, rather this should come from a JSON file.
# Relative path makes command-lines remote-portable.
_clang_resource_dir =
rebase_path(exec_script("$clang_prefix/clang",
[
"--target=$current_target_tuple",
"-print-resource-dir",
],
"trim string",
[]),
root_build_dir)
# When linking C++ runtime libraries into Rust binaries, we should use
# the correct multilib variant.
#
# TODO(https://fxbug.dev/42177702): Rather then hardcoding the directory names here,
# these should ideally come from runtime.json.
_multilib_dir = ""
if (toolchain_variant.tags + [ "asan" ] - [ "asan" ] !=
toolchain_variant.tags) {
_multilib_dir = "/asan+noexcept"
} else if (toolchain_variant.tags + [ "hwasan" ] - [ "hwasan" ] !=
toolchain_variant.tags) {
_multilib_dir = "/hwasan+noexcept"
} else {
_multilib_dir = "/noexcept"
}
# Which libc++ to link:
_libcxx_dir =
"${rebased_clang_prefix}/../lib/${current_target_tuple}${_multilib_dir}"
rustflags = [
"-L",
rebase_path(rust_sysroot_dir, root_build_dir) + "/lib",
"-Clinker=$rebased_clang_prefix/lld",
"-Clink-arg=--sysroot=" + rebase_path(rust_sysroot_dir, root_build_dir),
# These could alternatively come from clang's '--print-search-dirs', but that would require an
# exec_script and post-processing of the output or a JSON file generated during the toolchain
# build.
"-Clink-arg=-L${_libcxx_dir}",
"-Clink-arg=-L${_clang_resource_dir}/lib/${current_target_tuple}",
"-Clink-arg=--pack-dyn-relocs=relr",
"-Clink-arg=-dynamic-linker=ld.so.1",
"-Clink-arg=--icf=all",
]
if (rust_rbe_enable) {
rustflags += [ "--remote-flag=--cxx-stdlibdir=${_libcxx_dir}" ]
}
# TODO(https://fxbug.dev/42130451): Eventually the default in the compler driver.
rustflags += [ "-Clink-arg=-zrel" ]
}
}
config("compiler_sysroot") {
if (defined(sysroot) && sysroot != "") {
cflags = [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ]
asmflags = cflags
ldflags = cflags
}
}
config("compiler_target") {
cflags = [ "--target=$current_target_tuple" ]
asmflags = cflags
ldflags = cflags
}
config("compiler_fuchsia_api_level") {
if (is_gcc || !is_fuchsia) {
defines = [ "__Fuchsia_API_level__=${clang_fuchsia_api_level}" ]
} else {
cflags = [ "-ffuchsia-api-level=${clang_fuchsia_api_level}" ]
asmflags = cflags
ldflags = cflags
}
}
config("shared_library_config") {
cflags = [ "-fPIC" ]
# Ensure assembly code can use `#ifdef __PIC__`
asmflags = cflags
ldflags = cflags
}
config("fdio_config") {
# This config is only a marker that is used to signal that a given executable
# should link with fdio. With fdio now getting built in this very build, there
# need to be a proper dependency.
# See the override of the `executable` template in
# //build/config/BUILDCONFIG.gni where that build edge is added.
}
config("executable_config") {
}
config("enable_zircon_asserts") {
defines = [ "ZX_ASSERT_LEVEL=2" ]
}
declare_args() {
zircon_asserts = is_debug
}
config("zircon_asserts") {
if (zircon_asserts) {
configs = [ ":enable_zircon_asserts" ]
}
}
config("no_cpp_standard_library") {
ldflags = [ "-nostdlib++" ]
}
config("static_cpp_standard_library") {
ldflags = [
# Use libc++ as the C++ standard library.
"-stdlib=libc++",
# Use libunwind as the unwinder.
"-unwindlib=libunwind",
# Request static linking for standard C++ library. Despite the name, this
# option applies to both libstdc++ and libc++, whichever is used by Clang.
"-static-libstdc++",
# Request static linking for unwinder. Despite the name, this option
# applies to both libgcc and libunwind, whichever is used by Clang.
"-static-libgcc",
]
# -static-libstdc++ and -static-libgcc options are handled by the C++
# compiler driver (that is clang), whereas these link-args get passed
# straight to lld by rustc and need to be expanded manually.
rustflags = [ "-Clink-args=--push-state -Bstatic -lc++ -Bdynamic -lm --pop-state -l:libunwind.a" ]
}
config("dynamic_rust_standard_library") {
rustflags = [ "-Cprefer-dynamic" ]
}
config("static_rust_standard_library") {
rustflags = [ "-Cprefer-dynamic=no" ]
}
# Configure a larger (2MB) stack size for Rust binaries.
#
# Currently, threads created by Rust's libstd have a hardcoded default stack
# size of 2MB on Fuchsia. This can create overflows when moving code to the
# main thread, whose default stack size is 256kB. To remove this wrinkle, the
# default stack size is changed to 2MB for Rust binaries.
config("large_rust_stack") {
rustflags = [ "-Clink-args=-zstack-size=0x200000" ]
}
# Enable additional integer-math sanitizers
config("integer-paranoia") {
cflags = [
"-fsanitize=integer-divide-by-zero,signed-integer-overflow",
"-fsanitize-undefined-trap-on-error",
]
}
# clang_libunwind is only available on fuchsia.
# See the definition in //build/config/clang/clang.gni.
if (is_fuchsia) {
# TODO(https://fxbug.dev/42135607): Get this information from runtime.json instead.
_clang_libunwind = exec_script("$clang_prefix/clang++",
[
"--target=$current_target_tuple",
"-print-file-name=libunwind.so",
],
"trim string",
[])
config("libunwind") {
libs = [ _clang_libunwind ]
}
}
# NOTE: This config's label is hard-coded in //build/config/BUILDCONFIG.gn
# so don't rename it without updating that file too!
config("static-pie-config") {
cflags = [
"-fno-sanitize=all",
"-fno-stack-protector",
]
ldflags = [
"-nostdlib",
"-nostartfiles",
"-Wl,-no-dynamic-linker",
]
}
group("maybe_scudo_default_options") {
if (scudo_default_options != "" && scudo_default_options != []) {
public_deps = [ ":scudo_default_options" ]
}
}
sanitizer_default_options("scudo_default_options") {
}
# TODO(https://fxbug.dev/42180987): This works around a toolchain issue in LTO builds
# where code generation results in a dependency on a Zircon vDSO call but
# doesn't link -lzircon to supply it at link time. This is added to deps of
# the few targets where this has caused link failures to just explicitly link
# it in. As soon as the toolchain issues are resolved, this and the deps on it
# will all be removed.
group("uses-outline-atomics-fxbug98632") {
visibility = [
"${icu_root}:*",
"//src/developer/debug/debug_agent/test_data:*",
"//src/developer/debug/e2e_tests/inferiors:*",
"//src/graphics/examples/vkproto:*",
"//src/graphics/examples/vkproto/cmd-buf-benchmark:*",
"//third_party/ffmpeg:*",
"//third_party/icu/default:*",
"//third_party/icu/latest:*",
"//third_party/icu/stable:*",
]
if (current_cpu == "arm64" && is_fuchsia) {
deps = [ "//src/zircon/lib/zircon" ]
}
}