blob: d487e3e717bb9e8d7c2263d4957333e7e51034ea [file] [log] [blame] [view]
# Packaging for Bazel
<div class="toc">
<h2>Rules</h2>
<ul>
<li><a href="#pkg_tar">pkg_tar</a></li>
<li><a href="#pkg_deb">pkg_deb</a></li>
<li><a href="#pkg_rpm">pkg_rpm</a></li>
</ul>
</div>
## Overview
These build rules are used for building various packaging such as tarball
and debian package.
<a name="basic-example"></a>
## Basic Example
This example is a simplification of the debian packaging of Bazel:
```python
load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar", "pkg_deb")
pkg_tar(
name = "bazel-bin",
strip_prefix = "/src",
package_dir = "/usr/bin",
srcs = ["//src:bazel"],
mode = "0755",
)
pkg_tar(
name = "bazel-tools",
strip_prefix = "/",
package_dir = "/usr/share/lib/bazel/tools",
srcs = ["//tools:package-srcs"],
mode = "0644",
)
pkg_tar(
name = "debian-data",
extension = "tar.gz",
deps = [
":bazel-bin",
":bazel-tools",
],
)
pkg_deb(
name = "bazel-debian",
architecture = "amd64",
built_using = "unzip (6.0.1)",
data = ":debian-data",
depends = [
"zlib1g-dev",
"unzip",
],
description_file = "debian/description",
homepage = "http://bazel.build",
maintainer = "The Bazel Authors <bazel-dev@googlegroups.com>",
package = "bazel",
version = "0.1.1",
)
```
Here, the Debian package is built from three `pkg_tar` targets:
- `bazel-bin` creates a tarball with the main binary (mode `0755`) in
`/usr/bin`,
- `bazel-tools` create a tarball with the base workspace (mode `0644`) to
`/usr/share/bazel/tools` ; the `modes` attribute let us specifies executable
files,
- `debian-data` creates a gzip-compressed tarball that merge the three previous
tarballs.
`debian-data` is then used for the data content of the debian archive created by
`pkg_deb`.
<a name="future"></a>
## Future work
- Support more format, especially `pkg_zip`.
- Maybe a bit more integration with the `docker_build` rule.
<a name="pkg_tar"></a>
## pkg_tar
```python
pkg_tar(name, extension, strip_prefix, package_dir, srcs,
mode, modes, deps, symlinks)
```
Creates a tar file from a list of inputs.
<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><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr>
<td><code>extension</code></td>
<td>
<code>String, default to 'tar'</code>
<p>
The extension for the resulting tarball. The output
file will be '<i>name</i>.<i>extension</i>'. This extension
also decide on the compression: if set to <code>tar.gz</code>
or <code>tgz</code> then gzip compression will be used and
if set to <code>tar.bz2</code> or <code>tar.bzip2</code> then
bzip2 compression will be used.
</p>
</td>
</tr>
<tr>
<td><code>strip_prefix</code></td>
<td>
<code>String, optional</code>
<p>Root path of the files.</p>
<p>
The directory structure from the files is preserved inside the
tarball but a prefix path determined by <code>strip_prefix</code>
is removed from the directory structure. This path can
be absolute from the workspace root if starting with a <code>/</code> or
relative to the rule's directory. A relative path may start with "./"
(or be ".") but cannot use ".." to go up level(s). By default, the
<code>strip_prefix</code> attribute is unused and all files are supposed to have no
prefix. A <code>strip_prefix</code> of "" (the empty string) means the
same as the default.
</p>
</td>
</tr>
<tr>
<td><code>package_dir</code></td>
<td>
<code>String, optional</code>
<p>Target directory.</p>
<p>
The directory in which to expand the specified files, defaulting to '/'.
Only makes sense accompanying files.
</p>
</td>
</tr>
<tr>
<td><code>srcs</code></td>
<td>
<code>List of files, optional</code>
<p>File to add to the layer.</p>
<p>
A list of files that should be included in the archive.
</p>
</td>
</tr>
<tr>
<td><code>mode</code></td>
<td>
<code>String, default to 0555</code>
<p>
Set the mode of files added by the <code>files</code> attribute.
</p>
</td>
</tr>
<tr>
<td><code>mtime</code></td>
<td>
<code>int, seconds since Jan 1, 1970, default to -1 (ignored)</code>
<p>
Set the mod time of files added by the <code>files</code> attribute.
</p>
</td>
</tr>
<tr>
<td><code>portable_mtime</code></td>
<td>
<code>bool, default True</code>
<p>
Set the mod time of files added by the <code>files</code> attribute
to a 2000-01-01.
</p>
</td>
</tr>
<tr>
<td><code>modes</code></td>
<td>
<code>Dictionary, default to '{}'</code>
<p>
A string dictionary to change default mode of specific files from
<code>files</code>. Each key should be a path to a file before
appending the prefix <code>package_dir</code> and the corresponding
value the octal permission of to apply to the file.
</p>
<p>
<code>
modes = {
"tools/py/2to3.sh": "0755",
...
},
</code>
</p>
</td>
</tr>
<tr>
<td><code>owner</code></td>
<td>
<code>String, default to '0.0'</code>
<p>
<code>UID.GID</code> to set the default numeric owner for all files
provided in <code>files</code>.
</p>
</td>
</tr>
<tr>
<td><code>owners</code></td>
<td>
<code>Dictionary, default to '{}'</code>
<p>
A string dictionary to change default owner of specific files from
<code>files</code>. Each key should be a path to a file before
appending the prefix <code>package_dir</code> and the corresponding
value the <code>UID.GID</code> numeric string for the owner of the
file. When determining owner ids, this attribute is looked first then
<code>owner</code>.
</p>
<p>
<code>
owners = {
"tools/py/2to3.sh": "42.24",
...
},
</code>
</p>
</td>
</tr>
<tr>
<td><code>ownername</code></td>
<td>
<code>String, optional</code>
<p>
<code>username.groupname</code> to set the default owner for all files
provided in <code>files</code> (by default there is no owner names).
</p>
</td>
</tr>
<tr>
<td><code>ownernames</code></td>
<td>
<code>Dictionary, default to '{}'</code>
<p>
A string dictionary to change default owner of specific files from
<code>files</code>. Each key should be a path to a file before
appending the prefix <code>package_dir</code> and the corresponding
value the <code>username.groupname</code> string for the owner of the
file. When determining ownernames, this attribute is looked first then
<code>ownername</code>.
</p>
<p>
<code>
owners = {
"tools/py/2to3.sh": "leeroy.jenkins",
...
},
</code>
</p>
</td>
</tr>
<tr>
<td><code>deps</code></td>
<td>
<code>List of labels, optional</code>
<p>Tar files to extract and include in this tar package.</p>
<p>
A list of tarball labels to merge into the output tarball.
</p>
</td>
</tr>
<tr>
<td><code>symlinks</code></td>
<td>
<code>Dictionary, optional</code>
<p>Symlinks to create in the output tarball.</p>
<p>
<code>
symlinks = {
"/path/to/link": "/path/to/target",
...
},
</code>
</p>
</td>
</tr>
<tr>
<td><code>remap_paths</code></td>
<td>
<code>Dictionary, optional</code>
<p>Source path prefixes to remap in the tarfile.</p>
<p>
<code>
remap_paths = {
"original/path/prefix": "replaced/path",
...
},
</code>
</p>
</td>
</tr>
</tbody>
</table>
<a name="pkg_deb"></a>
### pkg_deb
```python
pkg_deb(name, data, package, architecture, maintainer, preinst, postinst, prerm, postrm, version, version_file, description, description_file, built_using, built_using_file, priority, section, homepage, depends, suggests, enhances, conflicts, predepends, recommends)
```
Create a debian package. See <a
href="http://www.debian.org/doc/debian-policy/ch-controlfields.html">http://www.debian.org/doc/debian-policy/ch-controlfields.html</a>
for more details on this.
<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><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr>
<td><code>data</code></td>
<td>
<code>File, required</code>
<p>
A tar file that contains the data for the debian package (basically
the list of files that will be installed by this package).
</p>
</td>
</tr>
<tr>
<td><code>package</code></td>
<td>
<code>String, required</code>
<p>The name of the package.</p>
</td>
</tr>
<tr>
<td><code>architecture</code></td>
<td>
<code>String, default to 'all'</code>
<p>The architecture that this package target.</p>
<p>
See <a href="http://www.debian.org/ports/">http://www.debian.org/ports/</a>.
</p>
</td>
</tr>
<tr>
<td><code>maintainer</code></td>
<td>
<code>String, required</code>
<p>The maintainer of the package.</p>
</td>
</tr>
<tr>
<td><code>preinst</code>, <code>postinst</code>, <code>prerm</code> and <code>postrm</code></td>
<td>
<code>Files, optional</code>
<p>
Respectively, the pre-install, post-install, pre-remove and
post-remove scripts for the package.
</p>
<p>
See <a href="http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html">http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html</a>.
</p>
</td>
</tr>
<tr>
<td><code>conffiles</code>, <code>conffiles_file</code></td>
<td>
<code>String list or File, optional</code>
<p>
The list of conffiles or a file containing one conffile per
line. Each item is an absolute path on the target system
where the deb is installed.
</p>
<p>
See <a href="https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-conffile">https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-conffile</a>.
</p>
</td>
</tr>
<tr>
<td><code>version</code>, <code>version_file</code></td>
<td>
<code>String or File, required</code>
<p>
The package version provided either inline (with <code>version</code>)
or from a file (with <code>version_file</code>).
</p>
</td>
</tr>
<tr>
<td><code>description</code>, <code>description_file</code></td>
<td>
<code>String or File, required</code>
<p>
The package description provided either inline (with <code>description</code>)
or from a file (with <code>description_file</code>).
</p>
</td>
</tr>
<tr>
<td><code>built_using</code>, <code>built_using_file</code></td>
<td>
<code>String or File</code>
<p>
The tool that were used to build this package provided either inline
(with <code>built_using</code>) or from a file (with <code>built_using_file</code>).
</p>
</td>
</tr>
<tr>
<td><code>priority</code></td>
<td>
<code>String, default to 'optional'</code>
<p>The priority of the package.</p>
<p>
See <a href="http://www.debian.org/doc/debian-policy/ch-archive.html#s-priorities">http://www.debian.org/doc/debian-policy/ch-archive.html#s-priorities</a>.
</p>
</td>
</tr>
<tr>
<td><code>section</code></td>
<td>
<code>String, default to 'contrib/devel'</code>
<p>The section of the package.</p>
<p>
See <a href="http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections">http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections</a>.
</p>
</td>
</tr>
<tr>
<td><code>homepage</code></td>
<td>
<code>String, optional</code>
<p>The homepage of the project.</p>
</td>
</tr>
<tr>
<td>
<code>depends</code>, <code>suggests</code>, <code>enhances</code>,
<code>conflicts</code>, <code>predepends</code> and <code>recommends</code>.
</td>
<td>
<code>String list, optional</code>
<p>The list of dependencies in the project.</p>
<p>
See <a href="http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps">http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps</a>.
</p>
</td>
</tr>
</tbody>
</table>
<a name="pkg_rpm"></a>
### pkg_rpm
```python
pkg_rpm(name, spec_file, architecture, version, version_file, changelog, data)
```
Create an RPM package. See <a
href="http://rpm.org/documentation.html">http://rpm.org/documentation.html</a>
for more details on this.
<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><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule. Used to name the output package.</p>
</td>
</tr>
<tr>
<td><code>spec_file</code></td>
<td>
<code>File, required</code>
<p>The RPM specification file used to generate the package.</p>
<p>
See <a href="http://ftp.rpm.org/max-rpm/s1-rpm-build-creating-spec-file.html">http://ftp.rpm.org/max-rpm/s1-rpm-build-creating-spec-file.html</a>.
</p>
</td>
</tr>
<tr>
<td><code>architecture</code></td>
<td>
<code>String, default to 'all'</code>
<p>The architecture that this package target.</p>
</td>
</tr>
<tr>
<td><code>version</code>, <code>version_file</code></td>
<td>
<code>String or File, required</code>
<p>
The package version provided either inline (with <code>version</code>)
or from a file (with <code>version_file</code>).
</p>
</td>
</tr>
<tr>
<td><code>data</code></td>
<td>
<code>Files, required</code>
<p>
Files to include in the generated package.
</p>
</td>
</tr>
</tbody>
</table>