workspace: Adds rules to generate markdown docs
diff --git a/cc_toolchain/BUILD.bazel b/cc_toolchain/BUILD.bazel
index 952167f..c1d3272 100644
--- a/cc_toolchain/BUILD.bazel
+++ b/cc_toolchain/BUILD.bazel
@@ -4,6 +4,8 @@
     "@rules_cc_toolchain//cc_toolchain:cc_toolchain_import.bzl",
     "cc_toolchain_import",
 )
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
 
 cc_toolchain_import(
     name = "all_imports",
@@ -131,3 +133,35 @@
     toolchain = ":linux_x86_64_toolchain",
     toolchain_type = "@rules_cc//cc:toolchain_type",
 )
+
+STARLARK_SRCS = [
+    "cc_toolchain",
+    "cc_toolchain_import",
+    "sysroot",
+    "toolchain_config",
+]
+
+bzl_library(
+    name = "srcs",
+    srcs = [src + ".bzl" for src in STARLARK_SRCS],
+    visibility = ["//visibility:public"],
+)
+
+[
+    stardoc(
+        name = src + "_doc",
+        out = src + "_doc.md",
+        input = src + ".bzl",
+        deps = [
+            ":srcs",
+            "//third_party:bazel_tools_cc_action_names",
+            "//third_party:rules_cc",
+        ],
+    )
+    for src in STARLARK_SRCS
+]
+
+filegroup(
+    name = "docs",
+    srcs = [":" + src + "_doc" for src in STARLARK_SRCS],
+)
diff --git a/cc_toolchain/features/BUILD.bazel b/cc_toolchain/features/BUILD.bazel
index 844fb7a..7050823 100644
--- a/cc_toolchain/features/BUILD.bazel
+++ b/cc_toolchain/features/BUILD.bazel
@@ -4,6 +4,10 @@
     "cc_toolchain_import_feature",
     "cc_toolchain_sysroot_feature",
 )
+load(
+    "@io_bazel_stardoc//stardoc:stardoc.bzl",
+    "stardoc",
+)
 
 package(
     default_visibility = ["//cc_toolchain:__pkg__"],
@@ -183,3 +187,13 @@
     ],
     provides = ["c_standard"],
 ) for c_version in C_VERSIONS]
+
+stardoc(
+    name = "features_doc",
+    out = "features_doc.md",
+    input = "features.bzl",
+    deps = [
+        "//cc_toolchain:srcs",
+        "//third_party:rules_cc",
+    ],
+)
diff --git a/config/BUILD.bazel b/config/BUILD.bazel
index dd4e519..f94d4cd 100644
--- a/config/BUILD.bazel
+++ b/config/BUILD.bazel
@@ -1,4 +1,5 @@
 load("//cc_toolchain:cc_toolchain_import.bzl", "cc_toolchain_import")
+load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
 
 package(
     default_visibility = ["//visibility:public"],
@@ -65,3 +66,14 @@
 cc_toolchain_import(
     name = "empty",
 )
+
+stardoc(
+    name = "rules_cc_toolchain_config_docs",
+    out = "rules_cc_toolchain_config_docs.md",
+    input = "rules_cc_toolchain_config_repository.bzl",
+)
+
+filegroup(
+    name = "docs",
+    srcs = [":rules_cc_toolchain_config_docs"],
+)
diff --git a/config/rules_cc_toolchain_config_repository.bzl b/config/rules_cc_toolchain_config_repository.bzl
index 8eb102e..a549ddf 100644
--- a/config/rules_cc_toolchain_config_repository.bzl
+++ b/config/rules_cc_toolchain_config_repository.bzl
@@ -7,6 +7,29 @@
         "build_file": attr.label(
             allow_single_file = True,
             default = "@rules_cc_toolchain//config:rules_cc_toolchain_config.BUILD",
+            doc = "The build file containing the configurations for this toolchain.",
         ),
     },
+    doc = """
+A toolchain configuration.
+
+To override the default configuration use this rule before calling `rules_cc_toolchain_deps`.
+
+Example:
+```python
+load("@rules_cc_toolchain//config:rules_cc_toolchain_config_repository.bzl", 
+    "rules_cc_toolchain_config")
+
+rules_cc_toolchain_config(
+    name = "rules_cc_toolchain_config",
+    build_file = "@my_workspace//config:my_config.BUILD",
+)
+
+load("//:rules_cc_toolchain_deps.bzl", "rules_cc_toolchain_deps")
+
+# Must be called after rules_cc_toolchain_config rule to successfully override 
+# the configuration.
+rules_cc_toolchain_deps()
+```
+""",
 )
