blob: 952248872db759dc6ce9ca4a3990423a22563267 [file] [log] [blame]
# Copyright 2018 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/config/fuchsia/target_api_level_range.gni")
import("//build/testing/host_test_data.gni")
import("config.gni")
group("disable_strict_sources_check_allowlist") {
# ________ _________ ________ ________
# |\ ____\|\___ ___\\ __ \|\ __ \
# \ \ \___|\|___ \ \_\ \ \|\ \ \ \|\ \
# \ \_____ \ \ \ \ \ \ \\\ \ \ ____\
# \|____|\ \ \ \ \ \ \ \\\ \ \ \___|
# ____\_\ \ \ \__\ \ \_______\ \__\
# |\_________\ \|__| \|_______|\|__|
# \|_________|
# This is an allowlist of packages that do not enforce that the source files
# are listed in `source`. This is only intended to be used as a temporary
# allowlist during soft migrations.
#
# All file dependencies of the targets in this list should be covered by the
# paths in the skipAnalysisAllowlist in
# //tools/integration/fint/should_build.go.
visibility = []
# ...Actually, there is one class of exceptions not intended to be temporary.
# There are rust crates that are versioned with and live alongside
# third-party, non-Rust code. Trading off between maximal, declarative build
# hygiene and the ease of rolling such third party repos without breaking
# changes, we lean toward the latter.
visibility += [ "//third_party/boringssl/rust:*" ]
# Third-party crates don't list sources explicitly.
visibility += [ "//third_party/rust_crates:*" ]
}
# NOTE: This target is used by "fx set --cargo-toml-gen ..." which
# will do the following:
#
# 1) Ensure that "fx gen" (and "fx build") will pass `--ide-json`
# to `gn gen`, which generates an up-to-date
# `$root_build_dir/project.json` file, used here as input.
#
# 2) Add this target to the host_labels list to ensure its action script is
# run by "fx build".
#
# For more details, see docs/development/language/rust/README.md
#
# Notes on transitioning this target from `base_package_labels` to `host_tools`:
#
# 1) Existing `args.gn` files created by `fx set --cargo-toml-gen` will have
# added the target to the `base_package_labels` list. This list assumes the
# default toolchain.
# 2) `base_package_labels` currently feeds into
# - `//:developer_base_package_labels`
# 3) New `args.gn` files created by `fx set --cargo-toml-gen` will instead use
# the `host_labels` arg (which assumes the host toolchain). That list is
# currently being used with the `//:host` group
# 4) Developers _may_ have added `//build/rust:cargo_toml_gen` to either of
# following:
# - `cache_package_labels` (`//:developer_cache_packages`)
# - `universe_package_labels` (`//:developer_universe_packages`)
# and those are being split as well, and so the following groups will need
# to be added to visibility:
# - `//:developer_cache_packages`
# - `//:developer_universe_packages`
#
if (current_toolchain != default_toolchain) {
# This is a redirect from the host toolchain to the default toolchain, as it
# is added to the host_labels group, not the product definition inputs.
group("cargo_toml_gen") {
testonly = true
public_deps = [ ":cargo_toml_gen($default_toolchain)" ]
visibility = [
# This is the supported group for developers to add tools to, going
# forward, and the group used by `fx set --cargo-toml-gen`.
":tests",
"//:developer_host_tools",
"//:host",
]
}
} else {
gn_desc_label = "//tools/gn_desc:gn_desc.json"
gn_desc_out = "$root_build_dir/gn_desc.json"
action("cargo_toml_gen") {
testonly = true
# Nothing in-tree should depend on Cargo files.
visibility = [
# The only expected use of this target, going forward (the above group)
":cargo_toml_gen",
":tests",
# `fx set ... --cargo-toml-gen` previously used the `base_package_labels`
# GN arg, which feeds into `//:developer_base_packages`. This is here for
# providing a transition for developers' existing `args.gn` files.
"//:developer_base_packages",
# Developers may have used these as well (also deprecated for this
# target).
"//:developer_cache_packages",
"//:developer_universe_packages",
# via --with-host or `host_labels`, and specifying the fuchsia toolchain:
"//:host",
]
script = "//scripts/generate_cargo.py"
sources = []
inputs = [
gn_desc_out,
"//third_party/rust_crates/Cargo.toml",
]
hermetic_deps = false
outputs = [ "$root_build_dir/cargo/generate_cargo.stamp" ]
args = [
rebase_path(gn_desc_out, root_build_dir),
"--root_build_dir",
".",
"--fuchsia_dir",
rebase_path("//", root_build_dir),
]
deps = [
"//build/rust:api_level_cfg_flags",
gn_desc_label,
]
}
}
# Generated file containing flags to pass to each invocation of `rustc` (or
# similar tools). Pass it to rustc by specifying `@rust_api_level_cfg_flags.txt`
# in the command line.
generated_file("api_level_cfg_flags") {
outputs = [ "$root_out_dir/rust_api_level_cfg_flags.txt" ]
output_conversion = "list lines"
contents = []
foreach(level, lesser_or_equal_fuchsia_api_levels) {
contents += [ "--cfg=fuchsia_api_level_at_least=\"${level}\"" ]
}
foreach(level, greater_fuchsia_api_levels) {
contents += [ "--cfg=fuchsia_api_level_less_than=\"${level}\"" ]
}
}
# Multiple integration tests rely on having a Rust toolchain available on the host test
# runner, and host_test_data does not appear to support multiple definitions of the
# same output path in the same build, so we provide a central target here to be used
# by integration tests that need cargo or rustc.
if (is_host) {
action("make_toolchain_host_binaries") {
script = "//build/copy_tree.py"
_stamp = "$target_gen_dir/$target_name.stamp"
_depfile = "$target_out_dir/$target_name.d"
args = [
rebased_rustc_prefix,
out_rustc_prefix,
rebase_path(_stamp, root_build_dir),
"--depfile",
rebase_path(_depfile, root_build_dir),
]
outputs = [ _stamp ]
depfile = _depfile
}
group("tool_paths") {
visibility = [ "//:tool_paths" ]
deps = [
":tool_paths.llvm-profdata-rust",
":tool_paths.rustdoc-link",
]
}
# This target adds a "rustdoc-link" tool to be consumed by the infra doc builder.
group("tool_paths.rustdoc-link") {
metadata = {
tool_paths = [
{
cpu = host_cpu
label = get_label_info(":$target_name", "label_with_toolchain")
name = "rustdoc-link"
os = host_os
path =
rebase_path("//tools/devshell/contrib/lib/rust/rustdoc-link.py",
root_build_dir)
},
]
}
}
# This target adds llvm-profdata for the rust toolchain to tool_paths.json.
# Since this tool has the same name as the clang counterpart, we need to
# append -rust to the name to differentiate them. It also needs to be built
# in the host_toolchain in order for the tool path to be correct.
group("tool_paths.llvm-profdata-rust") {
deps = [ ":make_toolchain_host_binaries" ]
metadata = {
tool_paths = [
{
cpu = host_cpu
label = get_label_info(":$target_name", "label_with_toolchain")
name = "llvm-profdata-rust"
os = host_os
path = rebase_path("$rustc_prefix/bin/llvm-profdata", root_build_dir)
},
]
}
}
host_test_data("prebuilt_toolchain_host_test_data") {
deps = [ ":make_toolchain_host_binaries" ]
sources = [ "$root_build_dir/$out_rustc_prefix" ]
}
}
group("tests") {
testonly = true
deps = [
":cargo_toml_gen",
"docs/rustdoc-index",
"docs/rustdoc-index:rustdoc-index(//build/toolchain:host_x64)",
"tests",
]
}