1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# 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.
if ctx.file.changelog:
files += [ctx.file.changelog]
args += [ctx.file.changelog.path]
files += ctx.files.data
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(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.
"""
|