blob: 97f53032b1a3e642656ed967c60a9f5c0cf546fc [file] [log] [blame]
<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>
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:
<ul>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/closure">
Closure libraries</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/docker">
Docker images</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/groovy">
Groovy projects</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/appengine">
Java App Engine applications</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/d">
D projects</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_rules/rust">
Rust projects</a>
<li> <a href="https://github.com/bazelbuild/bazel/tree/master/tools/build_defs/scala">
Scala projects</a> - experimental
</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>