aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar David Chen <dzc@google.com>2015-10-22 21:40:31 +0000
committerGravatar John Field <jfield@google.com>2015-10-23 14:55:37 +0000
commite1bd5dabe8deb03e40d3754ab0c0b237994e4f04 (patch)
tree42824e3c4fad2eebb46021da934078970425cd5b /src/main/java/com
parent576819885a67ad1dfecd96641a4522e2817c61ec (diff)
Split Build Encyclopedia into multiple pages.
-- MOS_MIGRATED_REVID=106092764
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/docgen/BuildEncyclopediaProcessor.java166
-rw-r--r--src/main/java/com/google/devtools/build/docgen/DocgenConsts.java11
-rw-r--r--src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java32
-rw-r--r--src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java16
-rw-r--r--src/main/java/com/google/devtools/build/docgen/SummaryRuleFamily.java9
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be-header.vm318
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/be-nav.vm35
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/common-definitions.vm169
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/footer.vm2
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/functions.vm (renamed from src/main/java/com/google/devtools/build/docgen/templates/be-footer.vm)417
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/header.vm (renamed from src/main/java/com/google/devtools/build/docgen/templates/header-comment.vm)3
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/make-variables.vm (renamed from src/main/java/com/google/devtools/build/docgen/templates/build-encyclopedia.vm)127
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/overview.vm122
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/predefined-python-variables.vm16
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm69
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/skylark-library.vm2
16 files changed, 787 insertions, 727 deletions
diff --git a/src/main/java/com/google/devtools/build/docgen/BuildEncyclopediaProcessor.java b/src/main/java/com/google/devtools/build/docgen/BuildEncyclopediaProcessor.java
index 9b1810dc16..66923b10a7 100644
--- a/src/main/java/com/google/devtools/build/docgen/BuildEncyclopediaProcessor.java
+++ b/src/main/java/com/google/devtools/build/docgen/BuildEncyclopediaProcessor.java
@@ -25,11 +25,13 @@ import com.google.common.collect.Sets;
import com.google.devtools.build.docgen.DocgenConsts.RuleType;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.util.Pair;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -61,74 +63,45 @@ public class BuildEncyclopediaProcessor {
/**
* Collects and processes all the rule and attribute documentation in inputDirs and
- * generates the Build Encyclopedia into the outputRootDir.
- *
+ * generates the Build Encyclopedia into the outputDir.
+ *
* @param inputDirs list of directory to scan for document in the source code
* @param outputRootDir output directory where to write the build encyclopedia
* @param blackList optional path to a file listing rules to not document
*/
- public void generateDocumentation(String[] inputDirs, String outputRootDir, String blackList)
+ public void generateDocumentation(String[] inputDirs, String outputDir, String blackList)
throws BuildEncyclopediaDocException, IOException {
- File buildEncyclopediaPath = setupDirectories(outputRootDir);
-
- Page page = TemplateEngine.newPage(
- "com/google/devtools/build/docgen/templates/build-encyclopedia.vm");
+ writeStaticPage(outputDir, "make-variables");
+ writeStaticPage(outputDir, "predefined-python-variables");
+ writeStaticPage(outputDir, "functions");
+ writeCommonDefinitionsPage(outputDir);
BuildDocCollector collector = new BuildDocCollector(ruleClassProvider, false);
Map<String, RuleDocumentation> ruleDocEntries = collector.collect(inputDirs, blackList);
warnAboutUndocumentedRules(
Sets.difference(ruleClassProvider.getRuleClassMap().keySet(), ruleDocEntries.keySet()));
- writeRuleClassDocs(ruleDocEntries.values(), page);
- page.write(buildEncyclopediaPath);
- }
-
- /**
- * Categorizes, checks and prints all the rule-class documentations.
- */
- private void writeRuleClassDocs(Iterable<RuleDocumentation> docEntries, Page page)
- throws BuildEncyclopediaDocException, IOException {
- Set<RuleDocumentation> binaryDocs = new TreeSet<>();
- Set<RuleDocumentation> libraryDocs = new TreeSet<>();
- Set<RuleDocumentation> testDocs = new TreeSet<>();
- Set<RuleDocumentation> otherDocs = new TreeSet<>();
-
- for (RuleDocumentation doc : docEntries) {
- RuleClass ruleClass = ruleClassProvider.getRuleClassMap().get(doc.getRuleName());
- if (!ruleClass.isDocumented()) {
- continue;
- }
-
- if (doc.isLanguageSpecific()) {
- switch(doc.getRuleType()) {
- case BINARY:
- binaryDocs.add(doc);
- break;
- case LIBRARY:
- libraryDocs.add(doc);
- break;
- case TEST:
- testDocs.add(doc);
- break;
- case OTHER:
- otherDocs.add(doc);
- break;
- }
- } else {
- otherDocs.add(doc);
- }
- }
+ writeRuleDocs(outputDir, ruleDocEntries.values());
+ }
- renderBeHeader(docEntries, page);
+ private void writeStaticPage(String outputDir, String name) throws IOException {
+ File file = new File(outputDir + "/" + name + ".html");
+ Page page = TemplateEngine.newPage(
+ "com/google/devtools/build/docgen/templates/be/" + name + ".vm");
+ page.write(file);
+ }
- page.add("binaryDocs", binaryDocs);
- page.add("libraryDocs", libraryDocs);
- page.add("testDocs", testDocs);
- page.add("otherDocs", otherDocs);
+ private void writeCommonDefinitionsPage(String outputDir) throws IOException {
+ File file = new File(outputDir + "/common-definitions.html");
+ Page page = TemplateEngine.newPage(DocgenConsts.COMMON_DEFINITIONS_TEMPLATE);
+ page.add("commonAttributes", PredefinedAttributes.COMMON_ATTRIBUTES);
+ page.add("testAttributes", PredefinedAttributes.TEST_ATTRIBUTES);
+ page.add("binaryAttributes", PredefinedAttributes.BINARY_ATTRIBUTES);
+ page.write(file);
}
- private void renderBeHeader(Iterable<RuleDocumentation> docEntries, Page page)
- throws BuildEncyclopediaDocException {
+ private void writeRuleDocs(String outputDir, Iterable<RuleDocumentation> docEntries)
+ throws BuildEncyclopediaDocException, IOException {
// Separate rule families into language-specific and generic ones.
Set<String> languageSpecificRuleFamilies = new TreeSet<>();
Set<String> genericRuleFamilies = new TreeSet<>();
@@ -138,26 +111,70 @@ public class BuildEncyclopediaProcessor {
Map<String, ListMultimap<RuleType, RuleDocumentation>> ruleMapping = new HashMap<>();
createRuleMapping(docEntries, ruleMapping);
+ // Pairs of (normalized rule family name, rule family name), which used for generating
+ // the BE navigation with rule families listed in the same order as those listed in
+ // the overview table.
+ List<Pair<String, String>> ruleFamilyNames = new ArrayList<>(
+ languageSpecificRuleFamilies.size() + genericRuleFamilies.size());
+
List<SummaryRuleFamily> languageSpecificSummaryFamilies =
new ArrayList<SummaryRuleFamily>(languageSpecificRuleFamilies.size());
for (String ruleFamily : languageSpecificRuleFamilies) {
+ ListMultimap<RuleType, RuleDocumentation> ruleTypeMap = ruleMapping.get(ruleFamily);
+ String ruleFamilyId = RuleDocumentation.normalize(ruleFamily);
languageSpecificSummaryFamilies.add(
- new SummaryRuleFamily(ruleMapping.get(ruleFamily), ruleFamily));
+ new SummaryRuleFamily(ruleTypeMap, ruleFamily, ruleFamilyId));
+ writeRuleDoc(outputDir, ruleFamily, ruleFamilyId, ruleTypeMap);
+ ruleFamilyNames.add(Pair.<String, String>of(ruleFamilyId, ruleFamily));
}
List<SummaryRuleFamily> otherSummaryFamilies =
new ArrayList<SummaryRuleFamily>(genericRuleFamilies.size());
for (String ruleFamily : genericRuleFamilies) {
- otherSummaryFamilies.add(
- new SummaryRuleFamily(ruleMapping.get(ruleFamily), ruleFamily));
+ ListMultimap<RuleType, RuleDocumentation> ruleTypeMap = ruleMapping.get(ruleFamily);
+ String ruleFamilyId = RuleDocumentation.normalize(ruleFamily);
+ otherSummaryFamilies.add(new SummaryRuleFamily(ruleTypeMap, ruleFamily, ruleFamilyId));
+ writeRuleDoc(outputDir, ruleFamily, ruleFamilyId, ruleTypeMap);
+ ruleFamilyNames.add(Pair.<String, String>of(ruleFamilyId, ruleFamily));
}
+ writeOverviewPage(outputDir, languageSpecificSummaryFamilies, otherSummaryFamilies);
+ writeBeNav(outputDir, ruleFamilyNames);
+ }
+ private void writeOverviewPage(String outputDir,
+ List<SummaryRuleFamily> languageSpecificSummaryFamilies,
+ List<SummaryRuleFamily> otherSummaryFamilies)
+ throws BuildEncyclopediaDocException, IOException {
+ File file = new File(outputDir + "/overview.html");
+ Page page = TemplateEngine.newPage(DocgenConsts.OVERVIEW_TEMPLATE);
page.add("langSpecificSummaryFamilies", languageSpecificSummaryFamilies);
page.add("otherSummaryFamilies", otherSummaryFamilies);
- page.add("commonAttributes", PredefinedAttributes.COMMON_ATTRIBUTES);
- page.add("testAttributes", PredefinedAttributes.TEST_ATTRIBUTES);
- page.add("binaryAttributes", PredefinedAttributes.BINARY_ATTRIBUTES);
- page.add(DocgenConsts.VAR_LEFT_PANEL, generateLeftNavigationPanel(docEntries));
+ page.write(file);
+ }
+
+ private void writeRuleDoc(String outputDir, String ruleFamily, String ruleFamilyId,
+ ListMultimap<RuleType, RuleDocumentation> ruleTypeMap)
+ throws BuildEncyclopediaDocException, IOException {
+ List<RuleDocumentation> rules = new LinkedList<>();
+ rules.addAll(ruleTypeMap.get(RuleType.BINARY));
+ rules.addAll(ruleTypeMap.get(RuleType.LIBRARY));
+ rules.addAll(ruleTypeMap.get(RuleType.TEST));
+ rules.addAll(ruleTypeMap.get(RuleType.OTHER));
+
+ File file = new File(outputDir + "/" + ruleFamilyId + ".html");
+ Page page = TemplateEngine.newPage(DocgenConsts.RULES_TEMPLATE);
+ page.add("ruleFamily", ruleFamily);
+ page.add("ruleFamilyId", ruleFamilyId);
+ page.add("ruleDocs", rules);
+ page.write(file);
+ }
+
+ private void writeBeNav(String outputDir, List<Pair<String, String>> ruleFamilyNames)
+ throws IOException {
+ File file = new File(outputDir + "/be-nav.html");
+ Page page = TemplateEngine.newPage(DocgenConsts.BE_NAV_TEMPLATE);
+ page.add("ruleFamilyNames", ruleFamilyNames);
+ page.write(file);
}
/**
@@ -205,35 +222,6 @@ public class BuildEncyclopediaProcessor {
}
}
- private String generateLeftNavigationPanel(Iterable<RuleDocumentation> docEntries) {
- // Order the rules alphabetically. At this point they are ordered according to
- // RuleDocumentation.compareTo() which is not alphabetical.
- TreeMap<String, String> ruleNames = new TreeMap<>();
- for (RuleDocumentation ruleDoc : docEntries) {
- String ruleName = ruleDoc.getRuleName();
- ruleNames.put(ruleName.toLowerCase(), ruleName);
- }
- StringBuilder sb = new StringBuilder();
- for (String ruleName : ruleNames.values()) {
- RuleClass ruleClass = ruleClassProvider.getRuleClassMap().get(ruleName);
- Preconditions.checkNotNull(ruleClass);
- if (ruleClass.isDocumented()) {
- sb.append(String.format("<a href=\"#%s\">%s</a><br/>\n", ruleName, ruleName));
- }
- }
- return sb.toString();
- }
-
- private File setupDirectories(String outputRootDir) {
- if (outputRootDir != null) {
- File outputRootPath = new File(outputRootDir);
- outputRootPath.mkdirs();
- return new File(outputRootDir + File.separator + DocgenConsts.BUILD_ENCYCLOPEDIA_NAME);
- } else {
- return new File(DocgenConsts.BUILD_ENCYCLOPEDIA_NAME);
- }
- }
-
private static void warnAboutUndocumentedRules(Iterable<String> rulesWithoutDocumentation) {
Iterable<String> undocumentedRules = Iterables.filter(rulesWithoutDocumentation,
RULE_WORTH_DOCUMENTING);
diff --git a/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java b/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
index ec5b5fa0bd..31a63aded0 100644
--- a/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
+++ b/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
@@ -29,9 +29,14 @@ public class DocgenConsts {
public static final String LS = "\n";
- public static final String HEADER_TEMPLATE = "templates/be-header.html";
- public static final String FOOTER_TEMPLATE = "templates/be-footer.html";
- public static final String BODY_TEMPLATE = "templates/be-body.html";
+ public static final String COMMON_DEFINITIONS_TEMPLATE =
+ "com/google/devtools/build/docgen/templates/be/common-definitions.vm";
+ public static final String OVERVIEW_TEMPLATE =
+ "com/google/devtools/build/docgen/templates/be/overview.vm";
+ public static final String RULES_TEMPLATE =
+ "com/google/devtools/build/docgen/templates/be/rules.vm";
+ public static final String BE_NAV_TEMPLATE =
+ "com/google/devtools/build/docgen/templates/be/be-nav.vm";
public static final String SKYLARK_LIBRARY_TEMPLATE =
"com/google/devtools/build/docgen/templates/skylark-library.vm";
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
index 4d0a68b407..a7105e37fb 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.docgen;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.docgen.DocgenConsts.RuleType;
@@ -104,6 +105,20 @@ public class RuleDocumentation implements Comparable<RuleDocumentation> {
}
/**
+ * Returns a "normalized" version of the input string. Used to convert rule family names into
+ * strings that are more friendly as file names. For example, "C / C++" is converted to
+ * "c-cpp".
+ */
+ @VisibleForTesting
+ static String normalize(String s) {
+ return s.toLowerCase()
+ .replace("+", "p")
+ .replaceAll("[()]", "")
+ .replaceAll("[\\s/]", "-")
+ .replaceAll("[-]+", "-");
+ }
+
+ /**
* Returns the number of first line of the rule documentation in its declaration file.
*/
int getStartLineCount() {
@@ -208,15 +223,22 @@ public class RuleDocumentation implements Comparable<RuleDocumentation> {
*/
public String getAttributeSignature() {
StringBuilder sb = new StringBuilder();
- sb.append(String.format(
- "%s(<a href=\"#%s.name\">name</a>, ",
- ruleName, ruleName));
+ sb.append(String.format("%s(<a href=\"#%s.name\">name</a>, ", ruleName, ruleName));
int i = 0;
for (RuleDocumentationAttribute attributeDoc : attributes) {
String attrName = attributeDoc.getAttributeName();
// Generate the link for the attribute documentation
- sb.append(String.format("<a href=\"#%s.%s\">%s</a>",
- attributeDoc.getGeneratedInRule(ruleName).toLowerCase(), attrName, attrName));
+ if (attributeDoc.isCommonType()) {
+ sb.append(String.format("<a href=\"common-definitions.html#%s.%s\">%s</a>",
+ attributeDoc.getGeneratedInRule(ruleName).toLowerCase(),
+ attrName,
+ attrName));
+ } else {
+ sb.append(String.format("<a href=\"#%s.%s\">%s</a>",
+ attributeDoc.getGeneratedInRule(ruleName).toLowerCase(),
+ attrName,
+ attrName));
+ }
if (i < attributes.size() - 1) {
sb.append(", ");
} else {
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
index 4021d344a4..9c46fd5376 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
@@ -44,16 +44,16 @@ public class RuleDocumentationAttribute implements Comparable<RuleDocumentationA
.put(Type.STRING, "String")
.put(Type.STRING_LIST, "List of strings")
.put(BuildType.TRISTATE, "Integer")
- .put(BuildType.LABEL, "<a href=\"build-ref.html#labels\">Label</a>")
- .put(BuildType.LABEL_LIST, "List of <a href=\"build-ref.html#labels\">labels</a>")
+ .put(BuildType.LABEL, "<a href=\"../build-ref.html#labels\">Label</a>")
+ .put(BuildType.LABEL_LIST, "List of <a href=\"../build-ref.html#labels\">labels</a>")
.put(BuildType.LABEL_DICT_UNARY,
- "Dictionary mapping strings to <a href=\"build-ref.html#labels\">labels</a>")
+ "Dictionary mapping strings to <a href=\"../build-ref.html#labels\">labels</a>")
.put(BuildType.LABEL_LIST_DICT,
- "Dictionary mapping strings to lists of <a href=\"build-ref.html#labels\">labels</a>")
- .put(BuildType.NODEP_LABEL, "<a href=\"build-ref.html#name\">Name</a>")
- .put(BuildType.NODEP_LABEL_LIST, "List of <a href=\"build-ref.html#name\">names</a>")
- .put(BuildType.OUTPUT, "<a href=\"build-ref.html#filename\">Filename</a>")
- .put(BuildType.OUTPUT_LIST, "List of <a href=\"build-ref.html#filename\">filenames</a>")
+ "Dictionary mapping strings to lists of <a href=\"../build-ref.html#labels\">labels</a>")
+ .put(BuildType.NODEP_LABEL, "<a href=\"../build-ref.html#name\">Name</a>")
+ .put(BuildType.NODEP_LABEL_LIST, "List of <a href=\"../build-ref.html#name\">names</a>")
+ .put(BuildType.OUTPUT, "<a href=\"../build-ref.html#filename\">Filename</a>")
+ .put(BuildType.OUTPUT_LIST, "List of <a href=\"../build-ref.html#filename\">filenames</a>")
.build();
private final Class<? extends RuleDefinition> definitionClass;
diff --git a/src/main/java/com/google/devtools/build/docgen/SummaryRuleFamily.java b/src/main/java/com/google/devtools/build/docgen/SummaryRuleFamily.java
index 7f1c78f425..c55f146ae3 100644
--- a/src/main/java/com/google/devtools/build/docgen/SummaryRuleFamily.java
+++ b/src/main/java/com/google/devtools/build/docgen/SummaryRuleFamily.java
@@ -30,14 +30,17 @@ import java.util.List;
@Immutable
public class SummaryRuleFamily {
private final String name;
+ private final String id;
private final ImmutableList<RuleDocumentation> binaryRules;
private final ImmutableList<RuleDocumentation> libraryRules;
private final ImmutableList<RuleDocumentation> testRules;
private final ImmutableList<RuleDocumentation> otherRules1;
private final ImmutableList<RuleDocumentation> otherRules2;
- SummaryRuleFamily(ListMultimap<RuleType, RuleDocumentation> ruleTypeMap, String name) {
+ SummaryRuleFamily(ListMultimap<RuleType, RuleDocumentation> ruleTypeMap,
+ String name, String id) {
this.name = name;
+ this.id = id;
this.binaryRules = ImmutableList.copyOf(ruleTypeMap.get(RuleType.BINARY));
this.libraryRules = ImmutableList.copyOf(ruleTypeMap.get(RuleType.LIBRARY));
this.testRules = ImmutableList.copyOf(ruleTypeMap.get(RuleType.TEST));
@@ -58,6 +61,10 @@ public class SummaryRuleFamily {
return name;
}
+ public String getId() {
+ return id;
+ }
+
public List<RuleDocumentation> getBinaryRules() {
return binaryRules;
}
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be-header.vm b/src/main/java/com/google/devtools/build/docgen/templates/be-header.vm
deleted file mode 100644
index e10b1b54a0..0000000000
--- a/src/main/java/com/google/devtools/build/docgen/templates/be-header.vm
+++ /dev/null
@@ -1,318 +0,0 @@
-<html>
-<head>
-
- <title>Bazel BUILD Encyclopedia of Functions</title>
- <link href="docs_style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div style="width:100%;">
-<div id="left-panel" style="margin-left:-80px;height:97%;float:left;position:fixed;overflow-y:scroll;overflow-x:hidden;border-right:thin solid #000000;resize:horizontal;">
-<h3 style="margin-left:0px">Rules:</h3>
-
-${LEFT_PANEL}
-
-</div>
-<div id="main-panel" style="margin-left:200px">
-
-<h1>Bazel BUILD Encyclopedia of Functions</h1>
-<h2>Contents</h2>
-
- <h3>Concepts and terminology</h3>
- <table class="layout"><tr><td>
- <ul class="be-toc">
- <li><a href="#common-definitions">Common definitions</a>:
- <ul>
- <li><a href="#sh-tokenization">Bourne shell tokenization</a></li>
- <li><a href="#label-expansion">Label expansion</a></li>
- <li><a href="#common-attributes">Common attributes</a></li>
- <li><a href="#common-attributes-tests">Common attributes for tests</a></li>
- <li><a href="#common-attributes-binaries">Common attributes for binaries</a></li>
- <li><a href="#configurable-attributes">Configurable attributes</a></li>
- <li><a href="#implicit-outputs">Implicit output targets</a></li>
- </ul>
- </li>
- </ul>
- </td><td>
- <ul class="be-toc">
- <li><a href="#make_variables">"Make" variables</a>
- <ul class="be-toc">
- <li><a href="#make-var-substitution">"Make" variable substitution</a></li>
- <li><a href="#predefined_variables">Predefined variables</a></li>
-
- </ul>
- <li><a href="#predefined-python-variables">Predefined Python Variables</a></li>
- </ul>
- </td><td>
- <ul class="be-toc">
- <li><a href="#load">load</a></li>
-
- <li><a href="#package">package</a></li>
- <li><a href="#package_group">package_group</a></li>
-
- <li><a href="#licenses">licenses</a></li>
- <li><a href="#exports_files">exports_files</a></li>
- <li><a href="#glob">glob</a></li>
- <li><a href="#select">select</a></li>
- <li><a href="#workspace">workspace</a></li>
- </ul>
- </td></tr></table>
-
- <h3>Rules</h3>
-
-<h4>Language-specific Rules</h4>
-
-#macro(summaryTable $ruleFamilies)
- <tbody>
- #foreach($ruleFamily in $ruleFamilies)
- <tr>
- <td class="lang">${ruleFamily.name}</td>
- <td>
- #foreach($ruleDoc in $ruleFamily.binaryRules)
- <a href="#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
- ${ruleDoc.ruleName}
- </a>
- <br />
- #end
- </td>
- <td>
- #foreach($ruleDoc in $ruleFamily.libraryRules)
- <a href="#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
- ${ruleDoc.ruleName}
- </a>
- <br />
- #end
- </td>
- <td>
- #foreach($ruleDoc in $ruleFamily.testRules)
- <a href="#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
- ${ruleDoc.ruleName}
- </a>
- <br />
- #end
- </td>
- <td>
- #foreach($ruleDoc in $ruleFamily.otherRules1)
- <a href="#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
- ${ruleDoc.ruleName}
- </a>
- <br />
- #end
- </td>
- <td>
- #foreach($ruleDoc in $ruleFamily.otherRules2)
- <a href="#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
- ${ruleDoc.ruleName}
- </a>
- <br />
- #end
- </td>
- </tr>
- #end
- </tbody>
-#end
-
-<table class="table table-condensed table-striped" summary="Table of rules sorted by language">
- <colgroup span="6" width="20%"></colgroup>
- <thead>
- <tr>
- <th>Language</th>
- <th>Binary rules</th>
- <th>Library rules</th>
- <th>Test rules</th>
- <th>Other rules</th>
- <th></th>
- </tr>
- </thead>
-#summaryTable($langSpecificSummaryFamilies)
-
-</table>
-<h4>Rules that do not apply to a specific programming language</h4>
-
-<table class="table table-condensed table-striped" summary="Table of rules not specific to a programming language">
- <colgroup span="6" width="20%"></colgroup>
-#summaryTable($otherSummaryFamilies)
-
-</table>
-
-<h4>Rules implemented as Skylark extensions</h4>
-
-<p>
-The Bazel team provides a set of supported build rules written using the
-<a href="/docs/skylark/index.html">Skylark</a> rules framework. These rules
-should be explicitly <a href="#load">load</a>ed. They allow you to build the
-following:
-</p>
-
-<ul>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/closure">
- Closure libraries</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/docker">
- Docker images</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/groovy">
- Groovy projects</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/appengine">
- Java App Engine applications</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/d">
- D projects</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/rust">
- Rust projects</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/jsonnet">
- Jsonnet files</a></li>
-<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/scala">
- Scala projects</a> - experimental</li>
-</ul>
-
-<h2 id="common-definitions">Common definitions</h2>
-
-<p>This section defines various terms and concepts that are common to
-many functions or build rules below.
-</p>
-
-<h3 id='sh-tokenization'>Bourne shell tokenization</h3>
-<p>
- Certain string attributes of some rules are split into multiple
- words according to the tokenization rules of the Bourne shell:
- unquoted spaces delimit separate words, and single- and
- double-quotes characters and backslashes are used to prevent
- tokenization.
-</p>
-<p>
- Those attributes that are subject to this tokenization are
- explicitly indicated as such in their definitions in this document.
-</p>
-<p>
- Attributes subject to "Make" variable expansion and Bourne shell
- tokenization are typically used for passing arbitrary options to
- compilers and other tools. Examples of such attributes are
- <code>cc_library.copts</code> and <code>java_library.javacopts</code>.
- Together these substitutions allow a
- single string variable to expand into a configuration-specific list
- of option words.
-</p>
-
-<h3 id='label-expansion'>Label expansion</h3>
-<p>
- Some string attributes of a very few rules are subject to label
- expansion: if those strings contain a valid label as a
- substring, such as <code>//mypkg:target</code>, and that label is a
- declared prerequisite of the current rule, it is expanded into the
- pathname of the file represented by the target <code>//mypkg:target</code>.
-</p>
-
-<p>
- Example attributes include <code>genrule.cmd</code> and
- <code>cc_binary.linkopts</code>. The details may vary significantly in
- each case, over such issues as: whether relative labels are
- expanded; how labels that expand to multiple files are
- treated, etc. Consult the rule attribute documentation for
- specifics.
-</p>
-
-<h3 id="common-attributes">Attributes common to all build rules</h3>
-
-#macro(commonAttributeDoc $type $attributeMap)
- <table class="table table-condensed table-bordered table-params">
- <colgroup>
- <col class="col-param" />
- <col class="param-description" />
- </colgroup>
- <thead>
- <tr>
- <th>Attribute</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- #foreach ($name in $attributeMap.keySet())
- <tr>
- <td id="${type}.${name}"><code>${name}</code></td>
- <td>${attributeMap.get($name).htmlDocumentation}</td>
- </tr>
- #end
- </tbody>
- </table>
-#end
-
-<p>This section describes attributes that are common to all build rules.<br/>
-Please note that it is an error to list the same label twice in a list of
-labels attribute.
-</p>
-
-#commonAttributeDoc("common" $commonAttributes)
-
-<h3 id="common-attributes-tests">Attributes common to all test rules (*_test)</h3>
-
-<p>This section describes attributes that are common to all test rules.</p>
-
-#commonAttributeDoc("test" $testAttributes)
-
-<h3 id="common-attributes-binaries">Attributes common to all binary rules (*_binary)</h3>
-
-<p>This section describes attributes that are common to all binary rules.</p>
-
-#commonAttributeDoc("binary" $binaryAttributes)
-
-<h3 id="configurable-attributes">Configurable attributes</h3>
-
-<p>
- Most rule attributes can be "configured" so that their values can
- depend on the command-line flags passed to Bazel. This can be used,
- for example, to declare platform-dependent <code>srcs</code> or custom
- compiler flags depending on the
- <a href="bazel-user-manual.html#flag--compilation_mode">compilation
- mode</a>. This feature is very close in spirit to
- <a href="#cc_library.abi_deps">abi_deps</a>, except that it's not
- limited to <code>cc_*</code> rules and the <code>deps</code> attribute.
-</p>
-
-</p>
-
-<h3 id="implicit-outputs">Implicit output targets</h3>
-
-<p>When you define a build rule in a BUILD file, you are explicitly
- declaring a new, named rule target in a package. Many build rule
- functions also <i>implicitly</i> entail one or more output file
- targets, whose contents and meaning are rule-specific.
-
- For example, when you explicitly declare a
- <code>java_binary(name='foo', ...)</code> rule, you are also
- <i>implicitly</i> declaring an output file
- target <code>foo_deploy.jar</code> as a member of the same package.
- (This particular target is a self-contained Java archive suitable
- for deployment.)
-</p>
-
-<p>
- Implicit output targets are first-class members of the global
- target graph. Just like other targets, they are built on demand,
- either when specified in the top-level built command, or when they
- are necessary prerequisites for other build targets. They can be
- referenced as dependencies in BUILD files, and can be observed in
- the output of analysis tools such as <code>bazel query</code>.
-</p>
-
-<p>
- For each kind of build rule, the rule's documentation contains a
- special section detailing the names and contents of any implicit
- outputs entailed by a declaration of that kind of rule.
-</p>
-
-<p>
- An important but somewhat subtle distinction between the
- two namespaces used by the build system:
- <a href="build-ref.html#labels">labels</a> identify <em>targets</em>,
- which may be rules or files, and file targets may be divided into
- either source (or input) file targets and derived (or output) file
- targets. These are the things you can mention in BUILD files,
- build from the command-line, or examine using <code>bazel query</code>;
- this is the <em>target namespace</em>. Each file target corresponds
- to one actual file on disk (the "file system namespace"); each rule
- target may correspond to zero, one or more actual files on disk.
- There may be files on disk that have no corresponding target; for
- example, <code>.o</code> object files produced during C++ compilation
- cannot be referenced from within BUILD files or from the command line.
- In this way, the build tool may hide certain implementation details of
- how it does its job. This is explained more fully in
- the <a href="build-ref.html">BUILD Concept Reference</a>.
-</p>
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/be-nav.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/be-nav.vm
new file mode 100644
index 0000000000..3f0df10b9a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/be-nav.vm
@@ -0,0 +1,35 @@
+#set ($path = "/docs/be")
+<h3>Build Encyclopedia</h3>
+<ul class="sidebar-nav">
+ <li><a href="${path}/overview.html">Overview</a></li>
+ <li>
+
+ <a data-toggle="collapse" href="#be-menu" aria-expanded="false"
+ aria-controls="be-menu">
+ Concepts <span class="caret"></span>
+ </a>
+ <ul class="collapse sidebar-nav sidebar-submenu" id="be-menu">
+ <li><a href="${path}/common-definitions.html">Common Definitions</a></li>
+ <li><a href="${path}/make-variables.html">"Make" variables</a></li>
+ <li><a href="${path}/predefined-python-variables.html">Predefined Python Variables</a></li>
+ </ul>
+ </li>
+ <li class="sidebar-nav-heading">Built-in Rules</li>
+ <li><a href="${path}/functions.html">Functions</a></li>
+ #foreach ($namePair in $ruleFamilyNames)
+ <li><a href="${path}/${namePair.getFirst()}.html">${namePair.getSecond()}</a></li>
+ #end
+
+ <li class="sidebar-nav-heading">Skylark Rules</li>
+ <li><a href="${path}/appengine.html">Java AppEngine</a></li>
+ <li><a href="${path}/closure.html">Closure Tools</a></li>
+ <li><a href="${path}/d.html">D</a></li>
+ <li><a href="${path}/docker.html">Docker</a></li>
+ <li><a href="${path}/groovy.html">Groovy</a></li>
+ <li><a href="${path}/go.html">Go</a></li>
+ <li><a href="${path}/jsonnet.html">Jsonnet</a></li>
+ <li><a href="${path}/pkg.html">Packaging</a></li>
+ <li><a href="${path}/rust.html">Rust</a></li>
+ <li><a href="${path}/sass.html">Sass</a></li>
+ <li><a href="${path}/scala.html">Scala</a></li>
+</ul>
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/common-definitions.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/common-definitions.vm
new file mode 100644
index 0000000000..4b33058e7c
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/common-definitions.vm
@@ -0,0 +1,169 @@
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
+
+<h1>Common definitions</h1>
+
+<p>This section defines various terms and concepts that are common to
+many functions or build rules below.
+</p>
+
+<div class="toc">
+ <h1>Contents</h1>
+ <ul>
+ <li><a href="#borne-shell-tokenization">Borne shell tokenization</a></li>
+ <li><a href="#label-expansion">Label Expansion</a></li>
+ <li><a href="#common-attributes">Attributes common to all build rules</a></li>
+ <li><a href="#common-attributes-tests">Attributes common to all test rules (*_test)</a></li>
+ <li><a href="#common-attributes-binaries">Attributes common to all binary rules (*_binary)</a></li>
+ <li><a href="#configurable-attributes">Configurable attributes</a></li>
+ <li><a href="#implicit-outputs">Implicit output targets</a></li>
+ </ul>
+</div>
+<h2 id='sh-tokenization'>Bourne shell tokenization</h2>
+<p>
+ Certain string attributes of some rules are split into multiple
+ words according to the tokenization rules of the Bourne shell:
+ unquoted spaces delimit separate words, and single- and
+ double-quotes characters and backslashes are used to prevent
+ tokenization.
+</p>
+<p>
+ Those attributes that are subject to this tokenization are
+ explicitly indicated as such in their definitions in this document.
+</p>
+<p>
+ Attributes subject to "Make" variable expansion and Bourne shell
+ tokenization are typically used for passing arbitrary options to
+ compilers and other tools. Examples of such attributes are
+ <code>cc_library.copts</code> and <code>java_library.javacopts</code>.
+ Together these substitutions allow a
+ single string variable to expand into a configuration-specific list
+ of option words.
+</p>
+
+<h2 id='label-expansion'>Label expansion</h2>
+<p>
+ Some string attributes of a very few rules are subject to label
+ expansion: if those strings contain a valid label as a
+ substring, such as <code>//mypkg:target</code>, and that label is a
+ declared prerequisite of the current rule, it is expanded into the
+ pathname of the file represented by the target <code>//mypkg:target</code>.
+</p>
+
+<p>
+ Example attributes include <code>genrule.cmd</code> and
+ <code>cc_binary.linkopts</code>. The details may vary significantly in
+ each case, over such issues as: whether relative labels are
+ expanded; how labels that expand to multiple files are
+ treated, etc. Consult the rule attribute documentation for
+ specifics.
+</p>
+
+<h2 id="common-attributes">Attributes common to all build rules</h2>
+
+#macro(commonAttributeDoc $type $attributeMap)
+ <table class="table table-condensed table-bordered table-params">
+ <colgroup>
+ <col class="col-param" />
+ <col class="param-description" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ #foreach ($name in $attributeMap.keySet())
+ <tr>
+ <td id="${type}.${name}"><code>${name}</code></td>
+ <td>${attributeMap.get($name).htmlDocumentation}</td>
+ </tr>
+ #end
+ </tbody>
+ </table>
+#end
+
+<p>This section describes attributes that are common to all build rules.<br/>
+Please note that it is an error to list the same label twice in a list of
+labels attribute.
+</p>
+
+#commonAttributeDoc("common" $commonAttributes)
+
+<h2 id="common-attributes-tests">Attributes common to all test rules (*_test)</h2>
+
+<p>This section describes attributes that are common to all test rules.</p>
+
+#commonAttributeDoc("test" $testAttributes)
+
+<h2 id="common-attributes-binaries">Attributes common to all binary rules (*_binary)</h2>
+
+<p>This section describes attributes that are common to all binary rules.</p>
+
+#commonAttributeDoc("binary" $binaryAttributes)
+
+<h2 id="configurable-attributes">Configurable attributes</h2>
+
+<p>
+ Most rule attributes can be "configured" so that their values can
+ depend on the command-line flags passed to Bazel. This can be used,
+ for example, to declare platform-dependent <code>srcs</code> or custom
+ compiler flags depending on the
+ <a href="bazel-user-manual.html#flag--compilation_mode">compilation
+ mode</a>. This feature is very close in spirit to
+ <a href="#cc_library.abi_deps">abi_deps</a>, except that it's not
+ limited to <code>cc_*</code> rules and the <code>deps</code> attribute.
+</p>
+
+</p>
+
+<h2 id="implicit-outputs">Implicit output targets</h2>
+
+<p>When you define a build rule in a BUILD file, you are explicitly
+ declaring a new, named rule target in a package. Many build rule
+ functions also <i>implicitly</i> entail one or more output file
+ targets, whose contents and meaning are rule-specific.
+
+ For example, when you explicitly declare a
+ <code>java_binary(name='foo', ...)</code> rule, you are also
+ <i>implicitly</i> declaring an output file
+ target <code>foo_deploy.jar</code> as a member of the same package.
+ (This particular target is a self-contained Java archive suitable
+ for deployment.)
+</p>
+
+<p>
+ Implicit output targets are first-class members of the global
+ target graph. Just like other targets, they are built on demand,
+ either when specified in the top-level built command, or when they
+ are necessary prerequisites for other build targets. They can be
+ referenced as dependencies in BUILD files, and can be observed in
+ the output of analysis tools such as <code>bazel query</code>.
+</p>
+
+<p>
+ For each kind of build rule, the rule's documentation contains a
+ special section detailing the names and contents of any implicit
+ outputs entailed by a declaration of that kind of rule.
+</p>
+
+<p>
+ An important but somewhat subtle distinction between the
+ two namespaces used by the build system:
+ <a href="build-ref.html#labels">labels</a> identify <em>targets</em>,
+ which may be rules or files, and file targets may be divided into
+ either source (or input) file targets and derived (or output) file
+ targets. These are the things you can mention in BUILD files,
+ build from the command-line, or examine using <code>bazel query</code>;
+ this is the <em>target namespace</em>. Each file target corresponds
+ to one actual file on disk (the "file system namespace"); each rule
+ target may correspond to zero, one or more actual files on disk.
+ There may be files on disk that have no corresponding target; for
+ example, <code>.o</code> object files produced during C++ compilation
+ cannot be referenced from within BUILD files or from the command line.
+ In this way, the build tool may hide certain implementation details of
+ how it does its job. This is explained more fully in
+ the <a href="build-ref.html">BUILD Concept Reference</a>.
+</p>
+
+#parse("com/google/devtools/build/docgen/templates/be/footer.vm")
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/footer.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/footer.vm
new file mode 100644
index 0000000000..19c5ea8f3b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/footer.vm
@@ -0,0 +1,2 @@
+<!-- Generated footer -->
+
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be-footer.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/functions.vm
index cd308b4f3b..548f005c4d 100644
--- a/src/main/java/com/google/devtools/build/docgen/templates/be-footer.vm
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/functions.vm
@@ -1,65 +1,134 @@
-
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
+
+<h1>Functions</h1>
+
+<div class="toc">
+ <h1>Contents</h1>
+ <ul>
+ <li><a href="#load">load</a></li>
+ <li><a href="#package">package</a></li>
+ <li><a href="#package_group">package_group</a></li>
+ <li><a href="#licenses">licenses</a></li>
+ <li><a href="#exports_files">exports_files</a></li>
+ <li><a href="#glob">glob</a></li>
+ <li><a href="#select">select</a></li>
+ <li><a href="#workspace">workspace</a></li>
+ </ul>
+</div>
<!-- =================================================================
- package()
+ load()
=================================================================
-->
-<h3 id="package">package</h3>
+<h2 id="load">load</h2>
-<p><code>package(default_deprecation,
+<pre>load(path, symbols...)</pre>
- default_testonly,
- default_visibility,
- features)</code>
+<p><code>load()</code> is a statement that imports definitions from a
+ Skylark module (<code>.bzl</code> file). For example:
</p>
-<p>This function declares metadata that applies to every subsequent rule in the
-package. It is used at most once within a package (BUILD file).</p>
+<pre class="code">
+load("/tools/build_rules/build_test", "build_test")
-<p>It is recommended that the package function is called at the top of the
-file, before any rule.</p>
+build_test(name = ...)
+</pre>
-<h4 id="package_args">Arguments</h4>
+<p>This will execute the
-<ul>
- <li id="package.default_visibility"><code>default_visibility</code>:
- The default visibility of the rules in this package.
- <i>(List of <a href="build-ref.html#labels">labels</a>; optional)</i><br/>
-
- <p>Every rule in this package has the visibility specified in this
- attribute, unless otherwise specified in the <code>visibility</code>
- attribute of the rule. For detailed information about the syntax of this
- attribute, see the documentation of the <a href="#common.visibility">visibility</a>
- attribute. The package default visibility does not apply to
-
- <a href="#exports_files">exports_files</a>, which is
- public by default.
- </li>
+ Skylark
+ module <code>tools/build_rules/build_test.bzl</code> and import the symbol
+ <code>build_test</code> in the local environment. This is useful for
+ using macros or for sharing values between multiple BUILD files. By
+ using more arguments, you can load more symbols at once.</p>
- <li id="package.default_deprecation"><code>default_deprecation</code>:
- Sets the default <a href="#common.deprecation"><code>deprecation</code></a> message
- for all rules in this package. <i>(String; optional)</i>
- </li>
+<p>Relative paths are allowed only to load a file from the same directory
+ (not a subdirectory), e.g.</p>
- <li id="package.default_testonly"><code>default_testonly</code>:
- Sets the default <a href="#common.testonly"><code>testonly</code></a> property
- for all rules in this package. <i>(Boolean; optional; default is 0 except as noted)</i>
+<pre class="code">
+load("build_defs", "COMPILER_FLAGS", "LINKER_FLAGS")
+</pre>
- <p>In packages under <code>javatests</code> the default value is 1.</p>
- </li>
+<!-- =================================================================
+ package()
+ =================================================================
+-->
- <li id="package.features"><code>features</code>:
- Sets various flags that affect the semantics of this BUILD file.
- <i>(List strings; optional)</i>
+<h2 id="package">package</h2>
- <p>This feature is mainly used by the people working on the build system to
- tag packages that need some kind of special handling. Do not use this unless
- explicitly requested by someone working on the build system.</p>
- </li>
+<pre>package(default_deprecation,
-</ul>
+ default_testonly,
+ default_visibility,
+ features)
+</pre>
-<h4 id="package_example">Examples</h4>
+<p>This function declares metadata that applies to every subsequent rule in the
+package. It is used at most once within a package (BUILD file).</p>
+
+<p>It is recommended that the package function is called at the top of the
+file, before any rule.</p>
+
+<h3 id="package_args">Arguments</h3>
+
+<table class="table table-condensed table-bordered table-params">
+ <colgroup>
+ <col class="col-param" />
+ <col class="param-description" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td id="package.default_visibility"><code>default_visibility</code></td>
+ <td>
+ <p><code>List of <a href="build-ref.html#labels">labels</a>; optional</code></p>
+ <p>The default visibility of the rules in this package.</p>
+ <p>Every rule in this package has the visibility specified in this
+ attribute, unless otherwise specified in the <code>visibility</code>
+ attribute of the rule. For detailed information about the syntax of this
+ attribute, see the documentation of the <a href="#common.visibility">visibility</a>
+ attribute. The package default visibility does not apply to
+ <a href="#exports_files">exports_files</a>, which is
+ public by default.</p>
+ </td>
+ </tr>
+ <tr>
+ <td id="package.default_deprecation"><code>default_deprecation</code></td>
+ <td>
+ <p><code>String; optional</code></p>
+ <p>Sets the default <a href="#common.deprecation"><code>deprecation</code></a> message
+ for all rules in this package.</p>
+ </td>
+ </tr>
+ <tr>
+ <td id="package.default_testonly"><code>default_testonly</code></td>
+ <td>
+ <p><code>Boolean; optional; default is 0 except as noted</code></p>
+ <p>Sets the default <a href="#common.testonly"><code>testonly</code></a> property
+ for all rules in this package.</p>
+ <p>In packages under <code>javatests</code> the default value is 1.</p>
+ </td>
+ </tr>
+ <tr>
+ <td id="package.features"><code>features</code></td>
+ <td>
+ <p><code>List strings; optional</code></p>
+ <p>Sets various flags that affect the semantics of this BUILD file.</p>
+ <p>This feature is mainly used by the people working on the build system to
+ tag packages that need some kind of special handling. Do not use this unless
+ explicitly requested by someone working on the build system.</p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<h3 id="package_example">Examples</h3>
The declaration below declares that the rules in this package are
visible only to members of package
@@ -75,9 +144,9 @@ package(default_visibility = ["//foo:target"])
=================================================================
-->
-<h3 id="package_group">package_group</h3>
+<h2 id="package_group">package_group</h2>
-<p><code>package_group(name, packages, includes)</code></p>
+<pre>package_group(name, packages, includes)</pre>
<p>This function defines a set of packages and assigns a label to the
group. The label can be referenced in <code>visibility</code> attributes.</p>
@@ -87,49 +156,67 @@ to one or more package groups, every rule in the entire source tree, or only to
in the same package. For more detailed description of the visibility system, see
the <a href="#common.visibility">visibility</a> attribute.
-<h4 id="package_group_args">Arguments</h4>
-
-<ul>
- <li id="package_group.name"><code>name</code>:
- A unique name for this rule.
- <i>(<a href="build-ref.html#name">Name</a>; required)</i>
- </li>
-
- <li id="package_group.packages"><code>packages</code>:
- A complete enumeration of packages in this group.
- <i>(List of <a href="build-ref.html#s4">Package</a>; optional)</i><br/>
-
- <p>Packages should be referred to using their full names,
- starting with a double slash. For
- example, <code>//foo/bar/main</code> is a valid element
- of this list.</p>
-
- <p>You can also specify wildcards: the specification
- <code>//foo/...</code> specifies every package under
- <code>//foo</code>, including <code>//foo</code> itself.
-
- <p>If this attribute is missing, the package group itself will contain
- no packages (but it can still include other package groups).</p>
- </li>
-
- <li id="package_group.includes"><code>includes</code>:
- Other package groups that are included in this one.
- <i>(List of <a href="build-ref.html#labels">labels</a>; optional)</i><br/>
-
- <p>The labels in this attribute must refer to other package
- groups. Packages in referenced package groups are taken to be part
- of this package group. This is transitive, that is, if package
- group <code>a</code> contains package group <code>b</code>,
- and <code>b</code> contains package group <code>c</code>, every
- package in <code>c</code> will also be a member of <code>a</code>.</p>
- </li>
-</ul>
-
-
-<h4 id="package_group_example">Examples</h4>
-
-The following <code>package_group</code> declaration specifies a
-package group called "tropical" that contains tropical fruits.
+<h3 id="package_group_args">Arguments</h3>
+
+<table class="table table-condensed table-bordered table-params">
+ <colgroup>
+ <col class="col-param" />
+ <col class="param-description" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td id="package_group.name"><code>name</code></td>
+ <td>
+ <p><code><a href="build-ref.html#name">Name</a>; required</code></p>
+ <p>A unique name for this rule.</p>
+ </td>
+ </tr>
+ <tr>
+ <td id="package_group.packages"><code>packages</code></td>
+ <td>
+ <p><code>List of <a href="build-ref.html#s4">Package</a>; optional</code></p>
+ <p>A complete enumeration of packages in this group.</p>
+
+ <p>Packages should be referred to using their full names,
+ starting with a double slash. For
+ example, <code>//foo/bar/main</code> is a valid element
+ of this list.</p>
+
+ <p>You can also specify wildcards: the specification
+ <code>//foo/...</code> specifies every package under
+ <code>//foo</code>, including <code>//foo</code> itself.</p>
+
+ <p>If this attribute is missing, the package group itself will contain
+ no packages (but it can still include other package groups).</p>
+ </td>
+ </tr>
+ <tr>
+ <td id="package_group.includes"><code>includes</code></td>
+ <td>
+ <p><code>List of <a href="build-ref.html#labels">labels</a>; optional</code></p>
+ <p>Other package groups that are included in this one.</p>
+
+ <p>The labels in this attribute must refer to other package
+ groups. Packages in referenced package groups are taken to be part
+ of this package group. This is transitive, that is, if package
+ group <code>a</code> contains package group <code>b</code>,
+ and <code>b</code> contains package group <code>c</code>, every
+ package in <code>c</code> will also be a member of <code>a</code>.</p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<h3 id="package_group_example">Examples</h3>
+
+<p>The following <code>package_group</code> declaration specifies a
+package group called "tropical" that contains tropical fruits.</p>
<pre class="code">
package_group(
@@ -142,8 +229,8 @@ package_group(
)
</pre>
-The following declarations specify the package groups of a fictional
-application:
+<p>The following declarations specify the package groups of a fictional
+application:</p>
<pre class="code">
package_group(
@@ -174,15 +261,54 @@ package_group(
)
</pre>
+<!-- =================================================================
+ licenses()
+ =================================================================
+-->
+
+<h2 id="licenses">licenses</h2>
+
+<pre>licenses(license_types)</pre>
+
+<p><code>licenses()</code> specifies the default license type (or types)
+ of the build rules in a <code>BUILD</code> file.
+
+ The <code>licenses()</code> directive should appear close to the
+ beginning of the <code>BUILD</code> file, before any build rules, as it
+ sets the <code>BUILD</code>-file scope default for build rule license
+ types.</p>
+
+<h3 id="licenses_args">Arguments</h3>
+
+<p>The argument, <code id="licenses.licence_types">license_types</code>,
+ is a list of license-type strings.
+ <!-- TODO(bazel-team): specify some examples -->
+
+</p>
+
+<h3 id="licenses_example">Examples</h3>
+
+<p>The following example specifies a single license type of
+ <code>"notice"</code>. Third-party software licenses that do not require
+ publishing of source code changes but require some sort of copyright or
+ other public notice are included in this license type.
+</p>
+
+<pre class="code">
+
+licenses(["notice"]) # MIT license
+
+exports_files(["jquery-2.1.1.js"])
+</pre>
<!-- =================================================================
exports_files([label, ...])
=================================================================
-->
-<h3 id="exports_files">exports_files</h3>
+<h2 id="exports_files">exports_files</h2>
-<p><code>exports_files([<i>label</i>, ...], visibility, licenses)</code></p>
+<pre>exports_files([<i>label</i>, ...], visibility, licenses)</pre>
<p>
<code>exports_files()</code> specifies a list of files belonging to
@@ -200,7 +326,7 @@ package_group(
shell scripts.)
</p>
-<h4 id="exports_files_args">Arguments</h4>
+<h3 id="exports_files_args">Arguments</h3>
<p>
The argument is a list of names of files within the current package. A
@@ -211,7 +337,7 @@ package_group(
<a href="#common.licenses">licenses</a> can also be specified.
</p>
-<h4 id="exports_files_example">Example</h4>
+<h3 id="exports_files_example">Example</h3>
<p>
The following example exports <code>golden.txt</code>, a
@@ -231,10 +357,9 @@ exports_files(["golden.txt"])
=================================================================
-->
-<h3 id="glob">glob</h3>
+<h2 id="glob">glob</h2>
-<p><code>glob(include, exclude=[], exclude_directories=1)</code>
-</p>
+<pre>glob(include, exclude=[], exclude_directories=1)</pre>
<p>
Glob is a helper function that can be used anywhere a list of filenames
@@ -321,7 +446,7 @@ enables generating individual rules for every input, for example. See the
<a href="#expanded_glob_example">expanded glob example</a> section below.
</p>
-<h4 id="glob_example">Glob Examples</h4>
+<h3 id="glob_example">Glob Examples</h3>
<p> Create a Java library built from all java files in this directory,
and all files generated by the <code>:gen_java_srcs</code> rule.</p>
@@ -356,7 +481,7 @@ sh_test(
)
</pre>
-<h4 id="recursive_glob_example">Recursive Glob Examples</h4>
+<h3 id="recursive_glob_example">Recursive Glob Examples</h3>
<p>Create a library built from all java files in this directory and all
subdirectories except those whose path includes a directory named testing.
@@ -383,7 +508,7 @@ sh_test(
)
</pre>
-<h4 id="expanded_glob_example">Expanded Glob Examples</h4>
+<h3 id="expanded_glob_example">Expanded Glob Examples</h3>
<p>
Create an individual genrule for *_test.cc in the current directory
@@ -412,91 +537,14 @@ $ bazel query '//foo:all' | sort
//foo:count_lines_c_test
</pre>
-
-<!-- =================================================================
- licenses()
- =================================================================
--->
-
-<h3 id="licenses">licenses</h3>
-
-<p><code>licenses(license_types)</code></p>
-
-<p><code>licenses()</code> specifies the default license type (or types)
- of the build rules in a <code>BUILD</code> file.
-
- The <code>licenses()</code> directive should appear close to the
- beginning of the <code>BUILD</code> file, before any build rules, as it
- sets the <code>BUILD</code>-file scope default for build rule license
- types.</p>
-
-<h4 id="licenses_args">Arguments</h4>
-
-<p>The argument, <code id="licenses.licence_types">license_types</code>,
- is a list of license-type strings.
- <!-- TODO(bazel-team): specify some examples -->
-
-</p>
-
-<h4 id="licenses_example">Examples</h4>
-
-<p>The following example specifies a single license type of
- <code>"notice"</code>. Third-party software licenses that do not require
- publishing of source code changes but require some sort of copyright or
- other public notice are included in this license type.
-</p>
-
-<pre class="code">
-
-licenses(["notice"]) # MIT license
-
-exports_files(["jquery-2.1.1.js"])
-</pre>
-
-<!-- =================================================================
- load()
- =================================================================
--->
-
-<h3 id="load">load</h3>
-
-<p><code>load(path, symbols...)</code></p>
-
-<p><code>load()</code> is a statement that imports definitions from a
- Skylark module (<code>.bzl</code> file). For example:
-</p>
-
-<pre class="code">
-load("/tools/build_rules/build_test", "build_test")
-
-build_test(name = ...)
-</pre>
-
-<p>This will execute the
-
- Skylark
- module <code>tools/build_rules/build_test.bzl</code> and import the symbol
- <code>build_test</code> in the local environment. This is useful for
- using macros or for sharing values between multiple BUILD files. By
- using more arguments, you can load more symbols at once.</p>
-
-<p>Relative paths are allowed only to load a file from the same directory
- (not a subdirectory), e.g.</p>
-
-<pre class="code">
-load("build_defs", "COMPILER_FLAGS", "LINKER_FLAGS")
-</pre>
-
-
<!-- =================================================================
select()
=================================================================
-->
-<h3 id="select">select</h3>
+<h2 id="select">select</h2>
-<p><code>select({conditionA: valuesA, conditionB: valuesB, ...})</code>
-</p>
+<pre>select({conditionA: valuesA, conditionB: valuesB, ...})</pre>
<p><code>select()</code> is the helper function that makes an
attribute for a
@@ -567,9 +615,9 @@ sh_binary(
=================================================================
-->
-<h3 id="workspace">workspace</h3>
+<h2 id="workspace">workspace</h2>
-<p><code>workspace(name = "something")</code></p>
+<pre>workspace(name = "something")</pre>
<p>This can only be used in the WORKSPACE file.</p>
@@ -587,7 +635,4 @@ sh_binary(
bar.runfiles/baz/qux/foo/bar).
</p>
-</div>
-</div>
-</body>
-</html>
+#parse("com/google/devtools/build/docgen/templates/be/footer.vm")
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/header-comment.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/header.vm
index 60504e8702..311c2d5a75 100644
--- a/src/main/java/com/google/devtools/build/docgen/templates/header-comment.vm
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/header.vm
@@ -1,7 +1,6 @@
-<!DOCTYPE html>
<!--
This document is synchronized with Bazel releases.
To edit, submit changes to the Bazel source code.
-->
-<!-- Generated by //src/main/java/com/google/devtools/build/docgen:build-encyclopedia.html -->
+<!-- Generated by //src/main/java/com/google/devtools/build/docgen:build-encyclopedia.zip -->
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/build-encyclopedia.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/make-variables.vm
index 2fbc20db66..773dcdf2ef 100644
--- a/src/main/java/com/google/devtools/build/docgen/templates/build-encyclopedia.vm
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/make-variables.vm
@@ -1,102 +1,18 @@
-#parse("com/google/devtools/build/docgen/templates/header-comment.vm")
-
-#parse("com/google/devtools/build/docgen/templates/be-header.vm")
-
-#macro(ruledoc $ruleDocs)
- #foreach ($rule in $ruleDocs)
- <h3 id="${rule.ruleName}"#if($rule.isDeprecated()) class="deprecated"#end>
- ${rule.ruleName}
- </h3>
-
- <pre class="rule-signature">${rule.attributeSignature}</pre>
-
- $rule.htmlDocumentation
-
- <h4 id="${rule.ruleName}_args">Arguments</h4>
- <table class="table table-condensed table-bordered table-params">
- <colgroup>
- <col class="col-param" />
- <col class="param-description" />
- </colgroup>
- <thead>
- <tr>
- <th>Attribute</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td id="${rule.ruleName}.name"><code>name</code></td>
- <td>
- <p><code><a href="build-ref.html#name">Name</a>; required</code></p>
- <p>A unique name for this rule.</p>
- ${rule.nameExtraHtmlDoc}
- </td>
- </tr>
- #foreach ($attribute in $rule.attributes)
- #if (!$attribute.isCommonType())
- <tr>
- <td id="${rule.ruleName.toLowerCase()}.${attribute.attributeName}"#if($attribute.isDeprecated()) class="deprecated"#end>
- <code>${attribute.attributeName}</code>
- </td>
- <td>
- #if (!$attribute.synopsis.isEmpty())
- <p><code>${attribute.synopsis}</code></p>
- #end
- $attribute.htmlDocumentation
- </td>
- </tr>
- #end
- #end
- </tbody>
- </table>
- #if ($rule.isPublicByDefault())
- The default visibility is public: <code>visibility = ["//visibility:public"]</code>.
- #end
- #end
-#end
-
-<!-- ============================================
- binary
- ============================================
--->
-<h2 id="binary">*_binary</h2>
-
-<p>A <code>*_binary</code> rule compiles an application. This might be
- an executable, a <code>.jar</code> file, and/or a collection of scripts.</p>
-
-#ruledoc($binaryDocs)
-
-<!-- ============================================
- library
- ============================================
--->
-<h2 id="library">*_library</h2>
-
-<p>A <code>*_library()</code> rule compiles some sources into a library.
- In general, a <code><var>language</var>_library</code> rule works like
- the corresponding <code><var>language</var>_binary</code> rule, but
- doesn't generate an executable.</p>
-
-#ruledoc($libraryDocs)
-
-<!-- ============================================
- test
- ============================================
--->
-<h2 id="test">*_test</h2>
-
-<p>A <code>*_test</code> rule compiles a test.
-
-#ruledoc($testDocs)
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
<!-- ============================================
variables
============================================
-->
-<h2 id="make_variables">"Make" Variables</h2>
-
-
+<h1>"Make" Variables</h1>
+
+<div class="toc">
+ <ul>
+ <li><a href="#make-var-substitution">"Make" variable subsitution</a></li>
+ <li><a href="#predefined-variables">Predefined variables</a></li>
+ <li><a href="#location">"$(location)" substitution</a></li>
+ </ul>
+</div>
<p>
This section describes how to use a special class of built-in string variables
that are called the "Make" environment.
@@ -116,7 +32,7 @@
the <a href="#genrule.cmd"><code>cmd</code> attribute of a genrule</a>.
</p>
-<h3 id='make-var-substitution'>"Make" variable substitution</h3>
+<h2 id='make-var-substitution'>"Make" variable substitution</h2>
<p>Variables can be referenced in attributes
@@ -145,7 +61,7 @@
explicitly indicated as such in their definitions in this document.
</p>
-<h3 id="predefined_variables">Predefined "Make" Variables</h3>
+<h2 id="predefined_variables">Predefined "Make" Variables</h2>
<p>Bazel defines a set of "Make" variables for you.</p>
@@ -279,21 +195,4 @@ in your genrule's cmd attribute.
<code>*_test</code> or <code>*_binary</code> rule.
</p>
-<h2 id="predefined-python-variables">Predefined Python Variables</h2>
-
-<h3 id="packagename">PACKAGE_NAME</h3>
-<p>
- This is a string variable with the name
- of the package being evaluated. The value is unaffected by subinclude.
-</p>
-
-<!-- ============================================
- other
- ============================================
--->
-<h2 id="misc">Other Stuff</h2>
-
-#ruledoc($otherDocs)
-
-
-#parse("com/google/devtools/build/docgen/templates/be-footer.vm")
+#parse("com/google/devtools/build/docgen/templates/be/footer.vm")
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/overview.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/overview.vm
new file mode 100644
index 0000000000..3a66308284
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/overview.vm
@@ -0,0 +1,122 @@
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
+
+<h1>Bazel BUILD Encyclopedia of Functions</h1>
+<h2>Contents</h2>
+
+<h3>Concepts and terminology</h3>
+
+<ul>
+ <li>
+ <a href="common-definitions.html">Common definitions</a>
+ <ul>
+ <li><a href="common-definitions.html#sh-tokenization">Bourne shell tokenization</a></li>
+ <li><a href="common-definitions.html#label-expansion">Label expansion</a></li>
+ <li><a href="common-definitions.html#common-attributes">Common attributes</a></li>
+ <li><a href="common-definitions.html#common-attributes-tests">Common attributes for tests</a></li>
+ <li><a href="common-definitions.html#common-attributes-binaries">Common attributes for binaries</a></li>
+ <li><a href="common-definitions.html#configurable-attributes">Configurable attributes</a></li>
+ <li><a href="common-definitions.html#implicit-outputs">Implicit output targets</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="make-variables.html">"Make" variables</a>
+ <ul class="be-toc">
+ <li><a href="make-variables.html#make-var-substitution">"Make" variable substitution</a></li>
+ <li><a href="make-variables.html#predefined_variables">Predefined variables</a></li>
+
+ </ul>
+ </li>
+ <li><a href="predefined-python-variables.html">Predefined Python Variables</a></li>
+</ul>
+
+<h3>Functions</h3>
+
+<ul class="be-toc">
+ <li><a href="functions.html#load">load</a></li>
+
+ <li><a href="functions.html#package">package</a></li>
+ <li><a href="functions.html#package_group">package_group</a></li>
+
+ <li><a href="functions.html#licenses">licenses</a></li>
+ <li><a href="functions.html#exports_files">exports_files</a></li>
+ <li><a href="functions.html#glob">glob</a></li>
+ <li><a href="functions.html#select">select</a></li>
+ <li><a href="functions.html#workspace">workspace</a></li>
+</ul>
+
+<h3>Rules</h3>
+
+<h4>Language-specific Rules</h4>
+
+#macro(summaryTable $ruleFamilies)
+ <tbody>
+ #foreach($ruleFamily in $ruleFamilies)
+ <tr>
+ <td class="lang">${ruleFamily.name}</td>
+ <td>
+ #foreach($ruleDoc in $ruleFamily.binaryRules)
+ <a href="${ruleFamily.id}.html#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
+ ${ruleDoc.ruleName}
+ </a>
+ <br />
+ #end
+ </td>
+ <td>
+ #foreach($ruleDoc in $ruleFamily.libraryRules)
+ <a href="${ruleFamily.id}.html#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
+ ${ruleDoc.ruleName}
+ </a>
+ <br />
+ #end
+ </td>
+ <td>
+ #foreach($ruleDoc in $ruleFamily.testRules)
+ <a href="${ruleFamily.id}.html#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
+ ${ruleDoc.ruleName}
+ </a>
+ <br />
+ #end
+ </td>
+ <td>
+ #foreach($ruleDoc in $ruleFamily.otherRules1)
+ <a href="${ruleFamily.id}.html#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
+ ${ruleDoc.ruleName}
+ </a>
+ <br />
+ #end
+ </td>
+ <td>
+ #foreach($ruleDoc in $ruleFamily.otherRules2)
+ <a href="${ruleFamily.id}.html#${ruleDoc.ruleName}"#if($ruleDoc.isDeprecated()) class="deprecated"#end>
+ ${ruleDoc.ruleName}
+ </a>
+ <br />
+ #end
+ </td>
+ </tr>
+ #end
+ </tbody>
+#end
+
+<table class="table table-condensed table-striped" summary="Table of rules sorted by language">
+ <colgroup span="6" width="20%"></colgroup>
+ <thead>
+ <tr>
+ <th>Language</th>
+ <th>Binary rules</th>
+ <th>Library rules</th>
+ <th>Test rules</th>
+ <th>Other rules</th>
+ <th></th>
+ </tr>
+ </thead>
+#summaryTable($langSpecificSummaryFamilies)
+
+</table>
+<h4>Rules that do not apply to a specific programming language</h4>
+
+<table class="table table-condensed table-striped" summary="Table of rules not specific to a programming language">
+ <colgroup span="6" width="20%"></colgroup>
+#summaryTable($otherSummaryFamilies)
+
+</table>
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/predefined-python-variables.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/predefined-python-variables.vm
new file mode 100644
index 0000000000..be0b1965fb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/predefined-python-variables.vm
@@ -0,0 +1,16 @@
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
+
+<h2 id="predefined-python-variables">Predefined Python Variables</h2>
+
+<div class="toc">
+ <h1>Contents</h1>
+ <ul>
+ <li><a href="#packagename">packagename</a></li>
+ </ul>
+</div>
+<h3 id="packagename">PACKAGE_NAME</h3>
+<p>
+ This is a string variable with the name
+ of the package being evaluated. The value is unaffected by subinclude.
+</p>
+
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm b/src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm
new file mode 100644
index 0000000000..4e5f6d3fc4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm
@@ -0,0 +1,69 @@
+#parse("com/google/devtools/build/docgen/templates/be/header.vm")
+
+<h1>${ruleFamily} Rules</h1>
+
+<div class="toc">
+ <h2>Rules</h2>
+ <ul>
+#foreach ($rule in $ruleDocs)
+ <li>
+ <a href="#${rule.ruleName}">
+ ${rule.ruleName}#if($rule.isDeprecated()) (deprecated)#end
+ </a>
+ </li>
+#end
+ </ul>
+</div>
+
+#foreach ($rule in $ruleDocs)
+ <h2 id="${rule.ruleName}"#if($rule.isDeprecated()) class="deprecated"#end>
+ ${rule.ruleName}
+ </h2>
+
+ <pre class="rule-signature">${rule.attributeSignature}</pre>
+
+ $rule.htmlDocumentation
+
+ <h3 id="${rule.ruleName}_args">Arguments</h3>
+ <table class="table table-condensed table-bordered table-params">
+ <colgroup>
+ <col class="col-param" />
+ <col class="param-description" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th colspan="2">Attributes</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td id="${rule.ruleName}.name"><code>name</code></td>
+ <td>
+ <p><code><a href="../build-ref.html#name">Name</a>; required</code></p>
+ <p>A unique name for this rule.</p>
+ ${rule.nameExtraHtmlDoc}
+ </td>
+ </tr>
+ #foreach ($attribute in $rule.attributes)
+ #if (!$attribute.isCommonType())
+ <tr>
+ <td id="${rule.ruleName.toLowerCase()}.${attribute.attributeName}"#if($attribute.isDeprecated()) class="deprecated"#end>
+ <code>${attribute.attributeName}</code>
+ </td>
+ <td>
+ #if (!$attribute.synopsis.isEmpty())
+ <p><code>${attribute.synopsis}</code></p>
+ #end
+ $attribute.htmlDocumentation
+ </td>
+ </tr>
+ #end
+ #end
+ </tbody>
+ </table>
+ #if ($rule.isPublicByDefault())
+ The default visibility is public: <code>visibility = ["//visibility:public"]</code>.
+ #end
+#end
+
+#parse("com/google/devtools/build/docgen/templates/be/footer.vm")
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/skylark-library.vm b/src/main/java/com/google/devtools/build/docgen/templates/skylark-library.vm
index 250b5ee89c..5646e10733 100644
--- a/src/main/java/com/google/devtools/build/docgen/templates/skylark-library.vm
+++ b/src/main/java/com/google/devtools/build/docgen/templates/skylark-library.vm
@@ -4,7 +4,7 @@ ${module.documentation}
#if (!$module.methods.isEmpty())
<div class="toc">
- <h1>Methods</h1>
+ <h2>Methods</h2>
<ul>
#foreach ($method in $module.methods)
#if ($method.documented())