Add the CROSSTOOL reference.
RELNOTES: None.
SKIP_CI=Keeps throwing 502s for no reason.
PiperOrigin-RevId: 215424128
diff --git a/site/docs/crosstool-reference.md b/site/docs/crosstool-reference.md
new file mode 100644
index 0000000..7a50c7d
--- /dev/null
+++ b/site/docs/crosstool-reference.md
@@ -0,0 +1,1008 @@
+---
+layout: documentation
+title: Understanding CROSSTOOL
+---
+
+# Understanding CROSSTOOL
+
+* [Overview](#overview)
+* [CROSSTOOL proto structure](#crosstool-proto-structure)
+* [Toolchain selection](#toolchain-selection)
+* [CROSSTOOL features](#crosstool-features)
+ * [Feature relationships](#feature-relationships)
+* [CROSSTOOL actions](#crosstool-actions)
+ * [Assembler actions](#assembler-actions)
+ * [Compiler actions](#compiler-actions)
+ * [Link actions](#link-actions)
+ * [AR actions](#ar-actions)
+ * [LTO actions](#lto-actions)
+* [CROSSTOOL `action_config`](#crosstool-action_config)
+ * [`tool` messages](#tool-messages)
+ * [Example usage](#example-usage)
+ * [Flag groups](#flag-groups)
+ * [Conditional expansion](#conditional-expansion)
+* [CROSSTOOL reference](#crosstool-reference)
+ * [CROSSOTOOL build variables](#crosstool-build-variables)
+ * [CROSSTOOL features](#crosstool-features)
+
+To get hands-on with CROSSTOOL, see the
+[Configuring CROSSTOOL](tutorial/crosstool.html) tutorial.
+
+## Overview
+
+`CROSSTOOL` is a text file containing a
+[protocol buffer](https://developers.google.com/protocol-buffers/docs/overview)
+that provides the necessary level of granularity for configuring the behavior of
+Bazel's C++ rules. By default, Bazel automatically configures `CROSSTOOL` for
+your build, but you have the option to configure it manually. You reference the
+`CROSSTOOL` file in your `BUILD` file(s) using a `cc_toolchain` target and check
+it into source control alongside your project. You can share a single
+`CROSSTOOL` file across multiple projects or create separate per-project files.
+
+When a C++ target enters the analysis phase, Bazel selects the appropriate
+`cc_toolchain` target based on the BUILD file, then reads the corresponding
+toolchain definition from the CROSSTOOL file. The `cc_toolchain` target passes
+information from the CROSSTOOL proto to the C++ target through a
+`CcToolchainProvider`.
+
+For example, a compile or link action, instantiated by a rule such as
+`cc_binary` or `cc_library`, needs the following information:
+
+* The compiler or linker to use
+* Command-line flags for the compiler/linker
+* Configuration flags passed through the `--copt/--linkopt` options
+* Environment variables
+* Artifacts needed in the sandbox in which the action executes
+
+All of the above information except the artifacts required in the sandbox are
+specified in the CROSSTOOL proto.
+
+The artifacts to be shipped to the sandbox are declared in the `cc_toolchain`
+target. For example, with the `cc_toolchain.linker_files` attribute you can
+specify the linker binary and toolchain libraries to ship into the sandbox.
+
+## CROSSTOOL proto structure
+
+The CROSSTOOL proto has the following structure:
+
+* Map from `--cpu` to toolchain (to be used when `--compiler` is not specified
+ or when `cc_toolchain_suite.toolchains` omits the `cpu` entry)
+
+* Toolchain for a particular `--cpu` and `--compiler` combination (1)
+ * Static toolchain:
+ * `compiler_flags`
+ * `linker_flags`
+ * `compilation_mode_flags`
+ * `linking_mode_flags`
+ * Dynamic toolchain:
+ * `features`
+
+* Toolchain for a particular `--cpu` and `--compiler` combination (2)
+
+* Toolchain for a particular `--cpu` and `--compiler` combination (3)
+
+* ...
+
+
+## Toolchain selection
+
+The toolchain selection logic operates as follows:
+
+1. User specifies a `cc_toolchain_suite` target in the `BUILD` file and points
+ Bazel to the target using the
+ [`--crosstool_top option`](https://docs.bazel.build/versions/master/user-manual.html#flag--crosstool_top).
+ The `CROSSTOOL` file must reside in the same directory as the
+ `BUILD` file containing the `cc_toolchain_suite` target.
+
+2. The `cc_toolchain_suite` target and the `CROSSTOOL`
+ file reference multiple toolchains. The values of the `--cpu` and
+ `--compiler `flags determine which of those toolchains is selected,
+ either based only on the `--cpu` flag value, or based on a joint
+ `--cpu | --compiler` value. The selection process is as follows:
+
+ * If the `--compiler` option is specified, Bazel selects the
+ corresponding entry from the `cc_toolchain_suite.toolchains`
+ attribute with `--cpu | --compiler`. If Bazel does not find
+ a corresponding entry, it throws an error.
+
+ * If the `--compiler` option is not specified, Bazel selects
+ the corresponding entry from the `cc_toolchain_suite.toolchains`
+ attribute with just `--cpu`.
+
+ However, if Bazel does not find a corresponding entry and the
+ `--incompatible_disable_cc_toolchain_label_from_crosstool_proto`
+ option is disabled, Bazel iterates through `default_toolchains`
+ in the `CROSSTOOL` file until it finds an entry where the
+ `default_toolchain.cpu` value matches the specified `--cpu`
+ option value. Bazel then reads the `toolchain_identifier`
+ value to identify the corresponding toolchain, and selects the appropriate
+ entry in the `cc_toolchain_suite.toolchains` attribute using
+ `toolchain.target_cpu | toolchain.compiler`.
+
+ * If no flags are specified, Bazel inspects the host system and selects a
+ `--cpu` value based on its findings. See the
+ [inspection mechanism code](https://source.bazel.build/bazel/+/1b73bc37e184e71651eb631223dcce321ba16211:src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java).
+
+Once a toolchain has been selected, corresponding `feature` and `action_config`
+messages in the CROSSTOOL file govern the configuration of the build (that is,
+items described earlier in this document). These messages allow the
+implementation of fully fledged C++ features in Bazel without modifying the
+Bazel binary. C++ rules support multiple unique actions documented in detail
+[in the Bazel source code](https://source.bazel.build/bazel/+/4f547a7ea86df80e4c76145ffdbb0c8b75ba3afa:tools/build_defs/cc/action_names.bzl).
+
+## CROSSTOOL features
+
+A feature is an entity that requires non-default command-line flags, actions,
+constraints on the execution environment, or dependency alterations. A feature
+can be something as simple as allowing BUILD files to select configurations of
+flags, such as `treat_warnings_as_errors`, or interact with the C++ rules and
+include new compile actions and inputs to the compilation, such as
+`header_modules` or `thin_lto`.
+
+Ideally, a toolchain definition consists of a set of features, where each
+feature consists of multiple flag groups, each defining a list of flags that
+apply to specific Bazel actions.
+
+A feature is specified by name, which allows full decoupling of the CROSSTOOL
+configuration from Bazel releases. In other words, a Bazel release does not
+affect the behavior of CROSSTOOL configurations as long as those configurations
+do not require the use of new features.
+
+A feature is enabled only when both Bazel and the CROSSTOOL configuration
+support it.
+
+Features can have interdependencies, depend on command line flags, `BUILD` file
+settings, and other variables.
+
+### Feature relationships
+
+Dependencies are typically managed directly with Bazel, which simply enforces
+the requirements and manages conflicts intrinsic to the nature of the features
+defined in the build. The toolchain specification allows for more granular
+constraints for use directly within the CROSSTOOL file that govern feature
+support and expansion. These are:
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Constraint</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>requires: ['feature1', 'feature2']</code>
+ </td>
+ <td>Feature-level. The feature is supported only if the specified required
+ features are enabled. For example, when a feature is only supported in
+ certain build modes (features <code>opt</code>, <code>dbg</code>, or
+ <code>fastbuild</code>). Multiple `requires` statements are
+ satisfied all at once if any one of them is satisfied.
+ </td>
+ </tr>
+ <tr>
+ <td><code>implies: 'feature'</code>
+ </td>
+ <td>Feature-level. This feature implies the specified feature. For example, a
+ module compile implies the need for module maps, which can be implemented
+ by a repeated <code>implies</code> string in the feature where each of
+ the strings names a specific feature. Enabling a feature also implicitly
+ enables all features implied by it (that is, it functions recursively).
+ <p>
+ Also provides the ability to factor common subsets of functionality out of
+ a set of features, such as the common parts of sanitizers. Implied
+ features cannot be disabled.
+ </td>
+ </tr>
+ <tr>
+ <td><code>provides: 'feature'</code>
+ </td>
+ <td>Feature-level. Indicates that this feature is one of several mutually
+ exclusive alternate features. For example, all of the sanitizers could
+ specify <code>provides: "sanitizer"</code>.
+ <p>
+ This improves error handling by listing the alternatives if the user asks
+ for two or more mutually exclusive features at once.
+ </td>
+ </tr>
+ <tr>
+ <td><code>with_feature: {feature: 'feature1', not_feature: 'feature2']</code>
+ </td>
+ <td>Flag set-level. A feature can specify multiple flag sets with multiple
+ <code>with_feature</code> statements. When <code>with_feature</code> is
+ specified, the flag set will only expand to the build command if all of the
+ feature in the specified <code>feature:</code> set are enabled, and all the
+ features specified in <code>not_feature:</code> set are disabled.
+ </td>
+ </tr>
+</table>
+
+## CROSSTOOL actions
+
+CROSSTOOL actions provide the flexibility to modify the circumstances under
+which an action executes without assuming how the action will be run. An
+<code>action_config</code> specifies the tool binary that an action invokes,
+while a <code>feature</code> specifies the configuration (flags) that determine
+how that tool behaves when the action is invoked.
+
+[Features](#crosstool-features) reference CROSSTOOL actions to signal which
+Bazel actions they affect since CROSSTOOL actions can modify the Bazel action
+graph. The CROSSTOOL file includes actions that have flags and tools associated
+with them, such as `c++-compile`. Flags are assigned to each action by
+associating them with a feature.
+
+Each CROSSTOOL action name represents a single type of action performed by
+Bazel, such as compiling or linking. There is, however, a many-to-one
+relationship between CROSSTOOL actions and Bazel action types, where a Bazel
+action type refers to a Java class that implements an action (such as
+`CppCompileAction`). In particular, the "assembler actions" and "compiler
+actions" in the table below are `CppCompileAction`, while the link actions are
+`CppLinkAction`.
+
+### Assembler actions
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Action</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>preprocess-assemble</code>
+ </td>
+ <td>Assemble with preprocessing. Typically for <code>.S</code> files.
+ </td>
+ </tr>
+ <tr>
+ <td><code>assemble</code>
+ </td>
+ <td>Assemble without preprocessing. Typically for <code>.s</code> files.
+ </td>
+ </tr>
+</table>
+
+### Compiler actions
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Action</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>cc-flags-make-variable</code>
+ </td>
+ <td>Propagates <code>CC_FLAGS</code> to genrules.
+ </td>
+ </tr>
+ <tr>
+ <td><code>c-compile</code>
+ </td>
+ <td>Compile as C.
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-compile</code>
+ </td>
+ <td>Compile as C++.
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-header-parsing</code>
+ </td>
+ <td>Run the compiler's parser on a header file to ensure that the header is
+ self-contained, as it will otherwise produce compilation errors. Applies
+ only to toolchains that support modules.
+ </td>
+ </tr>
+</table>
+
+### Link actions
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Action</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-link-dynamic-library</code>
+ </td>
+ <td>Link a shared library containing all of its dependencies.
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-link-nodeps-dynamic-library</code>
+ </td>
+ <td>Link a shared library only containing <code>cc_library</code> sources.
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-link-executable</code>
+ </td>
+ <td>Link a final ready-to-run library.
+ </td>
+ </tr>
+</table>
+
+### AR actions
+
+AR actions assemble object files into archive libraries (`.a` files) via `ar`
+and encode some semantics into the name.
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Action</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>c++-link-static-library</code>
+ </td>
+ <td>Create a static library (archive).
+ </td>
+ </tr>
+</table>
+
+### LTO actions
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Action</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>lto-backend</code>
+ </td>
+ <td>ThinLTO action compiling bitcodes into native objects.
+ </td>
+ </tr>
+ <tr>
+ <td><code>lto-index</code>
+ </td>
+ <td>ThinLTO action generating global index.
+ </td>
+ </tr>
+</table>
+
+## CROSSTOOL `action_config`
+
+A CROSSTOOL `action_config` is a proto message that describes a Bazel action by
+specifying the tool (binary) to invoke during the action and sets of flags,
+defined by features, that apply constraints to the action's execution. A
+CROSSTOOL action takes the following attributes:
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Attribute</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>action_name</code>
+ </td>
+ <td>The Bazel action to which this CROSSTOOL action corresponds. Bazel uses
+ this attribute to discover per-action tool and execution requirements.
+ </td>
+ </tr>
+ <tr>
+ <td><code>tool</code>
+ </td>
+ <td>The executable to invoke. This can depend on a feature. A default must be
+ provided.
+ </td>
+ </tr>
+ <tr>
+ <td><code>flag_set</code>
+ </td>
+ <td>A set of flags that applies to a group of actions. Same as for a feature.
+ </td>
+ </tr>
+ <tr>
+ <td><code>env_set</code>
+ </td>
+ <td>A set of environment constraints that applies to a group of actions. Same
+ as for a feature.
+ </td>
+ </tr>
+</table>
+
+A CROSSTOOL `action_config` can require and imply other features and
+<code>action_config</code>s as dictated by the
+[feature relationships](#feature-relationships) described earlier. This behavior
+is similar to that of a feature.
+
+The last two attributes are redundant against the corresponding attributes on
+features and are included because some Bazel actions require certain flags or
+environment variables and we want to avoid unnecessary `ction_config`+`feature`
+pairs. Typically, sharing a single feature across multiple `action_config`s is
+preferred.
+
+You can not define more than one CROSSTOOL `action_config` with the same
+`action_name` within the same toolchain. This prevents ambiguity in tool paths
+and enforces the intention behind `action_config` - that an action's properties
+are clearly described in a single place in the toolchain.
+
+### `tool` messages
+
+A CROSSTOOL `action_config` can specify a set of tools via `tool` messages.
+A `tool` message consists of the following fields:
+
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Field</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><code>tool_path</code>
+ </td>
+ <td>Path to the tool in question (relative to the <code>CROSSTOOL</code>
+ file).
+ </td>
+ </tr>
+ <tr>
+ <td><code>with_feature</code>
+ </td>
+ <td>A set of features that must be enabled for this tool to apply.
+ </td>
+ </tr>
+</table>
+
+For a given CROSSTOOL `action_config`, only a single `tool` message applies its
+tool path and execution requirements to the Bazel action. A tool is selected by
+sequentially parsing `tool` messages on an `action_config` until a tool with a
+`with_feature` set matching the feature configuration is found
+(see [Feature relationships](#feature-relationships) earlier in this document
+for more information). We recommend that you end your tool lists with a default
+tool that corresponds to an empty feature configuration.
+
+
+### Example usage
+
+Features and CROSSTOOL actions can be used together to implement Bazel actions
+with diverse cross-platform semantics. For example, debug symbol generation on
+macOS requires generating symbols in the compile action, then invoking a
+specialized tool during the link action to create compressed dsym archive, and
+then decompressing that archive to produce the application bundle and `.plist`
+files consumable by Xcode.
+
+With Bazel, this process can instead be implemented as follows, with
+`unbundle-debuginfo` being a Bazel action:
+
+```
+toolchain {
+ action_config {
+ config_name: "c++-link-executable"
+ action_name: "c++-link-executable"
+ tool {
+ with_feature { feature: "generate-debug-symbols" }
+ tool_path: "toolchain/mac/ld-with-dsym-packaging"
+ }
+ tool {
+ tool_path: "toolchain/mac/ld"
+ }
+ }
+
+ feature {
+ name: "generate-debug-symbols"
+ flag_set {
+ action: "c-compile"
+ action: "c++-compile"
+ flag_group {
+ flag: "-g"
+ }
+ }
+ implies: { feature: "unbundle-debuginfo" }
+ }
+}
+```
+
+This same feature can be implemented entirely differently for Linux, which uses
+`fission`, or for Windows, which produces `.pdb` files. For example, the
+implementation for `fission`-based debug symbol generation might look as
+follows:
+
+```
+toolchain {
+ action_config {
+ name: "c++-compile"
+
+ tool {
+ tool_path: "toolchain/bin/gcc"
+ }
+ }
+
+ feature {
+ name: "generate-debug-symbols"
+ requires { feature: "dbg" }
+ flag_set {
+ action: "c++-compile"
+ flag_group {
+ flag: "-gsplit-dwarf"
+ }
+ }
+ flag_set {
+ action: "c++-link-executable"
+ flag_group {
+ flag: "-Wl"
+ flag: "--gdb-index"
+ }
+ }
+ }
+ }
+}
+```
+
+### Flag groups
+
+CROSSTOOL allows you to bundle flags into groups that serve a specific purpose.
+You can specify a flag within the CROSSTOOL file using pre-defined variables
+within the flag value, which the compiler expands when adding the flag to the
+build command. For example:
+
+```
+ flag_group {
+ flag: "%{output_file_path}
+ }
+```
+
+In this case, the contents of the flag will be replaced by the output file path
+of the action.
+
+Flag groups are expanded to the build command in the order in which they appear
+in the `CROSSTOOL` file, top-to-bottom, left-to-right.
+
+For flags that need to repeat with different values when added to the build
+command, the flag group can iterate variables of type `list`. For example, the
+variable `include_path` of type `list`:
+
+```
+ flag_group {
+ iterate_over: "include_paths"
+ flag: "-I%{include_paths}"
+ }
+```
+
+expands to `-I<path>` for each path element in the `include_paths` list. All
+flags (or `flag_group`s) in the body of a flag group declaration are expanded as
+a unit. For example:
+
+```
+ flag_group {
+ iterate_over: "include_paths"
+ flag: "-I"
+ flag: "%{include_paths}"
+ }
+```
+
+expands to `-I <path>` for each path element in the `include_paths` list.
+
+A variable can repeat multiple times. For example:
+
+```
+ flag_group {
+ iterate_over: "include_paths"
+ flag: "-iprefix=%{include_paths}"
+ flag: "-isystem=%{include_paths}"
+ }
+```
+
+expands to:
+
+```
+ -iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
+```
+
+Variables can correspond to structures accessible using dot-notation. For
+example:
+
+```
+ flag_group {
+ flag: "-l%{libraries_to_link.name}"
+ }
+```
+
+Structures can be nested and may also contain sequences. To prevent name clashes
+and to be explicit, you must specify the full path through the fields. For
+example:
+
+```
+ flag_group {
+ iterate_over: "libraries_to_link"
+ flag_group {
+ iterate_over: "libraries_to_link.shared_libraries"
+ flag: "-l%{libraries_to_link.shared_libraries.name}"
+ }
+ }
+```
+
+### Conditional expansion
+
+Flag groups support conditional expansion based on the presence of a particular
+variable or its field using the `expand_if_all_available`, `expand_if_none_available`,
+`expand_if_true`, `expand_if_false`, or `expand_if_equal` messages. For example:
+
+```
+ flag_group {
+ iterate_over: "libraries_to_link"
+ flag_group {
+ iterate_over: "libraries_to_link.shared_libraries"
+ flag_group {
+ expand_if_all_available: "libraries_to_link.shared_libraries.is_whole_archive"
+ flag: "--whole_archive"
+ }
+ flag_group {
+ flag: "-l%{libraries_to_link.shared_libraries.name}"
+ }
+ flag_group {
+ expand_if_all_available: "libraries_to_link.shared_libraries.is_whole_archive"
+ flag: "--no_whole_archive"
+ }
+ }
+ }
+```
+
+**Note:** The `--whole_archive` and `--no_whole_archive` options are added to
+the build command only when a currently iterated library has an
+`is_whole_archive` field.
+
+## CROSSTOOL reference
+
+This section provides a reference of build variables, features, and other
+information required to successfully configure CROSSTOOL.
+
+### CROSSTOOL build variables
+
+The following is a reference of CROSSTOOL build variables.
+
+**Note:** `[action]` indicates the relevant action type.
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Variable</strong>
+ </td>
+ <td><strong>Description</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>source_file</code></strong>
+ </td>
+ <td><code>[compile]</code> Source file to compile.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>input_file</code></strong>
+ </td>
+ <td><code>[strip]</code> Artifact to strip.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>output_file</code></strong>
+ </td>
+ <td><code>[compile]</code> Compilation output.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>output_assembly_file</code></strong>
+ </td>
+ <td><code>[compile]</code> Emitted assembly file. Applies only when the
+ <code>compile</code> action emits assembly text, typically when using the
+ <code>--save_temps</code> flag. The contents are the same as for
+ <code>output_file</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>output_preprocess_file</code></strong>
+ </td>
+ <td><code>[compile]</code> Preprocessed output. Applies only to compile
+ actions that only preprocess the source files, typically when using the
+ <code>--save_temps</code> flag. The contents are the same as for
+ <code>output_file</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>includes</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of files the compiler must
+ unconditionally include in the compiled source.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>include_paths</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence directories in which the compiler
+ searches for headers included using <code>#include<foo.h></code>
+ and <code>#include "foo.h"</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>quote_include_paths</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of <code>-iquote</code> includes -
+ directories in which the compiler searches for headers included using
+ <code>#include<foo.h></code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>system_include_paths</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of <code>-isystem</code> includes -
+ directories in which the compiler searches for headers included using
+ <code>#include "foo.h"</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>dependency_file</code></strong>
+ </td>
+ <td><code>[compile]</code> The <code>.d</code> dependency file generated by
+ the compiler.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>preprocessor_defines</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of <code>defines</code>, such as
+ <code>--DDEBUG</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>pic</code></strong>
+ </td>
+ <td><code>[compile]</code> Compiles the output as position-independent code.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>gcov_gcno_file</code></strong>
+ </td>
+ <td><code>[compile]</code> The <code>gcov</code> coverage file.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>per_object_debug_info_file</code></strong>
+ </td>
+ <td><code>[compile]</code> The per-object debug info (<code>.dwp</code>)
+ file.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>stripotps</code></strong>
+ </td>
+ <td><code>[strip]</code> Sequence of <code>stripopts</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>legacy_compile_flags</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of flags from legacy CROSSTOOL fields
+ such as <code>compiler_flag</code>, <code>optional_compiler_flag</code>,
+ <code>cxx_flag</code>, and <code>optional_cxx_flag</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>user_compile_flags</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of flags from either the
+ <code>copt</code> rule attribute or the <code>--copt</code>,
+ <code>--cxxopt</code>, and <code>--conlyopt</code> flags.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>unfiltered_compile_flags</code></strong>
+ </td>
+ <td><code>[compile]</code> Sequence of flags from the
+ <code>unfiltered_cxx_flag</code> legacy CROSSTOOL field or the
+ <code>unfiltered _compile_flags</code> feature. These are not filtered by
+ the <code>nocopts</code> rule attribute.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>sysroot</code></strong>
+ </td>
+ <td>The <code>sysroot</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>runtime_library_search_directories</code></strong>
+ </td>
+ <td><code>[link]</code> Entries in the linker runtime search path (usually
+ set with the <code>-rpath</code> flag).
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>library_search_directories</code></strong>
+ </td>
+ <td><code>[link]</code> Entries in the linker search path (usually set with
+ the <code>-L</code> flag).
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>libraries_to_link</code></strong>
+ </td>
+ <td><code>[link]</code> Flags providing files to link as inputs in the linker
+ invocation.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>def_file_path</code></strong>
+ </td>
+ <td><code>[link]</code> Location of def file used on Windows with MSVC.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>linker_param_file</code></strong>
+ </td>
+ <td><code>[link]</code> Location of linker param file created by bazel to
+ overcome command line length limit.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>output_execpath</code></strong>
+ </td>
+ <td><code>[link]</code> execpath of the output of the linker.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>generate_interface_library</code></strong>
+ </td>
+ <td><code>[link]</code> "yes"|"no" depending on whether interface library
+ should be generated.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>interface_library_builder_path</code></strong>
+ </td>
+ <td><code>[link]</code> Path to the interface library builder tool.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>interface_library_input_path</code></strong>
+ </td>
+ <td><code>[link]</code> Input for the interface library ifso builder tool.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>interface_library_output_path</code></strong>
+ </td>
+ <td><code>[link]</code> Path where to generate interface library using the
+ <code>ifso</code> builder tool.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>legacy_link_flags</code></strong>
+ </td>
+ <td><code>[link]</code> Linker flags coming from the legacy crosstool fields.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>user_link_flags</code></strong>
+ </td>
+ <td><code>[link]</code> Linker flags coming from the <code>--linkopt</code>
+ or <code>linkopts</code> attribute.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>symbol_counts_output</code></strong>
+ </td>
+ <td><code>[link]</code> Path to which to write symbol counts.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>linkstamp_paths</code></strong>
+ </td>
+ <td><code>[link]</code> A build variable giving linkstamp paths.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>force_pic</code></strong>
+ </td>
+ <td><code>[link]</code> Presence of this variable indicates that PIC code
+ should be generated.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>strip_debug_symbols</code></strong>
+ </td>
+ <td><code>[link]</code> Presence of this variable indicates that the debug
+ symbols should be stripped.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>is_cc_test</code></strong>
+ </td>
+ <td><code>[link]</code> Truthy when current action is a <code>cc_test</code>
+ linking action, false otherwise.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>is_using_fission</code></strong>
+ </td>
+ <td><code>[link]</code> Presence of this variable indicates that files were
+ compiled with fission. Debug info is in <code>.dwo</code> files instead
+ of <code>.o</code> files and the linker needs to know this.
+ </td>
+ </tr>
+</table>
+
+
+
+### CROSSTOOL features
+
+The following is a reference of CROSSTOOL features and their activation
+conditions.
+
+<table>
+ <col width="300">
+ <col width="600">
+ <tr>
+ <td><strong>Feature</strong>
+ </td>
+ <td><strong>Activation Condition</strong>
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>opt | dbg | fastbuild</code></strong>
+ </td>
+ <td>Enabled by default based on compilation mode.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>static_linking_mode | dynamic_linking_mode</code></strong>
+ </td>
+ <td>Enabled by default based on linking mode.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>random_seed</code></strong>
+ </td>
+ <td>Enabled by default.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>dependency_file</code></strong>
+ </td>
+ <td>Enabled by default.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>per_object_debug_info</code></strong>
+ </td>
+ <td>Enabled if the `supports_fission` attribute is set in the CROSSTOOL file
+ and the current compilation mode is specified in the
+ <code>--fission</code> flag.
+ </td>
+ </tr>
+ <tr>
+ <td><strong><code>pic</code></strong>
+ </td>
+ <td>Required if the target needs PIC objects for dynamic libraries, always
+ enabled, pic build variable is present when PIC compilation is requested.
+ </td>
+ </tr>
+</table>