blob: b9c1682e31576cee25d1ef4ec1505b8f408c63c3 [file] [log] [blame]
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001// Copyright 2019 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 (
Bob Badoureef4c1c2022-05-16 12:20:04 -070018 "fmt"
19 "path/filepath"
Colin Crossaa1cab02022-01-28 14:49:24 -080020 "strings"
Jaewoong Jung5b425e22019-06-17 17:40:56 -070021)
22
Bob Badoureef4c1c2022-05-16 12:20:04 -070023func modulesOutputDirs(ctx BuilderContext, modules ...Module) []string {
24 dirs := make([]string, 0, len(modules))
25 for _, module := range modules {
26 paths, err := outputFilesForModule(ctx, module, "")
27 if err != nil {
28 continue
29 }
30 for _, path := range paths {
31 if path != nil {
32 dirs = append(dirs, filepath.Dir(path.String()))
33 }
34 }
35 }
36 return SortedUniqueStrings(dirs)
Bob Badourde6a0872022-04-01 18:00:00 +000037}
38
Bob Badoureef4c1c2022-05-16 12:20:04 -070039func modulesLicenseMetadata(ctx BuilderContext, modules ...Module) Paths {
40 result := make(Paths, 0, len(modules))
41 for _, module := range modules {
42 if mf := module.base().licenseMetadataFile; mf != nil {
43 result = append(result, mf)
44 }
45 }
46 return result
47}
48
49// buildNoticeOutputFromLicenseMetadata writes out a notice file.
Bob Badourc6ec9fb2022-06-08 15:59:35 -070050func buildNoticeOutputFromLicenseMetadata(
51 ctx BuilderContext, tool, ruleName string, outputFile WritablePath,
52 libraryName string, stripPrefix []string, modules ...Module) {
Bob Badourde6a0872022-04-01 18:00:00 +000053 depsFile := outputFile.ReplaceExtension(ctx, strings.TrimPrefix(outputFile.Ext()+".d", "."))
54 rule := NewRuleBuilder(pctx, ctx)
Bob Badoureef4c1c2022-05-16 12:20:04 -070055 if len(modules) == 0 {
56 if mctx, ok := ctx.(ModuleContext); ok {
57 modules = []Module{mctx.Module()}
58 } else {
Bob Badoura5ea2472022-05-20 16:37:26 -070059 panic(fmt.Errorf("%s %q needs a module to generate the notice for", ruleName, libraryName))
Bob Badoureef4c1c2022-05-16 12:20:04 -070060 }
61 }
62 if libraryName == "" {
63 libraryName = modules[0].Name()
64 }
65 cmd := rule.Command().
66 BuiltTool(tool).
Bob Badourde6a0872022-04-01 18:00:00 +000067 FlagWithOutput("-o ", outputFile).
Bob Badoureef4c1c2022-05-16 12:20:04 -070068 FlagWithDepFile("-d ", depsFile)
Bob Badourc6ec9fb2022-06-08 15:59:35 -070069 if len(stripPrefix) > 0 {
70 cmd = cmd.FlagForEachArg("--strip_prefix ", stripPrefix)
Bob Badoureef4c1c2022-05-16 12:20:04 -070071 }
72 outputs := modulesOutputDirs(ctx, modules...)
73 if len(outputs) > 0 {
74 cmd = cmd.FlagForEachArg("--strip_prefix ", outputs)
75 }
76 if libraryName != "" {
77 cmd = cmd.FlagWithArg("--product ", libraryName)
78 }
79 cmd = cmd.Inputs(modulesLicenseMetadata(ctx, modules...))
Bob Badoura5ea2472022-05-20 16:37:26 -070080 rule.Build(ruleName, "container notice file")
Bob Badoureef4c1c2022-05-16 12:20:04 -070081}
82
83// BuildNoticeTextOutputFromLicenseMetadata writes out a notice text file based
84// on the license metadata files for the input `modules` defaulting to the
85// current context module if none given.
Bob Badourc6ec9fb2022-06-08 15:59:35 -070086func BuildNoticeTextOutputFromLicenseMetadata(
87 ctx BuilderContext, outputFile WritablePath, ruleName, libraryName string,
88 stripPrefix []string, modules ...Module) {
89 buildNoticeOutputFromLicenseMetadata(ctx, "textnotice", "text_notice_"+ruleName,
90 outputFile, libraryName, stripPrefix, modules...)
Bob Badoureef4c1c2022-05-16 12:20:04 -070091}
92
93// BuildNoticeHtmlOutputFromLicenseMetadata writes out a notice text file based
94// on the license metadata files for the input `modules` defaulting to the
95// current context module if none given.
Bob Badourc6ec9fb2022-06-08 15:59:35 -070096func BuildNoticeHtmlOutputFromLicenseMetadata(
97 ctx BuilderContext, outputFile WritablePath, ruleName, libraryName string,
98 stripPrefix []string, modules ...Module) {
99 buildNoticeOutputFromLicenseMetadata(ctx, "htmlnotice", "html_notice_"+ruleName,
100 outputFile, libraryName, stripPrefix, modules...)
Bob Badoureef4c1c2022-05-16 12:20:04 -0700101}
102
103// BuildNoticeXmlOutputFromLicenseMetadata writes out a notice text file based
104// on the license metadata files for the input `modules` defaulting to the
105// current context module if none given.
Bob Badourc6ec9fb2022-06-08 15:59:35 -0700106func BuildNoticeXmlOutputFromLicenseMetadata(
107 ctx BuilderContext, outputFile WritablePath, ruleName, libraryName string,
108 stripPrefix []string, modules ...Module) {
109 buildNoticeOutputFromLicenseMetadata(ctx, "xmlnotice", "xml_notice_"+ruleName,
110 outputFile, libraryName, stripPrefix, modules...)
Dan Willemsen9fe14102021-07-13 21:52:04 -0700111}