blob: 2db0e82648a16b0f4c8a382a1d7c744047a21686 [file] [log] [blame]
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Rules to create RPM archives."""
rpm_filetype = [".rpm"]
spec_filetype = [".spec"]
def _pkg_rpm_impl(ctx):
"""Implements to pkg_rpm rule."""
files = []
args = ["--name=" + ctx.label.name]
# Version can be specified by a file or inlined
if ctx.attr.version_file:
if ctx.attr.version:
fail("Both version and version_file attributes were specified")
args += ["--version=@" + ctx.file.version_file.path]
files += [ctx.file.version_file]
elif ctx.attr.version:
args += ["--version=" + ctx.attr.version]
else:
fail("Neither version_file nor version attribute was specified")
if ctx.attr.architecture:
args += ["--arch=" + ctx.attr.architecture]
if ctx.attr.spec_file:
args += ["--spec_file=" + ctx.file.spec_file.path]
files += [ctx.file.spec_file]
else:
fail("spec_file was not specified")
args += ["--out_file=" + ctx.outputs.rpm.path]
# Add data files.
files += [ctx.file.changelog] + ctx.files.data
args += [ctx.file.changelog.path]
for f in ctx.files.data:
args += [f.path]
# Call the generator script.
# TODO(katre): Generate a source RPM.
ctx.action(
executable = ctx.executable._make_rpm,
use_default_shell_env = True,
arguments = args,
inputs = files,
outputs = [ctx.outputs.rpm],
mnemonic = "MakeRpm")
# Link the RPM to the expected output name.
ctx.action(
command = "ln -s %s %s" % (ctx.outputs.rpm.basename, ctx.outputs.out.path),
inputs = [ctx.outputs.rpm],
outputs = [ctx.outputs.out])
# Define the rule.
pkg_rpm = rule(
implementation = _pkg_rpm_impl,
attrs = {
"spec_file" : attr.label(mandatory=True, allow_files=spec_filetype, single_file=True),
"architecture": attr.string(default="all"),
"version_file": attr.label(allow_files=True, single_file=True),
"version": attr.string(),
"changelog" : attr.label(mandatory=True, allow_files=True, single_file=True),
"data": attr.label_list(mandatory=True, allow_files=True),
# Implicit dependencies.
"_make_rpm": attr.label(
default=Label("//tools/build_defs/pkg:make_rpm"),
cfg="host",
executable=True,
allow_files=True),
},
outputs = {
"out": "%{name}.rpm",
"rpm": "%{name}-%{architecture}.rpm",
},
executable = False)
"""Creates an RPM format package from the data files.
This runs rpmbuild (and requires it to be installed beforehand) to generate
an RPM package based on the spec_file and data attributes.
Args:
spec_file: The RPM spec file to use. If the version or version_file
attributes are provided, the Version in the spec will be overwritten.
Any Sources listed in the spec file must be provided as data dependencies.
version: The version of the package to generate. This will overwrite any
Version provided in the spec file. Only specify one of version and
version_file.
version_file: A file containing the version of the package to generate. This
will overwrite any Version provided in the spec file. Only specify one of
version and version_file.
changelog: A changelog file to include. This will not be written to the spec
file, which should only list changes to the packaging, not the software itself.
data: List all files to be included in the package here.
"""