• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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