Google-internal change.

PiperOrigin-RevId: 558799297
Change-Id: I2756afc66d4c1a5450abd1fdf5520e9a40f4de97
diff --git a/docs/crubit_and_crosstool_release.md b/docs/crubit_and_crosstool_release.md
new file mode 100644
index 0000000..95412ed
--- /dev/null
+++ b/docs/crubit_and_crosstool_release.md
@@ -0,0 +1,108 @@
+# Crubit and Crosstool release
+
+<!--*
+# Document freshness: For more information, see <internal link>.
+freshness: { owner: 'lujin' reviewed: '2023-08-18' }
+*-->
+
+[TOC]
+
+TODO(b/274102056): Write summary on this docs when close to completion.
+
+The bindings generators components of Crubit are being released, and it's
+released by [the Crosstool release](<internal link>) process.
+
+Specifically, bindings generators components that are in Crosstool release are:
+
+*   The bindings generator tools:
+
+    *   //rs_bindings_from_cc:rs_bindings_from_cc
+    *   //cc_bindings_from_rs:cc_bindings_from_rs
+
+    They are built from the targets above and released at
+    google3/nowhere/llvm/rust/crubit/bin/.
+
+*   Crubit support libraries: support/.
+
+    They are copied as source files and transformed and are released at
+    google3/nowhere/llvm/rust/crubit/support/.
+
+This means that when you `bazel build`, say a `rust_binary` with `cc_deps`:
+
+*   The "released" version of the `cc_bindings_from_rs` bindings generator tool
+    in `third_party/crosstool` is invoked to generate the Rust binding, instead
+    of the one freshly-built from  with the latest
+    and your workspace changes.
+
+*   The "released" version of the Crubit support libraries are used in your
+    bindings.
+
+## Documentation for Crubit developers
+
+The following sections are meant for Crubit developers.
+
+### Different Crubit flavors
+
+Concretely, a "Crubit flavor" is a combination of build flag values that impacts
+which Crubit is used and how Crubit is built.
+
+#### Flags that control "Crubit flavor"
+
+2 boolean flags determine flavor of Crubit:
+
+*   `//google_internal/build_flavors:on_demand`: if true, use
+    Crubit built from your workspace which has your local changes, otherwise,
+    use the prebuilt binding generators in one of the Crosstool directories.
+    `--config=crubit-on-demand` for short.
+
+*   `//third_party/crosstool:unstable_flag`: if true, use Crosstool unstable
+    toolchains in all build actions - notably, the actions that build Crubit
+    binding generators (if on-demand), the actions that build Rust crates (e.g.,
+    for a `rust_binary` with `cc_deps`) or C++ libraries, otherwise use the
+    Crosstool stable toolchains. `--config=llvm-unstable` for short.
+
+#### 4 flavors and where they are useful
+
+The combination of the 2 boolean flags results in the 4 following Crubit
+flavors.
+(google_internal/build_flavors/crubit_build_flavor_defs.bzl
+has the full specification and exports `crubit_build_flavors` for easier
+reference.)
+
+`stable`
+:   Uses the prebuilt Crubit in Crosstool stable directory, which gets released
+    by rapid/llvm_crosstool ~weekly.
+
+    This is also the `default` flavor of Crubit.
+
+`llvm_unstable`
+:   Uses the prebuilt Crubit in Crosstool unstable directory.
+    rapid/rust_crosstool_unstable builds Crosstool unstable Crubit bindings
+    generators using the freshly bootstrapped "unstable" rust toolchain ~daily.
+
+    This flavor is useful for exercising the process of rebuilding Crubit
+    binding generators and branching the support library source file, before the
+    Crosstool stable release. For example, it can catch the case that the
+    dependency of Crubit support libraries isn't visible from Crosstool
+    directories.
+
+`on_demand_built_with_llvm_unstable`
+:   Uses the Crubit built from your workspace that has your local changes using
+    the Crosstool unstable toolchains (rustc, rustc-as-a-library, clang, etc.)
+    throughout.
+
+    This will soon be the default flavor for Crubit *development*.
+
+    This flavor is useful for detecting upstream rustc changes that are
+    incompatible with Crubit, before Crosstool release: Crubit depends closely
+    on rustc-as-a-library API, which isn't stable; upstream rustc library
+    changes are first surfaced through Crosstool unstable rust.
+
+`on_demand_built_with_llvm_stable`
+:   Similar to `on_demand_built_with_llvm_unstable`, except that Crosstool
+    stable toolchains (rustc, rustc-as-a-library, clang, etc.) is used
+    throughout the build.
+
+    This flavor combination exists, but it won't be exercised by TAP/Guitar. It
+    may become helpful as a backup for local development in case Crosstool
+    unstable toolchains are broken.