summaryrefslogtreecommitdiff
path: root/toolchains/rpm/rpmbuild.bzl
blob: 3aa0ea049482ed7e58faf613dd76a097a6fc6464 (plain)
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
# Copyright 2020 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.
"""toolchain to provide an rpmbuild binary."""

RpmbuildInfo = provider(
    doc = """Platform inde artifact.""",
    fields = {
        "name": "The name of the toolchain",
        "valid": "Is this toolchain valid and usable?",
        "label": "The path to a target I will build",
        "path": "The path to a pre-built rpmbuild",
        "version": "The version string of rpmbuild",
    },
)

def _rpmbuild_toolchain_impl(ctx):
    if ctx.attr.label and ctx.attr.path:
        fail("rpmbuild_toolchain must not specify both label and path.")
    valid = bool(ctx.attr.label) or bool(ctx.attr.path)
    toolchain_info = platform_common.ToolchainInfo(
        rpmbuild = RpmbuildInfo(
            name = str(ctx.label),
            valid = valid,
            label = ctx.attr.label,
            path = ctx.attr.path,
            version = ctx.attr.version,
        ),
    )
    return [toolchain_info]

rpmbuild_toolchain = rule(
    implementation = _rpmbuild_toolchain_impl,
    attrs = {
        "label": attr.label(
            doc = "A valid label of a target to build or a prebuilt binary. Mutually exclusive with path.",
            cfg = "exec",
            executable = True,
            allow_files = True,
        ),
        "path": attr.string(
            doc = "The path to the rpmbuild executable. Mutually exclusive with label.",
        ),
        "version": attr.string(
            doc = "The version string of the rpmbuild executable. This should be manually set.",
        ),
    },
)

# Expose the presence of an rpmbuild in the resolved toolchain as a flag.
def _is_rpmbuild_available_impl(ctx):
    toolchain = ctx.toolchains["@rules_pkg//toolchains/rpm:rpmbuild_toolchain_type"].rpmbuild
    return [config_common.FeatureFlagInfo(
        value = ("1" if toolchain.valid else "0"),
    )]

is_rpmbuild_available = rule(
    implementation = _is_rpmbuild_available_impl,
    attrs = {},
    toolchains = ["@rules_pkg//toolchains/rpm:rpmbuild_toolchain_type"],
)

def rpmbuild_register_toolchains():
    native.register_toolchains("@rules_pkg//toolchains/rpm:rpmbuild_missing_toolchain")