| # 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. |
| """ |