170 lines
6.4 KiB
Plaintext
170 lines
6.4 KiB
Plaintext
# Copyright 2021 The Chromium Authors
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import("//build/rust/rust_target.gni")
|
|
|
|
# Defines a Rust static library which can be used by downstream Rust or C++
|
|
# targets. This is a single Rust compilation unit consisting of potentially
|
|
# multiple .rs files.
|
|
#
|
|
# We term this 'rust_static_library' because it is used most analogously
|
|
# to a C++ 'static_library' in Chromium. Like the C++ one, it can be compiled
|
|
# independently into an intermediate linking target. The output contains the
|
|
# object file(s) of the GN target's sources, and not its dependencies.
|
|
#
|
|
# Parameters
|
|
#
|
|
# sources
|
|
# List of source files which this crate is allowed to compile, which is
|
|
# used to determine the impact of source code changes on other GN targets.
|
|
# This is not used by the Rust compiler, as it discovers source files by
|
|
# following `mod` declarations starting at the `crate_root`. The
|
|
# discovered source files must match this list. (This is not yet enforced,
|
|
# but will be.)
|
|
#
|
|
# epoch (optional)
|
|
# The major version of the library, which is used to differentiate between
|
|
# multiple versions of the same library name. This includes all leading 0s
|
|
# and the first non-zero value in the crate's version. This should be left
|
|
# as the default, which is "0", for first-party code unless there are
|
|
# multiple versions of a crate present. For third-party code, the version
|
|
# epoch (matching the directory it is found in) should be specified.
|
|
#
|
|
# Examples:
|
|
# 1.0.2 => epoch = "1"
|
|
# 4.2.0 => epoch = "4"
|
|
# 0.2.7 => epoch = "0.2"
|
|
# 0.0.3 => epoch = "0.0.3"
|
|
#
|
|
# edition (optional)
|
|
# Edition of the Rust language to be used.
|
|
# Options are "2015", "2018" and "2021". Defaults to "2021".
|
|
#
|
|
# allow_unsafe (optional)
|
|
# Set to true to allow unsafe code in this target. Defaults to false.
|
|
#
|
|
# configs (optional)
|
|
# A list of config labels (in the GN meaning) applying to this target.
|
|
#
|
|
# rustflags (optional)
|
|
# Explicit flags for rustc command line. (Use 'edition' or 'features'
|
|
# where possible).
|
|
#
|
|
# deps (optional)
|
|
# List of GN targets on which this crate depends. These may be Rust
|
|
# or non-Rust targets.
|
|
#
|
|
# public_deps (optional)
|
|
# List of GN targets on which this crate depends, and which are exported
|
|
# into the dependency list of any crate that depends on it. Dependency
|
|
# crates that appear in the public API should be included here.
|
|
#
|
|
# test_deps (optional)
|
|
# List of GN targets on which this crate's tests depend, in addition
|
|
# to deps.
|
|
#
|
|
# is_gtest_unittests (optional)
|
|
# Should only be set to true for rlibs of gtest unit tests. This ensures
|
|
# all objects in the rlib are linked into the final target, rather than
|
|
# pruning dead code, so that the tests themselves are not discarded by the
|
|
# linker.
|
|
#
|
|
# mutually_dependent_target (optional)
|
|
# mutually_dependent_public_deps (optional)
|
|
# These is for use by the mixed_target() template.
|
|
#
|
|
# If this Rust code is intrinsically paired with some C/C++ code,
|
|
# with bidirectional calls between the two, then this would
|
|
# be a circular dependency. GN does not allow circular dependencies,
|
|
# (other than for header files per allow_circular_includes_from).
|
|
# But this is common for a 'component' which has both Rust and C++
|
|
# code. You should structure things such that the C++ code depends
|
|
# on the Rust code in the normal way:
|
|
# static_library("cpp_stuff") {
|
|
# deps = [ "rust_stuff" ]
|
|
# # ..
|
|
# }
|
|
# but that the Rust target also notes the C++ target using this
|
|
# 'mutually_dependent_target' parameter.
|
|
# rust_static_library("rust_stuff") {
|
|
# mutually_dependent_target = "cpp_stuff"
|
|
# mutually_dependent_public_deps = _cpp_stuff_public_deps
|
|
# # ..
|
|
# }
|
|
#
|
|
# This causes the Rust unit tests, if generated, to depend on the mutually
|
|
# dependent target, since depending on the Rust code only would be
|
|
# insufficient. And it allows any C++ bindings generated from the Rust code
|
|
# to include headers from the mutually_dependent_target by depending on its
|
|
# public_deps.
|
|
#
|
|
# build_native_rust_unit_tests (optional)
|
|
# Builds native unit tests (under #[cfg(test)]) written inside the Rust
|
|
# crate. This will create a `<name>_unittests` executable in the output
|
|
# directory when set to true.
|
|
#
|
|
# unit_test_target (optional)
|
|
# Overrides the default name for the unit tests target
|
|
#
|
|
# crate_root (optional)
|
|
# Location of the crate root.
|
|
# This defaults to `./src/lib.rs` and should only be changed when
|
|
# absolutely necessary (such as in the case of generated code).
|
|
#
|
|
# features (optional)
|
|
# A list of conditional compilation flags to enable. This can be used
|
|
# to set features for crates built in-tree which are also published to
|
|
# crates.io. Each feature in the list will be passed to rustc as
|
|
# '--cfg feature=XXX'
|
|
#
|
|
# cxx_bindings (optional)
|
|
# A list of Rust files which contain #[cxx::bridge] mods and should
|
|
# therefore have C++ bindings generated. See https://cxx.rs.
|
|
# This will automatically add appropriate dependencies: there's no
|
|
# need to depend on the cxx crate or any generated bindings.
|
|
#
|
|
# visibility (optional)
|
|
# rustflags (optional)
|
|
# crate_name (optional)
|
|
# Per the usual gn meaning for Rust targets.
|
|
#
|
|
# inputs (optional)
|
|
# Additional input files needed for compilation (such as `include!`ed files)
|
|
#
|
|
# test_inputs (optional)
|
|
# Same as above but for the unit tests target
|
|
#
|
|
# Example of usage:
|
|
#
|
|
# rust_static_library("foo_bar") {
|
|
# deps = [
|
|
# "//boo/public/rust/bar",
|
|
# "//third_party/rust/crates:argh",
|
|
# "//third_party/rust/crates:serde",
|
|
# "//third_party/rust/crates:slab",
|
|
# ]
|
|
# sources = [ "src/lib.rs" ]
|
|
# }
|
|
#
|
|
# This template is intended to serve the same purpose as 'rustc_library'
|
|
# in Fuchsia.
|
|
template("rust_static_library") {
|
|
exclude_forwards = TESTONLY_AND_VISIBILITY + [ "configs" ]
|
|
_target_name = target_name
|
|
|
|
rust_target(_target_name) {
|
|
forward_variables_from(invoker, "*", exclude_forwards)
|
|
forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
|
|
if (defined(invoker.configs)) {
|
|
library_configs = []
|
|
library_configs = invoker.configs
|
|
}
|
|
target_type = "rust_library"
|
|
}
|
|
}
|
|
|
|
set_defaults("rust_static_library") {
|
|
configs = default_compiler_configs
|
|
}
|