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