| # Copyright 2022 Google LLC |
| # |
| # 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 |
| # |
| # https://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 for declaring the compliance licenses used by a package. |
| |
| """ |
| |
| load( |
| "@rules_license//rules:providers.bzl", |
| "LicenseKindInfo", |
| ) |
| load( |
| "@rules_license//rules:license_impl.bzl", |
| "license_rule_impl", |
| ) |
| |
| # Enable this if your organization requires the license text to be a file |
| # checked into source control instead of, possibly, another rule. |
| _require_license_text_is_a_file = False |
| |
| # This rule must be named "_license" for backwards compatability with older |
| # or Bazel that checked that name explicitly. See |
| # https://github.com/bazelbuild/bazel/commit/bbc221f60bc8c9177470529d85c3e47a5d9aaf21 |
| # TODO(after bazel 7.0 release): Feel free to rename the rule and move. |
| _license = rule( |
| implementation = license_rule_impl, |
| attrs = { |
| "license_kinds": attr.label_list( |
| mandatory = False, |
| doc = "License kind(s) of this license. If multiple license kinds are" + |
| " listed in the LICENSE file, and they all apply, then all" + |
| " should be listed here. If the user can choose a single one" + |
| " of many, then only list one here.", |
| providers = [LicenseKindInfo], |
| # This should be the null configuration, not the exec. |
| cfg = "exec", |
| ), |
| "copyright_notice": attr.string( |
| doc = "Copyright notice.", |
| ), |
| "license_text": attr.label( |
| allow_single_file = True, |
| default = "LICENSE", |
| doc = "The license file.", |
| ), |
| "package_name": attr.string( |
| doc = "A human readable name identifying this package." + |
| " This may be used to produce an index of OSS packages used by" + |
| " an applicatation.", |
| ), |
| "package_url": attr.string( |
| doc = "The URL this instance of the package was download from." + |
| " This may be used to produce an index of OSS packages used by" + |
| " an applicatation.", |
| ), |
| "package_version": attr.string( |
| doc = "A human readable version string identifying this package." + |
| " This may be used to produce an index of OSS packages used" + |
| " by an applicatation. It should be a value that" + |
| " increases over time, rather than a commit hash." |
| ), |
| "namespace": attr.string( |
| doc = "A human readable name used to organize licenses into categories." + |
| " This is used in google3 to differentiate third party licenses used" + |
| " for compliance versus internal licenses used by SLAsan for internal" + |
| " teams' SLAs.", |
| ), |
| }, |
| ) |
| |
| # buildifier: disable=function-docstring-args |
| def license( |
| name, |
| license_text = "LICENSE", |
| license_kind = None, |
| license_kinds = None, |
| copyright_notice = None, |
| package_name = None, |
| package_url = None, |
| package_version = None, |
| namespace = "compliance", |
| tags = [], |
| visibility = ["//visibility:public"]): |
| """Wrapper for license rule. |
| |
| @wraps(_license) |
| |
| Args: |
| name: str target name. |
| license_text: str Filename of the license file |
| license_kind: label a single license_kind. Only one of license_kind or license_kinds may |
| be specified |
| license_kinds: list(label) list of license_kind targets. |
| copyright_notice: str Copyright notice associated with this package. |
| package_name: str A human readable name identifying this package. This |
| may be used to produce an index of OSS packages used by |
| an application. |
| package_url: str The canonical URL this package was downloaded from. |
| package_version: str The version corresponding the the URL. |
| namespace: str Undocumened. Internal. |
| tags: list(str) tags applied to the rule |
| visibility: list(label) visibility spec. |
| """ |
| if license_kind: |
| if license_kinds: |
| fail("Can not use both license_kind and license_kinds") |
| license_kinds = [license_kind] |
| |
| if _require_license_text_is_a_file: |
| # Make sure the file exists as named in the rule. A glob expression that |
| # expands to the name of the file is not acceptable. |
| srcs = native.glob([license_text]) |
| if len(srcs) != 1 or srcs[0] != license_text: |
| fail("Specified license file doesn't exist: %s" % license_text) |
| |
| _license( |
| name = name, |
| license_kinds = license_kinds, |
| license_text = license_text, |
| copyright_notice = copyright_notice, |
| package_name = package_name, |
| package_url = package_url, |
| package_version = package_version, |
| namespace = namespace, |
| applicable_licenses = [], |
| visibility = visibility, |
| tags = tags, |
| testonly = 0, |
| ) |