| # 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/platform_version.gni") |
| import("//build/config/sanitizers/sanitizer_default_options.gni") |
| import("//build/config/sysroot.gni") |
| import("//build/rust/config.gni") |
| import("//build/toolchain/ccache.gni") |
| import("//build/toolchain/rbe.gni") |
| import("//zircon/public/sysroot/rust.gni") |
| |
| # Deprecated. |
| # TODO(fxbug.dev/44795): Remove once none of the petals depend on this. |
| config("werror") { |
| configs = [ "//build/config:werror" ] |
| } |
| |
| # 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 (!is_debug || rust_rbe_enable) { |
| # fxbug.dev/85921#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), or when RBE is enabled (and then |
| # the benefits of parallelized codegen are diminished). |
| configs += [ "//build/config/rust:one_codegen_unit" ] |
| } |
| |
| if (board_configs != []) { |
| configs += board_configs |
| } else { |
| configs += [ "//build/config:cpu_baseline" ] |
| } |
| |
| if (use_ccache) { |
| configs += [ ":ccache" ] |
| } |
| |
| ldflags = [] |
| 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" + rebased_clang_prefix + "/../lib/" + current_target_tuple, |
| "-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", |
| ] |
| |
| # TODO(fxbug.dev/53078): Eventually the default in the compler driver. |
| rustflags += [ "-Clink-arg=-zrel" ] |
| |
| if (build_id_format != "") { |
| ldflags += [ "-Wl,--build-id=$build_id_format" ] |
| } |
| } |
| |
| config("compiler_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") { |
| cflags = [ "-ffuchsia-api-level=$current_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 = [ "-static-libstdc++" ] |
| |
| # -static-libstdc++ is only supported by the compiler drivers (clang/clang++), whereas these |
| # link-args get passed straight to lld by rustc |
| rustflags = |
| [ "-Clink-args=--push-state -Bstatic -lc++ -Bdynamic -lm --pop-state" ] |
| } |
| |
| config("dynamic_rust_standard_library") { |
| # -Cprefer-dynamic is incompatible with (Thin)LTO. |
| if (toolchain_variant.tags + [ "lto" ] - [ "lto" ] == |
| toolchain_variant.tags) { |
| rustflags = [ "-Cprefer-dynamic" ] |
| } |
| } |
| |
| # 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) { |
| 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") { |
| } |