blob: a279ea239ee6ce8ce8db419a273c383f57ae37fb [file] [log] [blame]
# Copyright 2021 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.
# ________ _________ ________ ________
# |\ ____\|\___ ___\\ __ \|\ __ \
# \ \ \___|\|___ \ \_\ \ \|\ \ \ \|\ \
# \ \_____ \ \ \ \ \ \ \\\ \ \ ____\
# \|____|\ \ \ \ \ \ \ \\\ \ \ \___|
# ____\_\ \ \ \__\ \ \_______\ \__\
# |\_________\ \|__| \|_______|\|__|
# \|_________|
#
# Here to enable an unstable feature? All unstable features require special
# approval because they create risk and may have stable alternatives that better
# fit our needs. See the "Unstable features" section for more information.
import("//build/images/filesystem_limits.gni")
import("//build/rust/config.gni")
import("//build/toolchain/rbe.gni")
declare_args() {
# Controls whether the rust compiler uses v0 symbol mangling scheme
# (see https://github.com/rust-lang/rfcs/blob/HEAD/text/2603-rust-symbol-name-mangling-v0.md).
# The v0 symbol mangling scheme requires upstream LLVM support when demangling,
# so it is not on by default.
# TODO(fxbug.dev/57302): Enable v0 mangling by default.
rust_v0_symbol_mangling = false
# Enable incremental rust compilation. Takes a path to the directory to use
# as the cache.
rust_incremental = ""
}
# Defines a Rust cfg flag with the value of the rust_panic build arg.
# Useful for changing behavior of code based on panic behavior.
config("panic_cfg") {
rustflags = [ "--cfg=rust_panic=\"${rust_panic}\"" ]
}
# Turns on the rust compilation analysis generator. This will produce a
# directory $OUT/save-analysis-temp, which will dump all the source analysis
# that the compiler collected while analyzing the source. This config is
# included conditionally, see //build/config/BUILDCONFIG.gn for details.
config("analysis") {
rustflags = [ "-Zsave-analysis" ]
}
config("edition_2021") {
rustflags = [ "--edition=2021" ]
}
config("edition_2018") {
rustflags = [ "--edition=2018" ]
}
config("edition_2015") {
rustflags = [ "--edition=2015" ]
}
config("no_features") {
rustflags = [ "-Zallow-features=" ]
}
config("incremental") {
if (rust_incremental != "") {
rustflags = [ "-Cincremental=" + rust_incremental ]
}
}
config("one_codegen_unit") {
# Disable codegen parallelism.
# Trades incremental rebuild speed for smaller code size.
# See: fxbug.dev/74435, fxbug.dev/80514
if (rust_incremental == "") {
rustflags = [ "-Ccodegen-units=1" ]
}
}
config("codegen_units_16") {
# Enable default codegen parallelism (rustc default).
# This will increase code size over `:one_codegen_unit` above.
#
# Used without any lto option, this will also enable thin-local lto.
# https://doc.rust-lang.org/rustc/codegen-options/index.html#lto
if (rust_incremental == "") {
rustflags = [ "-Ccodegen-units=16" ]
}
}
config("lto_disabled") {
# Fully disable lto.
#
# This is the default when -Ccodegen_units=1 or when optimizations are off
# (-Copt-level=0)
rustflags = [ "-Clto=off" ]
}
config("lto_thin") {
# Enable "thin" lto across all crates being linked
rustflags = [ "-Clto=thin" ]
}
# Best practices for Rust binaries that go into size-constrained bootfs.
config("bootfs") {
# Optimize for size.
# TODO(fxbug.dev/63313): use "z" when resolved.
rustflags = [ "-Copt-level=s" ]
if (is_debug && # Debug builds produce large Rust binaries
max_fuchsia_zbi_size > 0) { # So large they might not fit in the ZBI
# Force ThinLTO to squeeze Rust binaries further.
# See: fxbug.dev/80514
# See: fxbug.dev/91325
configs = [ "//build/config/lto:thinlto" ]
}
# Can't dynamically link libstd and libtest for ZBI binaries.
# TODO(fxbug.dev/83081): reconsider this.
rustflags += [ "-Cprefer-dynamic=no" ]
}
config("proc_macro_test") {
rustflags = [
"--extern",
"proc_macro",
]
}
config("2018_idioms") {
rustflags = [ "-Wrust-2018-idioms" ]
}
config("target") {
rustflags = [
"--target",
rust_target,
"--cap-lints=$rust_cap_lints",
]
}
config("panic_abort") {
rustflags = [
"-Cpanic=abort",
"-Cforce-unwind-tables=yes",
"-Zpanic_abort_tests",
]
}
config("v0_symbol_mangling") {
if (rust_v0_symbol_mangling) {
rustflags = [ "-Csymbol-mangling-version=v0" ]
}
}
config("allow_unknown_lints") {
rustflags = [ "-Aunknown-lints" ]
}
# TODO(fxbug.dev/67118) remove this allowance
config("allow_redundant_semicolons") {
rustflags = [ "-Aredundant-semicolons" ]
}
# TODO(fxbug.dev/69442) remove this allowance
config("allow_legacy_derive_helpers") {
rustflags = [ "-Alegacy-derive-helpers" ]
}
config("deny_unused_results") {
rustflags = [ "-Dunused_results" ]
}
config("allow_unused_results") {
rustflags = [ "-Aunused_results" ]
# This visibility list allows for targets to opt out of allowing unused results.
#
# There is currently no platform mandate to adopt the unused_results lint and it's opt-in for
# developers that want to use it. See https://fxbug.dev/73468 for more context.
#
# To adopt the lint, add the following to your rust target:
# configs -= ["//build/config/rust:allow_unused_results"]
# The visibility list below can be used to enforce the list on certain areas of the tree while
# we evaluate wider adoption.
#
# To update this list run:
# $ scripts/gn/gen_visibility_globs.py \
# --all=//build/config/rust:deny_unused_results \
# --allow=//build/config/rust:allow_unused_results \
# --ignore-suffix=-rustc,_banjo_rust
visibility = [
"//build/*",
"//examples/*",
"//garnet/*",
"//sdk/*",
"//src/bringup/*",
"//src/camera/*",
"//src/cobalt/*",
"//src/connectivity/bluetooth/lib/bt-a2dp:*",
"//src/connectivity/location/*",
"//src/connectivity/lowpan/*",
"//src/connectivity/network/net-cli/ffx:*",
"//src/connectivity/network/netstack:networking_metrics_rustlib",
"//src/connectivity/network/testing/network-test-realm/ffx:*",
"//src/connectivity/openthread/*",
"//src/connectivity/overnet/*",
"//src/connectivity/ppp/*",
"//src/connectivity/telephony/*",
"//src/connectivity/weave/*",
"//src/connectivity/wlan/*",
"//src/developer/*",
"//src/devices/*",
"//src/diagnostics/*",
"//src/experiences/*",
"//src/factory/*",
"//src/fonts/*",
"//src/graphics/*",
"//src/hwinfo/*",
"//src/identity/*",
"//src/intl/*",
"//src/lib/*",
"//src/media/*",
"//src/modular/*",
"//src/power/*",
"//src/proc/*",
"//src/recovery/*",
"//src/security/*",
"//src/session/*",
"//src/settings/*",
"//src/storage/*",
"//src/sys/*",
"//src/testing/*",
"//src/tests/*",
"//src/ui/*",
"//src/virtualization/*",
"//src/zircon/*",
"//third_party/*",
"//tools/*",
"//vendor/*",
"//zircon/*",
]
}
config("coverage") {
rustflags = [ "-Cinstrument-coverage" ]
}
# TODO(fxbug.dev/94355): Eliminate or identify all sources of output dir leaks.
# This option makes it explicit that a particular build action is sensitive
# to the output dir path, and informs remote execution to refrain from
# normalizing the output dir, which improves caching.
# As a goal, we should aim to minimize the need for this config.
config("output_dir_sensitive") {
if (rust_rbe_enable) {
# --remote-flag=* is a pseudo flag that is intercepted by
# build/rbe/rustc-remote-wrapper.sh and forwarded to rewrapper (reclient).
rustflags = [ "--remote-flag=--canonicalize_working_dir=false" ]
}
}
# Unstable features
#
# These configs enable unstable Rust features. Configs that enable unstable
# features must go through an approval process before they may be added. See:
# https://fuchsia.dev/fuchsia-src/development/languages/rust/unstable#the_process
#
# When adding a new config, make sure to add a TODO with a link to the tracking
# issue.
# TODO(fxbug.dev/98399)
config("netstack3_only_specialization_feature") {
rustflags = [
"-Zallow-features=min_specialization,specialization",
"-Aincomplete-features",
]
}
# TODO(fxbug.dev/94237)
config("allow_simd") {
rustflags = [ "-Zallow-features=stdsimd,aarch64_target_feature" ]
}
# TODO(fxbug.dev/103193)
config("allow_non_exhaustive_omitted_patterns_lint") {
rustflags = [ "-Zallow-features=non_exhaustive_omitted_patterns_lint" ]
visibility =
[ "//src/connectivity/network/netstack3/core/specialize-ip-macro:*" ]
}