1// Copyright 2020 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package android 16 17import ( 18 "fmt" 19 "os" 20 21 "github.com/google/blueprint" 22 23 "android/soong/bazel" 24) 25 26type licenseKindDependencyTag struct { 27 blueprint.BaseDependencyTag 28} 29 30var ( 31 licenseKindTag = licenseKindDependencyTag{} 32) 33 34func init() { 35 RegisterLicenseBuildComponents(InitRegistrationContext) 36} 37 38// Register the license module type. 39func RegisterLicenseBuildComponents(ctx RegistrationContext) { 40 ctx.RegisterModuleType("license", LicenseFactory) 41} 42 43type licenseProperties struct { 44 // Specifies the kinds of license that apply. 45 License_kinds []string 46 // Specifies a short copyright notice to use for the license. 47 Copyright_notice *string 48 // Specifies the path or label for the text of the license. 49 License_text []string `android:"path"` 50 // Specifies the package name to which the license applies. 51 Package_name *string 52 // Specifies where this license can be used 53 Visibility []string 54} 55 56var _ Bazelable = &licenseModule{} 57 58type licenseModule struct { 59 ModuleBase 60 DefaultableModuleBase 61 BazelModuleBase 62 63 properties licenseProperties 64} 65 66type bazelLicenseAttributes struct { 67 License_kinds []string 68 Copyright_notice *string 69 License_text bazel.LabelAttribute 70 Package_name *string 71 Visibility []string 72} 73 74func (m *licenseModule) ConvertWithBp2build(ctx TopDownMutatorContext) { 75 attrs := &bazelLicenseAttributes{ 76 License_kinds: m.properties.License_kinds, 77 Copyright_notice: m.properties.Copyright_notice, 78 Package_name: m.properties.Package_name, 79 Visibility: m.properties.Visibility, 80 } 81 82 // TODO(asmundak): Soong supports multiple license texts while Bazel's license 83 // rule does not. Have android_license create a genrule to concatenate multiple 84 // license texts. 85 if len(m.properties.License_text) > 1 && ctx.Config().IsEnvTrue("BP2BUILD_VERBOSE") { 86 fmt.Fprintf(os.Stderr, "warning: using only the first license_text item from //%s:%s\n", 87 ctx.ModuleDir(), m.Name()) 88 } 89 if len(m.properties.License_text) >= 1 { 90 attrs.License_text.SetValue(BazelLabelForModuleSrcSingle(ctx, m.properties.License_text[0])) 91 } 92 93 ctx.CreateBazelTargetModule( 94 bazel.BazelTargetModuleProperties{ 95 Rule_class: "android_license", 96 Bzl_load_location: "//build/bazel/rules/license:license.bzl", 97 }, 98 CommonAttributes{ 99 Name: m.Name(), 100 }, 101 attrs) 102} 103 104func (m *licenseModule) DepsMutator(ctx BottomUpMutatorContext) { 105 for i, license := range m.properties.License_kinds { 106 for j := i + 1; j < len(m.properties.License_kinds); j++ { 107 if license == m.properties.License_kinds[j] { 108 ctx.ModuleErrorf("Duplicated license kind: %q", license) 109 break 110 } 111 } 112 } 113 ctx.AddVariationDependencies(nil, licenseKindTag, m.properties.License_kinds...) 114} 115 116func (m *licenseModule) GenerateAndroidBuildActions(ctx ModuleContext) { 117 // license modules have no licenses, but license_kinds must refer to license_kind modules 118 mergeStringProps(&m.base().commonProperties.Effective_licenses, ctx.ModuleName()) 119 namePathProps(&m.base().commonProperties.Effective_license_text, m.properties.Package_name, PathsForModuleSrc(ctx, m.properties.License_text)...) 120 for _, module := range ctx.GetDirectDepsWithTag(licenseKindTag) { 121 if lk, ok := module.(*licenseKindModule); ok { 122 mergeStringProps(&m.base().commonProperties.Effective_license_conditions, lk.properties.Conditions...) 123 mergeStringProps(&m.base().commonProperties.Effective_license_kinds, ctx.OtherModuleName(module)) 124 } else { 125 ctx.ModuleErrorf("license_kinds property %q is not a license_kind module", ctx.OtherModuleName(module)) 126 } 127 } 128} 129 130func LicenseFactory() Module { 131 module := &licenseModule{} 132 133 base := module.base() 134 module.AddProperties(&base.nameProperties, &module.properties, &base.commonProperties.BazelConversionStatus) 135 136 // The visibility property needs to be checked and parsed by the visibility module. 137 setPrimaryVisibilityProperty(module, "visibility", &module.properties.Visibility) 138 139 initAndroidModuleBase(module) 140 InitDefaultableModule(module) 141 InitBazelModule(module) 142 143 return module 144} 145