Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Android/build/build/soong/android/   (Android Betriebssystem Version 17©)  Datei vom 26.5.2026 mit Größe 8 kB image not shown  

Quelle  notices.go   Sprache: unbekannt

 
Spracherkennung für: .go vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

// Copyright 2019 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package android

import (
 "fmt"
 "path/filepath"
 "strings"

 "github.com/google/blueprint/proptools"
)

//go:generate go run ../../blueprint/gobtools/codegen

func modulesOutputDirs(ctx BuilderContext, modules ...ModuleProxy) []string {
 dirs := make([]string, 0, len(modules))
 for _, module := range modules {
  paths, err := outputFilesForModule(ctx, module, "")
  if err != nil {
   continue
  }
  for _, path := range paths {
   if path != nil {
    dirs = append(dirs, filepath.Dir(path.String()))
   }
  }
 }
 return SortedUniqueStrings(dirs)
}

type BuilderAndOtherModuleProviderContext interface {
 BuilderContext
 OtherModuleProviderContext
}

func modulesLicenseMetadata(ctx OtherModuleProviderContext, modules ...ModuleProxy) Paths {
 result := make(Paths, 0, len(modules))
 mctx, isMctx := ctx.(ModuleContext)
 for _, module := range modules {
  var mf Path
  if isMctx && EqualModules(mctx.Module(), module) {
   mf = mctx.LicenseMetadataFile()
  } else {
   mf = GetInstallFiles(ctx, module).LicenseMetadataFile
  }
  if mf != nil {
   result = append(result, mf)
  }
 }
 return result
}

// All the information we need from a particular module to build its notice file entry.
// Can be passed through providers, unlike the module itself.
// @auto-generate: gob
type NoticeModuleInfo struct {
 Name                string
 OutputDirs          []string
 LicenseMetadataFile Path
}

// @auto-generate: gob
type NoticeModuleInfos []NoticeModuleInfo

func (i *NoticeModuleInfos) OutputDirs() []string {
 var result []string
 for _, info := range *i {
  result = append(result, info.OutputDirs...)
 }
 return result
}

func (i *NoticeModuleInfos) LicenseMetadataFiles() Paths {
 result := make(Paths, 0, len(*i))
 for _, info := range *i {
  if info.LicenseMetadataFile != nil {
   result = append(result, info.LicenseMetadataFile)
  }
 }
 return result
}

func GetNoticeModuleInfo(ctx BuilderAndOtherModuleProviderContext, m ModuleProxy) NoticeModuleInfo {
 var licenseMetadataFile Path
 licenseMetadataFiles := modulesLicenseMetadata(ctx, m)
 if len(licenseMetadataFiles) > 1 {
  panic("Didn't expect more than 1 licence metadata file")
 } else if len(licenseMetadataFiles) > 0 {
  licenseMetadataFile = licenseMetadataFiles[0]
 }
 return NoticeModuleInfo{
  Name:                m.Name(),
  OutputDirs:          modulesOutputDirs(ctx, m),
  LicenseMetadataFile: licenseMetadataFile,
 }
}

func GetNoticeModuleInfos(ctx BuilderAndOtherModuleProviderContext, modules []ModuleProxy) NoticeModuleInfos {
 result := make(NoticeModuleInfos, 0, len(modules))
 for _, m := range modules {
  result = append(result, GetNoticeModuleInfo(ctx, m))
 }
 return result
}

