Add support for the Rust toolchain

To enable Rust build targets in standalone dawn:
- Add `checkout_rust: True` to the gclient `custom_vars` section. As
  it defaults to false:
    "custom_vars": {
      "checkout_rust": True,
    }
- Set `enable_rust = true` in GN args, as it also defaults to false.
- Run gclient sync

Then building `rust_build_tests` will build test targets in
//build/rust/tests, which rely on and verify the functioning of
the Rust toolchain.

Make new rust targets by using the GN templates in //build/rust.

In the chromium build, Rust build targets that use the templates
from //build/rust will just work.

------

Dependent steps that are already done:
1) The //tools/rust repo needs to be created in
   https://bugs.chromium.org/p/chromium/issues/detail?id=1494128
2) Then, we should remove the checkout_tools_rust DEPS var,
3) And update the tools/clang and tools/rust revisions so that they
   are compatible.
4) Roll the chromium //build changes that were required in from
   https://chromium-review.googlesource.com/c/chromium/src/+/4956874
   and
   https://chromium-review.googlesource.com/c/chromium/src/+/4966201
5) The clang roll causes clang-cl to warn on use of offsetof, but it
   does not define __GNUC__, which is used to remove the warning. So
   also remove the warning when __clang__ is defined.

Bug: chromium:1494118
Change-Id: I5e280090ec950a1da9f91e2e4717925ce4b2eaa6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/157120
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: danakj <danakj@chromium.org>
diff --git a/DEPS b/DEPS
index eec063d..682db69 100644
--- a/DEPS
+++ b/DEPS
@@ -35,6 +35,14 @@
   # Fetch clang-tidy into the same bin/ directory as our clang binary.
   'checkout_clang_tidy': False,
 
+  # Fetch the rust toolchain.
+  #
+  # Use a custom_vars section to enable it:
+  # "custom_vars": {
+  #   "checkout_rust": True,
+  # }
+  'checkout_rust': False,
+
   # Fetch configuration files required for the 'use_remoteexec' gn arg
   'download_remoteexec_cfg': False,
   # RBE instance to use for running remote builds
@@ -53,11 +61,6 @@
 }
 
 deps = {
-  # Dependencies required to use GN/Clang in standalone
-  'build': {
-    'url': '{chromium_git}/chromium/src/build@5885d3c24833ad72845a52a1b913a2b8bc651b56',
-    'condition': 'dawn_standalone',
-  },
   'buildtools': {
     'url': '{chromium_git}/chromium/src/buildtools@a9a6f0c49d0e8fa0cda37337430b4736ab3dc944',
     'condition': 'dawn_standalone',
@@ -101,10 +104,21 @@
     'condition': 'dawn_standalone',
   },
 
-  'tools/clang': {
-    'url': '{chromium_git}/chromium/src/tools/clang@8f75392b4aa947fb55c7c206b36804229595e4da',
+  # Dependencies required to use GN, Clang, and Rust in standalone.
+  # The //build, //tools/clang, and //tools/rust deps should all be updated
+  # in unison, as there are dependencies between them.
+  'build': {
+    'url': '{chromium_git}/chromium/src/build@e2f4d00875f7d00fad39d5af2c6869ac7c7413cc',
     'condition': 'dawn_standalone',
   },
+  'tools/clang': {
+    'url': '{chromium_git}/chromium/src/tools/clang@86aed39db276fb876a2b98c93cc6ff8940377903',
+    'condition': 'dawn_standalone',
+  },
+  'tools/rust': {
+    'url': '{chromium_git}/chromium/src/tools/rust@7052bd3aa0eba2d3d701b7a76219e3b04770540e',
+    'condition': 'dawn_standalone and checkout_rust',
+  },
   'tools/clang/dsymutil': {
     'packages': [{
       'package': 'chromium/llvm-build-tools/dsymutil',
@@ -333,6 +347,12 @@
                '--package=clang-tidy'],
   },
   {
+    'name': 'rust',
+    'pattern': '.',
+    'action': ['python3', 'tools/rust/update_rust.py'],
+    'condition': 'dawn_standalone and checkout_rust',
+  },
+  {
     # Pull rc binaries using checked-in hashes.
     'name': 'rc_win',
     'pattern': '.',