xref: /aosp_15_r20/external/bazelbuild-rules_license/rules/license.bzl (revision f578df4fd057ffe2023728444759535685631548)
1*f578df4fSJingwen Chen# Copyright 2022 Google LLC
2*f578df4fSJingwen Chen#
3*f578df4fSJingwen Chen# Licensed under the Apache License, Version 2.0 (the "License");
4*f578df4fSJingwen Chen# you may not use this file except in compliance with the License.
5*f578df4fSJingwen Chen# You may obtain a copy of the License at
6*f578df4fSJingwen Chen#
7*f578df4fSJingwen Chen# https://www.apache.org/licenses/LICENSE-2.0
8*f578df4fSJingwen Chen#
9*f578df4fSJingwen Chen# Unless required by applicable law or agreed to in writing, software
10*f578df4fSJingwen Chen# distributed under the License is distributed on an "AS IS" BASIS,
11*f578df4fSJingwen Chen# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*f578df4fSJingwen Chen# See the License for the specific language governing permissions and
13*f578df4fSJingwen Chen# limitations under the License.
14*f578df4fSJingwen Chen"""Rules for declaring the compliance licenses used by a package.
15*f578df4fSJingwen Chen
16*f578df4fSJingwen Chen"""
17*f578df4fSJingwen Chen
18*f578df4fSJingwen Chenload(
19*f578df4fSJingwen Chen    "@rules_license//rules:providers.bzl",
20*f578df4fSJingwen Chen    "LicenseKindInfo",
21*f578df4fSJingwen Chen)
22*f578df4fSJingwen Chenload(
23*f578df4fSJingwen Chen    "@rules_license//rules:license_impl.bzl",
24*f578df4fSJingwen Chen    "license_rule_impl",
25*f578df4fSJingwen Chen)
26*f578df4fSJingwen Chen
27*f578df4fSJingwen Chen# Enable this if your organization requires the license text to be a file
28*f578df4fSJingwen Chen# checked into source control instead of, possibly, another rule.
29*f578df4fSJingwen Chen_require_license_text_is_a_file = False
30*f578df4fSJingwen Chen
31*f578df4fSJingwen Chen# This rule must be named "_license" for backwards compatability with older
32*f578df4fSJingwen Chen# or Bazel that checked that name explicitly. See
33*f578df4fSJingwen Chen# https://github.com/bazelbuild/bazel/commit/bbc221f60bc8c9177470529d85c3e47a5d9aaf21
34*f578df4fSJingwen Chen# TODO(after bazel 7.0 release): Feel free to rename the rule and move.
35*f578df4fSJingwen Chen_license = rule(
36*f578df4fSJingwen Chen    implementation = license_rule_impl,
37*f578df4fSJingwen Chen    attrs = {
38*f578df4fSJingwen Chen        "license_kinds": attr.label_list(
39*f578df4fSJingwen Chen            mandatory = False,
40*f578df4fSJingwen Chen            doc = "License kind(s) of this license. If multiple license kinds are" +
41*f578df4fSJingwen Chen                  " listed in the LICENSE file, and they all apply, then all" +
42*f578df4fSJingwen Chen                  " should be listed here. If the user can choose a single one" +
43*f578df4fSJingwen Chen                  " of many, then only list one here.",
44*f578df4fSJingwen Chen            providers = [LicenseKindInfo],
45*f578df4fSJingwen Chen            # This should be the null configuration, not the exec.
46*f578df4fSJingwen Chen            cfg = "exec",
47*f578df4fSJingwen Chen        ),
48*f578df4fSJingwen Chen        "copyright_notice": attr.string(
49*f578df4fSJingwen Chen            doc = "Copyright notice.",
50*f578df4fSJingwen Chen        ),
51*f578df4fSJingwen Chen        "license_text": attr.label(
52*f578df4fSJingwen Chen            allow_single_file = True,
53*f578df4fSJingwen Chen            default = "LICENSE",
54*f578df4fSJingwen Chen            doc = "The license file.",
55*f578df4fSJingwen Chen        ),
56*f578df4fSJingwen Chen        "package_name": attr.string(
57*f578df4fSJingwen Chen            doc = "A human readable name identifying this package." +
58*f578df4fSJingwen Chen                  " This may be used to produce an index of OSS packages used by" +
59*f578df4fSJingwen Chen                  " an applicatation.",
60*f578df4fSJingwen Chen        ),
61*f578df4fSJingwen Chen        "package_url": attr.string(
62*f578df4fSJingwen Chen            doc = "The URL this instance of the package was download from." +
63*f578df4fSJingwen Chen                  " This may be used to produce an index of OSS packages used by" +
64*f578df4fSJingwen Chen                  " an applicatation.",
65*f578df4fSJingwen Chen        ),
66*f578df4fSJingwen Chen        "package_version": attr.string(
67*f578df4fSJingwen Chen            doc = "A human readable version string identifying this package." +
68*f578df4fSJingwen Chen                  " This may be used to produce an index of OSS packages used" +
69*f578df4fSJingwen Chen                  " by an applicatation.  It should be a value that" +
70*f578df4fSJingwen Chen                  " increases over time, rather than a commit hash."
71*f578df4fSJingwen Chen        ),
72*f578df4fSJingwen Chen        "namespace": attr.string(
73*f578df4fSJingwen Chen            doc = "A human readable name used to organize licenses into categories." +
74*f578df4fSJingwen Chen                  " This is used in google3 to differentiate third party licenses used" +
75*f578df4fSJingwen Chen                  " for compliance versus internal licenses used by SLAsan for internal" +
76*f578df4fSJingwen Chen                  " teams' SLAs.",
77*f578df4fSJingwen Chen        ),
78*f578df4fSJingwen Chen    },
79*f578df4fSJingwen Chen)
80*f578df4fSJingwen Chen
81*f578df4fSJingwen Chen# buildifier: disable=function-docstring-args
82*f578df4fSJingwen Chendef license(
83*f578df4fSJingwen Chen        name,
84*f578df4fSJingwen Chen        license_text = "LICENSE",
85*f578df4fSJingwen Chen        license_kind = None,
86*f578df4fSJingwen Chen        license_kinds = None,
87*f578df4fSJingwen Chen        copyright_notice = None,
88*f578df4fSJingwen Chen        package_name = None,
89*f578df4fSJingwen Chen        package_url = None,
90*f578df4fSJingwen Chen        package_version = None,
91*f578df4fSJingwen Chen        namespace = "compliance",
92*f578df4fSJingwen Chen        tags = [],
93*f578df4fSJingwen Chen        visibility = ["//visibility:public"]):
94*f578df4fSJingwen Chen    """Wrapper for license rule.
95*f578df4fSJingwen Chen
96*f578df4fSJingwen Chen    @wraps(_license)
97*f578df4fSJingwen Chen
98*f578df4fSJingwen Chen    Args:
99*f578df4fSJingwen Chen      name: str target name.
100*f578df4fSJingwen Chen      license_text: str Filename of the license file
101*f578df4fSJingwen Chen      license_kind: label a single license_kind. Only one of license_kind or license_kinds may
102*f578df4fSJingwen Chen                    be specified
103*f578df4fSJingwen Chen      license_kinds: list(label) list of license_kind targets.
104*f578df4fSJingwen Chen      copyright_notice: str Copyright notice associated with this package.
105*f578df4fSJingwen Chen      package_name: str A human readable name identifying this package. This
106*f578df4fSJingwen Chen                    may be used to produce an index of OSS packages used by
107*f578df4fSJingwen Chen                    an application.
108*f578df4fSJingwen Chen      package_url: str The canonical URL this package was downloaded from.
109*f578df4fSJingwen Chen      package_version: str The version corresponding the the URL.
110*f578df4fSJingwen Chen      namespace: str Undocumened. Internal.
111*f578df4fSJingwen Chen      tags: list(str) tags applied to the rule
112*f578df4fSJingwen Chen      visibility: list(label) visibility spec.
113*f578df4fSJingwen Chen    """
114*f578df4fSJingwen Chen    if license_kind:
115*f578df4fSJingwen Chen        if license_kinds:
116*f578df4fSJingwen Chen            fail("Can not use both license_kind and license_kinds")
117*f578df4fSJingwen Chen        license_kinds = [license_kind]
118*f578df4fSJingwen Chen
119*f578df4fSJingwen Chen    if _require_license_text_is_a_file:
120*f578df4fSJingwen Chen        # Make sure the file exists as named in the rule. A glob expression that
121*f578df4fSJingwen Chen        # expands to the name of the file is not acceptable.
122*f578df4fSJingwen Chen        srcs = native.glob([license_text])
123*f578df4fSJingwen Chen        if len(srcs) != 1 or srcs[0] != license_text:
124*f578df4fSJingwen Chen            fail("Specified license file doesn't exist: %s" % license_text)
125*f578df4fSJingwen Chen
126*f578df4fSJingwen Chen    _license(
127*f578df4fSJingwen Chen        name = name,
128*f578df4fSJingwen Chen        license_kinds = license_kinds,
129*f578df4fSJingwen Chen        license_text = license_text,
130*f578df4fSJingwen Chen        copyright_notice = copyright_notice,
131*f578df4fSJingwen Chen        package_name = package_name,
132*f578df4fSJingwen Chen        package_url = package_url,
133*f578df4fSJingwen Chen        package_version = package_version,
134*f578df4fSJingwen Chen        namespace = namespace,
135*f578df4fSJingwen Chen        applicable_licenses = [],
136*f578df4fSJingwen Chen        visibility = visibility,
137*f578df4fSJingwen Chen        tags = tags,
138*f578df4fSJingwen Chen        testonly = 0,
139*f578df4fSJingwen Chen    )
140