// buildNoticeOutputFromLicenseMetadata writes out a notice file.
func buildNoticeOutputFromLicenseMetadata(
 ctx BuilderAndOtherModuleProviderContext, tool, ruleName string, outputFile WritablePath,
 libraryName string, extraArgs BuildNoticeFromLicenseDataArgs, modules NoticeModuleInfos) {
 depsFile := outputFile.ReplaceExtension(ctx, strings.TrimPrefix(outputFile.Ext()+".d", "."))
 if len(modules) == 0 {
  panic(fmt.Errorf("%s %q needs a module to generate the notice for", ruleName, libraryName))
 }
 if libraryName == "" {
  libraryName = modules[0].Name
 }
 rule := NewRuleBuilder(pctx, ctx).SandboxDisabled()

 // Arguments that will go into the response file.
 var rspArgs []string

 for _, sp := range extraArgs.StripPrefix {
  rspArgs = append(rspArgs, "--strip_prefix", sp)
 }
 for _, sp := range modules.OutputDirs() {
  rspArgs = append(rspArgs, "--strip_prefix", sp)
 }

 // The difference between nil and empty slice matters here, to allow for empty filter sets
 if extraArgs.Filter != nil {
  rspArgs = append(rspArgs, "--filter")
  for _, f := range extraArgs.Filter {
   rspArgs = append(rspArgs, "--filter_to", f)
  }
 }
 for _, r := range extraArgs.Replace.Args() {
  rspArgs = append(rspArgs, "--replace", r)
 }

 // Add input files.
 for _, f := range modules.LicenseMetadataFiles() {
  rspArgs = append(rspArgs, f.String())
 }

 rspFile := outputFile.ReplaceExtension(ctx, strings.TrimPrefix(outputFile.Ext()+".rsp", "."))
 WriteFileRule(ctx, rspFile, strings.Join(rspArgs, "\n"))

 cmd := rule.Command().
  BuiltTool(tool).
  FlagWithOutput("-o ", outputFile).
  FlagWithDepFile("-d ", depsFile)

 if libraryName != "" {
  cmd.FlagWithArg("--product ", proptools.ShellEscapeIncludingSpaces(libraryName))
 }
 if extraArgs.Title != "" {
  cmd.FlagWithArg("--title ", proptools.ShellEscapeIncludingSpaces(extraArgs.Title))
 }

 cmd.Flag("@" + rspFile.String())

 cmd.Implicits(modules.LicenseMetadataFiles())
 cmd.Implicit(rspFile)

 rule.Build(ruleName, "container notice file")
}

type NoticeReplace struct {
 From string
 To   string
}

type NoticeReplaces []NoticeReplace

func (r *NoticeReplaces) Args() []string {
 var result []string
 for _, i := range *r {
  result = append(result, i.From+":::"+i.To)
 }
 return result
}

// Additional optional arguments that can be passed to notice building functions
type BuildNoticeFromLicenseDataArgs struct {
 Title       string
 StripPrefix []string
 Filter      []string
 Replace     NoticeReplaces
}

// BuildNoticeTextOutputFromLicenseMetadata writes out a notice text file based
// on the license metadata files for the input `modules` defaulting to the
// current context module if none given.
func BuildNoticeTextOutputFromLicenseMetadata(
 ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
 extraArgs BuildNoticeFromLicenseDataArgs, modules ...ModuleProxy) {
 buildNoticeOutputFromLicenseMetadata(ctx, "textnotice", "text_notice_"+ruleName,
  outputFile, libraryName, extraArgs, GetNoticeModuleInfos(ctx, modules))
}

// BuildNoticeHtmlOutputFromLicenseMetadata writes out a notice text file based
// on the license metadata files for the input `modules` defaulting to the
// current context module if none given.
func BuildNoticeHtmlOutputFromLicenseMetadata(
 ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
 extraArgs BuildNoticeFromLicenseDataArgs, modules ...ModuleProxy) {
 buildNoticeOutputFromLicenseMetadata(ctx, "htmlnotice", "html_notice_"+ruleName,
  outputFile, libraryName, extraArgs, GetNoticeModuleInfos(ctx, modules))
}

// BuildNoticeXmlOutputFromLicenseMetadata writes out a notice text file based
// on the license metadata files for the input `modules` defaulting to the
// current context module if none given.
func BuildNoticeXmlOutputFromLicenseMetadata(
 ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
 extraArgs BuildNoticeFromLicenseDataArgs, modules ...ModuleProxy) {
 buildNoticeOutputFromLicenseMetadata(ctx, "xmlnotice", "xml_notice_"+ruleName,
  outputFile, libraryName, extraArgs, GetNoticeModuleInfos(ctx, modules))
}

// BuildNoticeTextOutputFromNoticeModuleInfos is the same as
// BuildNoticeTextOutputFromLicenseMetadata, but it accepts NoticeModuleInfos instead of straight
// ModuleProxies. This is useful for when you don't have direct access to the modules you
// want to generate a notice file for, for example a singleton accessing the transitive dependencies
// of a particular module.
func BuildNoticeTextOutputFromNoticeModuleInfos(
 ctx BuilderAndOtherModuleProviderContext, outputFile WritablePath, ruleName, libraryName string,
 extraArgs BuildNoticeFromLicenseDataArgs, moduleInfos NoticeModuleInfos) {
 buildNoticeOutputFromLicenseMetadata(ctx, "textnotice", "text_notice_"+ruleName,
  outputFile, libraryName, extraArgs, moduleInfos)
}

[Dauer der Verarbeitung: 0.1 Sekunden, vorverarbeitet 2026-06-28]