diff --git a/rules_cc_toolchain_deps.bzl b/rules_cc_toolchain_deps.bzl
index 8a8578e..aefb91c 100644
--- a/rules_cc_toolchain_deps.bzl
+++ b/rules_cc_toolchain_deps.bzl
@@ -3,6 +3,8 @@
 load("@rules_cc_toolchain//config:rules_cc_toolchain_config_repository.bzl", "rules_cc_toolchain_config")
 
 def rules_cc_toolchain_deps():
+    """Fetches the toolchain dependencies """
+
     # Setup latest version of Bazels platform repos. This should be called
     # before all other workspace deps.
     # Required by modules: cc_toolchain.
diff --git a/third_party/BUILD b/third_party/BUILD
index e69de29..558e6e9 100644
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -0,0 +1,17 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+
+bzl_library(
+    name = "rules_cc",
+    srcs = [
+        "@rules_cc//cc:srcs",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+bzl_library(
+    name = "bazel_tools_cc_action_names",
+    srcs = [
+        "@bazel_tools//tools/build_defs/cc:action_names",
+    ],
+    visibility = ["//visibility:public"],
+)
diff --git a/tools/clang_tidy/BUILD.bazel b/tools/clang_tidy/BUILD.bazel
index 4540fd9..eb3f58a 100644
--- a/tools/clang_tidy/BUILD.bazel
+++ b/tools/clang_tidy/BUILD.bazel
@@ -1,7 +1,19 @@
 load(":clang_tidy.bzl", "clang_tidy_config")
+load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
 
 clang_tidy_config(
     name = "default",
     config = ".clang-tidy",
     visibility = ["//visibility:public"],
 )
+
+stardoc(
+    name = "docs",
+    out = "clang_tidy_doc.md",
+    input = "clang_tidy.bzl",
+    symbol_names = [
+        "clang_tidy_config",
+        "clang_tidy_aspect",
+    ],
+    deps = ["//third_party:rules_cc"],
+)
diff --git a/tools/clang_tidy/clang_tidy.bzl b/tools/clang_tidy/clang_tidy.bzl
index 4969f3b..20b5ce7 100644
--- a/tools/clang_tidy/clang_tidy.bzl
+++ b/tools/clang_tidy/clang_tidy.bzl
@@ -170,44 +170,44 @@
     },
     toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
     doc = """
-    Runs clang-tidy on the given C++ sources
+Runs clang-tidy on the given C++ sources
 
-    This aspect runs clang-tidy on the given set of c/c++ sources. You can use this aspect
-    by running;
-    ``` sh
-    bazel build //my:target \\ 
-        --aspects build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect
-    ```
+This aspect runs clang-tidy on the given set of c/c++ sources. You can use this aspect
+by running;
+``` sh
+bazel build //my:target \\ 
+    --aspects build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect
+```
 
-    You can override the default configuration by using the clang_tidy_config rule. e.g.
-    ```py
-    # //BUILD.bazel
-    cc_toolchain_config(
-        name = "my_config",
-        config = ".clang-tidy",
-    )
-    ```
-    The passing in a command line flag to point the aspect at your new config rule e.g.
-    ``` sh
-    bazel build //my:target \\ 
-        --aspects @build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect \\
-        --@rules_cc_toolchain_config//:clang_tidy_config=//:my_config
-    ```
+You can override the default configuration by using the clang_tidy_config rule. e.g.
+```py
+# //BUILD.bazel
+cc_toolchain_config(
+    name = "my_config",
+    config = ".clang-tidy",
+)
+```
+The passing in a command line flag to point the aspect at your new config rule e.g.
+``` sh
+bazel build //my:target \\ 
+    --aspects @build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect \\
+    --@rules_cc_toolchain_config//:clang_tidy_config=//:my_config
+```
     
-    In most cases it is likely that you will want to shorten the command line flags using 
-    your .bazelrc file. e.g.
-    ```
-    # //.bazelrc
-    build:analyze --aspects @build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect
-    build:analyze --@rules_cc_toolchain_config//:clang_tidy_config=//:my_config
-    ```
+In most cases it is likely that you will want to shorten the command line flags using 
+your .bazelrc file. e.g.
+```
+# //.bazelrc
+build:analyze --aspects @build_bazel_rules_cc//cc:clang_tidy:clang_tidy.bzl%clang_tidy_aspect
+build:analyze --@rules_cc_toolchain_config//:clang_tidy_config=//:my_config
+```
 
-    You can then run the analysis using the following command;
-    ``` sh
-    bazel build //my:target --config analyze
-    ```
+You can then run the analysis using the following command;
+``` sh
+bazel build //my:target --config analyze
+```
 
-    """,
+""",
 )
 
 def _clang_tidy_config_impl(ctx):
@@ -218,6 +218,8 @@
     attrs = {
         "config": attr.label(
             allow_single_file = [".clang-tidy"],
+            mandatory = True,
+            doc = "Clang tidy config file.",
         ),
     },
     provides = [ClangTidyConfigInfo],