initial checkin of skydoc skylark rule
diff --git a/BUILD b/BUILD
index a8f9c00..70f0b5b 100644
--- a/BUILD
+++ b/BUILD
@@ -3,6 +3,7 @@
 package(default_visibility = ["//visibility:public"])
 
 load("//:skylark_library.bzl", "skylark_library")
+load("//:skydoc.bzl", "skydoc")
 
 exports_files([
     "LICENSE",
@@ -41,3 +42,12 @@
     name = "skylark_library",
     srcs = ["skylark_library.bzl"],
 )
+
+skydoc(
+    name = "skydoc_doc",
+    target_file = ":skydoc.bzl",
+    deps = [":skylark_library"],
+    rule_names = ["skydoc"],
+    out = "skydoc_doc.txt",
+)
+
diff --git a/WORKSPACE b/WORKSPACE
index 5458cd5..9a3d36d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1 +1,13 @@
 workspace(name = "bazel_skylib")
+
+git_repository(
+    name = "io_bazel",
+    remote = "https://github.com/bazelbuild/bazel.git",
+    commit = "6964a0b68444333ed13a355a7f6799adb931b4aa",
+)
+
+http_archive(
+    name = "com_google_protobuf",
+    strip_prefix = "protobuf-3.5.1",
+    urls = ["https://github.com/google/protobuf/archive/v3.5.1.zip"],
+)
diff --git a/skydoc.bzl b/skydoc.bzl
new file mode 100644
index 0000000..f53e209
--- /dev/null
+++ b/skydoc.bzl
@@ -0,0 +1,64 @@
+"""Rules for generating skylark documentation"""
+
+load(":skylark_library.bzl", "SkylarkLibraryInfo")
+
+def _skydoc_impl(ctx):
+    """Implementation of the skydoc rule."""
+    out_file = ctx.outputs.out
+    input_files = depset(order = "postorder", direct = [ctx.files.target_file[0]], transitive = [
+        dep[SkylarkLibraryInfo].transitive_srcs
+        for dep in ctx.attr.deps
+    ])
+    args = [
+        str(ctx.files.target_file[0].owner),
+        ctx.outputs.out.path,
+    ] + ctx.attr.rule_names
+    skydoc = ctx.executable.skydoc
+
+    ctx.actions.run(
+        outputs = [out_file],
+        inputs = input_files,
+        executable = skydoc,
+        arguments = args,
+        mnemonic = "Skydoc",
+        progress_message = ("Generating Skylark doc for %s" %
+                            (ctx.label.name)),
+    )
+
+skydoc = rule(
+    _skydoc_impl,
+    doc = """
+Generates documentation for exported skylark rule definitions in a target skylark file.
+""",
+    attrs = {
+        "target_file": attr.label(
+            doc = "The skylark file to generate documentation for.",
+            allow_files = [".bzl"],
+        ),
+        "deps": attr.label_list(
+            doc = "A list of skylark_library dependencies which target_file depends on.",
+            providers = [SkylarkLibraryInfo],
+            allow_files = False,
+        ),
+        "out": attr.output(
+            doc = "The file to which documentation will be output.",
+            mandatory = True,
+        ),
+        "rule_names": attr.string_list(
+            doc = """
+A list of rule names to generate documentation for. These should correspond to
+the names of exported symbols for rule definitions in the target file. If this list
+is empty, then documentation for all exported rule definitions will be generated.
+""",
+            default = [],
+        ),
+        "skydoc": attr.label(
+            doc = "The location of the skydoc tool.",
+            allow_files = True,
+            default = Label("@io_bazel//src/main/java/com/google/devtools/build/skydoc"),
+            cfg = "host",
+            executable = True,
+        ),
+    },
+)
+