xref: /aosp_15_r20/build/soong/android/notices.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workerfunc modulesOutputDirs(ctx BuilderContext, modules ...Module) []string {
24*333d2b36SAndroid Build Coastguard Worker	dirs := make([]string, 0, len(modules))
25*333d2b36SAndroid Build Coastguard Worker	for _, module := range modules {
26*333d2b36SAndroid Build Coastguard Worker		paths, err := outputFilesForModule(ctx, module, "")
27*333d2b36SAndroid Build Coastguard Worker		if err != nil {
28*333d2b36SAndroid Build Coastguard Worker			continue
29*333d2b36SAndroid Build Coastguard Worker		}
30*333d2b36SAndroid Build Coastguard Worker		for _, path := range paths {
31*333d2b36SAndroid Build Coastguard Worker			if path != nil {
32*333d2b36SAndroid Build Coastguard Worker				dirs = append(dirs, filepath.Dir(path.String()))
33*333d2b36SAndroid Build Coastguard Worker			}
34*333d2b36SAndroid Build Coastguard Worker		}
35*333d2b36SAndroid Build Coastguard Worker	}
36*333d2b36SAndroid Build Coastguard Worker	return SortedUniqueStrings(dirs)
37*333d2b36SAndroid Build Coastguard Worker}
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Workertype BuilderAndOtherModuleProviderContext interface {
40*333d2b36SAndroid Build Coastguard Worker	BuilderContext
41*333d2b36SAndroid Build Coastguard Worker	OtherModuleProviderContext
42*333d2b36SAndroid Build Coastguard Worker}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Workerfunc modulesLicenseMetadata(ctx OtherModuleProviderContext, modules ...Module) Paths {
45*333d2b36SAndroid Build Coastguard Worker	result := make(Paths, 0, len(modules))
46*333d2b36SAndroid Build Coastguard Worker	mctx, isMctx := ctx.(ModuleContext)
47*333d2b36SAndroid Build Coastguard Worker	for _, module := range modules {
48*333d2b36SAndroid Build Coastguard Worker		var mf Path
49*333d2b36SAndroid Build Coastguard Worker		if isMctx && mctx.Module() == module {
50*333d2b36SAndroid Build Coastguard Worker			mf = mctx.LicenseMetadataFile()
51*333d2b36SAndroid Build Coastguard Worker		} else {
52*333d2b36SAndroid Build Coastguard Worker			mf = OtherModuleProviderOrDefault(ctx, module, InstallFilesProvider).LicenseMetadataFile
53*333d2b36SAndroid Build Coastguard Worker		}
54*333d2b36SAndroid Build Coastguard Worker		if mf != nil {
55*333d2b36SAndroid Build Coastguard Worker			result = append(result, mf)
56*333d2b36SAndroid Build Coastguard Worker		}
57*333d2b36SAndroid Build Coastguard Worker	}
58*333d2b36SAndroid Build Coastguard Worker	return result
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker// buildNoticeOutputFromLicenseMetadata writes out a notice file.
62*333d2b36SAndroid Build Coastguard Workerfunc buildNoticeOutputFromLicenseMetadata(
63*333d2b36SAndroid Build Coastguard Worker	ctx BuilderAndOtherModuleProviderContext, tool, ruleName string, outputFile WritablePath,
64*333d2b36SAndroid Build Coastguard Worker	libraryName string, stripPrefix []string, modules ...Module) {
65*333d2b36SAndroid Build Coastguard Worker	depsFile := outputFile.ReplaceExtension(ctx, strings.TrimPrefix(outputFile.Ext()+".d", "."))
66*333d2b36SAndroid Build Coastguard Worker	rule := NewRuleBuilder(pctx, ctx)
67*333d2b36SAndroid Build Coastguard Worker	if len(modules) == 0 {
68*333d2b36SAndroid Build Coastguard Worker		if mctx, ok := ctx.(ModuleContext); ok {
69*333d2b36SAndroid Build Coastguard Worker			modules = []Module{mctx.Module()}
70*333d2b36SAndroid Build Coastguard Worker		} else {
71*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Errorf("%s %q needs a module to generate the notice for", ruleName, libraryName))
72*333d2b36SAndroid Build Coastguard Worker		}
73*333d2b36SAndroid Build Coastguard Worker	}
74*333d2b36SAndroid Build Coastguard Worker	if libraryName == "" {
75*333d2b36SAndroid Build Coastguard Worker		libraryName = modules[0].Name()
76*333d2b36SAndroid Build Coastguard Worker	}
77*333d2b36SAndroid Build Coastguard Worker	cmd := rule.Command().
78*333d2b36SAndroid Build Coastguard Worker		BuiltTool(tool).
79*333d2b36SAndroid Build Coastguard Worker		FlagWithOutput("-o ", outputFile).
80*333d2b36SAndroid Build Coastguard Worker		FlagWithDepFile("-d ", depsFile)
81*333d2b36SAndroid Build Coastguard Worker	if len(stripPrefix) > 0 {
82*333d2b36SAndroid Build Coastguard Worker		cmd = cmd.FlagForEachArg("--strip_prefix ", stripPrefix)
83*333d2b36SAndroid Build Coastguard Worker	}
84*333d2b36SAndroid Build Coastguard Worker	outputs := modulesOutputDirs(ctx, modules...)
85*333d2b36SAndroid Build Coastguard Worker	if len(outputs) > 0 {
86*333d2b36SAndroid Build Coastguard Worker		cmd = cmd.FlagForEachArg("--strip_prefix ", outputs)
87*333d2b36SAndroid Build Coastguard Worker	}
88*333d2b36SAndroid Build Coastguard Worker	if libraryName != "" {
89*333d2b36SAndroid Build Coastguard Worker		cmd = cmd.FlagWithArg("--product ", libraryName)
90*333d2b36SAndroid Build Coastguard Worker	}
91*333d2b36SAndroid Build Coastguard Worker	cmd = cmd.Inputs(modulesLicenseMetadata(ctx, modules...))
92*333d2b36SAndroid Build Coastguard Worker	rule.Build(ruleName, "container notice file")
93*333d2b36SAndroid Build Coastguard Worker}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker// BuildNoticeTextOutputFromLicenseMetadata writes out a notice text file based
96*333d2b36SAndroid Build Coastguard Worker// on the license metadata files for the input `modules` defaulting to the
97*333d2b36SAndroid Build Coastguard Worker// current context module if none given.
98*333d2b36SAndroid Build Coastguard Workerfunc BuildNoticeTextOutputFromLicenseMetadata(
99*333d2b36SAndroid Build Coastguard Worker	ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
100*333d2b36SAndroid Build Coastguard Worker	stripPrefix []string, modules ...Module) {
101*333d2b36SAndroid Build Coastguard Worker	buildNoticeOutputFromLicenseMetadata(ctx, "textnotice", "text_notice_"+ruleName,
102*333d2b36SAndroid Build Coastguard Worker		outputFile, libraryName, stripPrefix, modules...)
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker// BuildNoticeHtmlOutputFromLicenseMetadata writes out a notice text file based
106*333d2b36SAndroid Build Coastguard Worker// on the license metadata files for the input `modules` defaulting to the
107*333d2b36SAndroid Build Coastguard Worker// current context module if none given.
108*333d2b36SAndroid Build Coastguard Workerfunc BuildNoticeHtmlOutputFromLicenseMetadata(
109*333d2b36SAndroid Build Coastguard Worker	ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
110*333d2b36SAndroid Build Coastguard Worker	stripPrefix []string, modules ...Module) {
111*333d2b36SAndroid Build Coastguard Worker	buildNoticeOutputFromLicenseMetadata(ctx, "htmlnotice", "html_notice_"+ruleName,
112*333d2b36SAndroid Build Coastguard Worker		outputFile, libraryName, stripPrefix, modules...)
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker// BuildNoticeXmlOutputFromLicenseMetadata writes out a notice text file based
116*333d2b36SAndroid Build Coastguard Worker// on the license metadata files for the input `modules` defaulting to the
117*333d2b36SAndroid Build Coastguard Worker// current context module if none given.
118*333d2b36SAndroid Build Coastguard Workerfunc BuildNoticeXmlOutputFromLicenseMetadata(
119*333d2b36SAndroid Build Coastguard Worker	ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
120*333d2b36SAndroid Build Coastguard Worker	stripPrefix []string, modules ...Module) {
121*333d2b36SAndroid Build Coastguard Worker	buildNoticeOutputFromLicenseMetadata(ctx, "xmlnotice", "xml_notice_"+ruleName,
122*333d2b36SAndroid Build Coastguard Worker		outputFile, libraryName, stripPrefix, modules...)
123*333d2b36SAndroid Build Coastguard Worker}
124