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