diff --git a/android/licenses.go b/android/licenses.go index bcd85f9d0..e9e271bd2 100644 --- a/android/licenses.go +++ b/android/licenses.go @@ -308,3 +308,12 @@ type LicenseInfo struct { } var LicenseInfoProvider = blueprint.NewProvider(LicenseInfo{}) + +func init() { + RegisterMakeVarsProvider(pctx, licensesMakeVarsProvider) +} + +func licensesMakeVarsProvider(ctx MakeVarsContext) { + ctx.Strict("BUILD_LICENSE_METADATA", + ctx.Config().HostToolPath(ctx, "build_license_metadata").String()) +} diff --git a/compliance/build_license_metadata/Android.bp b/compliance/build_license_metadata/Android.bp new file mode 100644 index 000000000..500034615 --- /dev/null +++ b/compliance/build_license_metadata/Android.bp @@ -0,0 +1,29 @@ +// Copyright 2021 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 { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +blueprint_go_binary { + name: "build_license_metadata", + srcs: [ + "build_license_metadata.go", + ], + deps: [ + "license_metadata_proto", + "golang-protobuf-proto", + "golang-protobuf-encoding-prototext", + ], +} diff --git a/compliance/build_license_metadata/build_license_metadata.go b/compliance/build_license_metadata/build_license_metadata.go new file mode 100644 index 000000000..ba3cc3ef8 --- /dev/null +++ b/compliance/build_license_metadata/build_license_metadata.go @@ -0,0 +1,174 @@ +// Copyright 2021 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 main + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/proto" + + "android/soong/compliance/license_metadata_proto" +) + +var ( + packageName = flag.String("p", "", "license package name") + moduleType = newMultiString("mt", "module type") + moduleClass = newMultiString("mc", "module class") + kinds = newMultiString("k", "license kinds") + conditions = newMultiString("c", "license conditions") + notices = newMultiString("n", "license notice file") + deps = newMultiString("d", "license metadata file dependency") + sources = newMultiString("s", "source (input) dependency") + built = newMultiString("t", "built targets") + installed = newMultiString("i", "installed targets") + roots = newMultiString("r", "root directory of project") + installedMap = newMultiString("m", "map dependent targets to their installed names") + isContainer = flag.Bool("is_container", false, "preserved dependent target name when given") + outFile = flag.String("o", "", "output file") +) + +func newMultiString(name, usage string) *multiString { + var f multiString + flag.Var(&f, name, usage) + return &f +} + +type multiString []string + +func (ms *multiString) String() string { return strings.Join(*ms, ", ") } +func (ms *multiString) Set(s string) error { *ms = append(*ms, s); return nil } + +func main() { + flag.Parse() + + metadata := license_metadata_proto.LicenseMetadata{} + metadata.PackageName = proto.String(*packageName) + metadata.ModuleTypes = *moduleType + metadata.ModuleClasses = *moduleClass + metadata.IsContainer = proto.Bool(*isContainer) + metadata.Projects = findGitRoots(*roots) + metadata.LicenseKinds = *kinds + metadata.LicenseConditions = *conditions + metadata.LicenseTexts = *notices + metadata.Built = *built + metadata.Installed = *installed + metadata.InstallMap = convertInstalledMap(*installedMap) + metadata.Sources = *sources + metadata.Deps = convertDependencies(*deps) + + err := writeMetadata(*outFile, &metadata) + if err != nil { + fmt.Fprintf(os.Stderr, "error: %s\n", err.Error()) + os.Exit(2) + } +} + +func findGitRoots(dirs []string) []string { + ret := make([]string, len(dirs)) + for i, dir := range dirs { + ret[i] = findGitRoot(dir) + } + return ret +} + +// findGitRoot finds the directory at or above dir that contains a ".git" directory. This isn't +// guaranteed to exist, for example during remote execution, when sandboxed, when building from +// infrastructure that doesn't use git, or when the .git directory has been removed to save space, +// but it should be good enough for local builds. If no .git directory is found the original value +// is returned. +func findGitRoot(dir string) string { + orig := dir + for dir != "" && dir != "." && dir != "/" { + _, err := os.Stat(filepath.Join(dir, ".git")) + if err == nil { + // Found dir/.git, return dir. + return dir + } else if !os.IsNotExist(err) { + // Error finding .git, return original input. + return orig + } + dir, _ = filepath.Split(dir) + dir = strings.TrimSuffix(dir, "/") + } + return orig +} + +// convertInstalledMap converts a list of colon-separated from:to pairs into InstallMap proto +// messages. +func convertInstalledMap(installMaps []string) []*license_metadata_proto.InstallMap { + var ret []*license_metadata_proto.InstallMap + + for _, installMap := range installMaps { + components := strings.Split(installMap, ":") + if len(components) != 2 { + panic(fmt.Errorf("install map entry %q contains %d colons, expected 1", len(components)-1)) + } + ret = append(ret, &license_metadata_proto.InstallMap{ + FromPath: proto.String(components[0]), + ContainerPath: proto.String(components[1]), + }) + } + + return ret +} + +// convertDependencies converts a colon-separated tuple of dependency:annotation:annotation... +// into AnnotatedDependency proto messages. +func convertDependencies(deps []string) []*license_metadata_proto.AnnotatedDependency { + var ret []*license_metadata_proto.AnnotatedDependency + + for _, d := range deps { + components := strings.Split(d, ":") + dep := components[0] + components = components[1:] + ad := &license_metadata_proto.AnnotatedDependency{ + File: proto.String(dep), + Annotations: make([]string, 0, len(components)), + } + for _, ann := range components { + if len(ann) == 0 { + continue + } + ad.Annotations = append(ad.Annotations, ann) + } + ret = append(ret, ad) + } + + return ret +} + +func writeMetadata(file string, metadata *license_metadata_proto.LicenseMetadata) error { + buf, err := prototext.MarshalOptions{Multiline: true}.Marshal(metadata) + if err != nil { + return fmt.Errorf("error marshalling textproto: %w", err) + } + + if file != "" { + err = ioutil.WriteFile(file, buf, 0666) + if err != nil { + return fmt.Errorf("error writing textproto %q: %w", file, err) + } + } else { + _, _ = os.Stdout.Write(buf) + } + + return nil +} diff --git a/compliance/license_metadata_proto/Android.bp b/compliance/license_metadata_proto/Android.bp new file mode 100644 index 000000000..3c041e48b --- /dev/null +++ b/compliance/license_metadata_proto/Android.bp @@ -0,0 +1,27 @@ +// Copyright 2021 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 { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +bootstrap_go_package { + name: "license_metadata_proto", + pkgPath: "android/soong/compliance/license_metadata_proto", + srcs: ["license_metadata.pb.go"], + deps: [ + "golang-protobuf-reflect-protoreflect", + "golang-protobuf-runtime-protoimpl", + ], +} diff --git a/compliance/license_metadata_proto/license_metadata.pb.go b/compliance/license_metadata_proto/license_metadata.pb.go new file mode 100644 index 000000000..44dbc7826 --- /dev/null +++ b/compliance/license_metadata_proto/license_metadata.pb.go @@ -0,0 +1,451 @@ +// Copyright 2021 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.19.0 +// source: license_metadata.proto + +package license_metadata_proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type LicenseMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // package_name identifies the source package. License texts are named relative to the package name. + PackageName *string `protobuf:"bytes,1,opt,name=package_name,json=packageName" json:"package_name,omitempty"` + ModuleTypes []string `protobuf:"bytes,2,rep,name=module_types,json=moduleTypes" json:"module_types,omitempty"` + ModuleClasses []string `protobuf:"bytes,3,rep,name=module_classes,json=moduleClasses" json:"module_classes,omitempty"` + // projects identifies the git project(s) containing the associated source code. + Projects []string `protobuf:"bytes,4,rep,name=projects" json:"projects,omitempty"` + // license_kinds lists the kinds of licenses. e.g. SPDX-license-identifier-Apache-2.0 or legacy_notice. + LicenseKinds []string `protobuf:"bytes,5,rep,name=license_kinds,json=licenseKinds" json:"license_kinds,omitempty"` + // license_conditions lists the conditions that apply to the license kinds. e.g. notice or restricted. + LicenseConditions []string `protobuf:"bytes,6,rep,name=license_conditions,json=licenseConditions" json:"license_conditions,omitempty"` + // license_texts lists the filenames of the associated license text(s). + LicenseTexts []string `protobuf:"bytes,7,rep,name=license_texts,json=licenseTexts" json:"license_texts,omitempty"` + // is_container is true for target types that merely aggregate. e.g. .img or .zip files. + IsContainer *bool `protobuf:"varint,8,opt,name=is_container,json=isContainer" json:"is_container,omitempty"` + // built lists the built targets. + Built []string `protobuf:"bytes,9,rep,name=built" json:"built,omitempty"` + // installed lists the installed targets. + Installed []string `protobuf:"bytes,10,rep,name=installed" json:"installed,omitempty"` + // installMap identifies the substitutions to make to path names when moving into installed location. + InstallMap []*InstallMap `protobuf:"bytes,11,rep,name=install_map,json=installMap" json:"install_map,omitempty"` + // sources lists the targets depended on. + Sources []string `protobuf:"bytes,12,rep,name=sources" json:"sources,omitempty"` + // deps lists the license metadata files depended on. + Deps []*AnnotatedDependency `protobuf:"bytes,13,rep,name=deps" json:"deps,omitempty"` +} + +func (x *LicenseMetadata) Reset() { + *x = LicenseMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_license_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseMetadata) ProtoMessage() {} + +func (x *LicenseMetadata) ProtoReflect() protoreflect.Message { + mi := &file_license_metadata_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseMetadata.ProtoReflect.Descriptor instead. +func (*LicenseMetadata) Descriptor() ([]byte, []int) { + return file_license_metadata_proto_rawDescGZIP(), []int{0} +} + +func (x *LicenseMetadata) GetPackageName() string { + if x != nil && x.PackageName != nil { + return *x.PackageName + } + return "" +} + +func (x *LicenseMetadata) GetModuleTypes() []string { + if x != nil { + return x.ModuleTypes + } + return nil +} + +func (x *LicenseMetadata) GetModuleClasses() []string { + if x != nil { + return x.ModuleClasses + } + return nil +} + +func (x *LicenseMetadata) GetProjects() []string { + if x != nil { + return x.Projects + } + return nil +} + +func (x *LicenseMetadata) GetLicenseKinds() []string { + if x != nil { + return x.LicenseKinds + } + return nil +} + +func (x *LicenseMetadata) GetLicenseConditions() []string { + if x != nil { + return x.LicenseConditions + } + return nil +} + +func (x *LicenseMetadata) GetLicenseTexts() []string { + if x != nil { + return x.LicenseTexts + } + return nil +} + +func (x *LicenseMetadata) GetIsContainer() bool { + if x != nil && x.IsContainer != nil { + return *x.IsContainer + } + return false +} + +func (x *LicenseMetadata) GetBuilt() []string { + if x != nil { + return x.Built + } + return nil +} + +func (x *LicenseMetadata) GetInstalled() []string { + if x != nil { + return x.Installed + } + return nil +} + +func (x *LicenseMetadata) GetInstallMap() []*InstallMap { + if x != nil { + return x.InstallMap + } + return nil +} + +func (x *LicenseMetadata) GetSources() []string { + if x != nil { + return x.Sources + } + return nil +} + +func (x *LicenseMetadata) GetDeps() []*AnnotatedDependency { + if x != nil { + return x.Deps + } + return nil +} + +// InstallMap messages describe the mapping from an input filesystem file to the path to the file +// in a container. +type InstallMap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The input path on the filesystem. + FromPath *string `protobuf:"bytes,1,opt,name=from_path,json=fromPath" json:"from_path,omitempty"` + // The path to the file inside the container or installed location. + ContainerPath *string `protobuf:"bytes,2,opt,name=container_path,json=containerPath" json:"container_path,omitempty"` +} + +func (x *InstallMap) Reset() { + *x = InstallMap{} + if protoimpl.UnsafeEnabled { + mi := &file_license_metadata_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstallMap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstallMap) ProtoMessage() {} + +func (x *InstallMap) ProtoReflect() protoreflect.Message { + mi := &file_license_metadata_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InstallMap.ProtoReflect.Descriptor instead. +func (*InstallMap) Descriptor() ([]byte, []int) { + return file_license_metadata_proto_rawDescGZIP(), []int{1} +} + +func (x *InstallMap) GetFromPath() string { + if x != nil && x.FromPath != nil { + return *x.FromPath + } + return "" +} + +func (x *InstallMap) GetContainerPath() string { + if x != nil && x.ContainerPath != nil { + return *x.ContainerPath + } + return "" +} + +// AnnotateDepencency messages describe edges in the build graph. +type AnnotatedDependency struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path to the dependency license metadata file. + File *string `protobuf:"bytes,1,opt,name=file" json:"file,omitempty"` + // The annotations attached to the dependency. + Annotations []string `protobuf:"bytes,2,rep,name=annotations" json:"annotations,omitempty"` +} + +func (x *AnnotatedDependency) Reset() { + *x = AnnotatedDependency{} + if protoimpl.UnsafeEnabled { + mi := &file_license_metadata_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AnnotatedDependency) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AnnotatedDependency) ProtoMessage() {} + +func (x *AnnotatedDependency) ProtoReflect() protoreflect.Message { + mi := &file_license_metadata_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AnnotatedDependency.ProtoReflect.Descriptor instead. +func (*AnnotatedDependency) Descriptor() ([]byte, []int) { + return file_license_metadata_proto_rawDescGZIP(), []int{2} +} + +func (x *AnnotatedDependency) GetFile() string { + if x != nil && x.File != nil { + return *x.File + } + return "" +} + +func (x *AnnotatedDependency) GetAnnotations() []string { + if x != nil { + return x.Annotations + } + return nil +} + +var File_license_metadata_proto protoreflect.FileDescriptor + +var file_license_metadata_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x8a, 0x04, 0x0a, 0x0f, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b, 0x69, 0x6e, + 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x65, 0x78, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, + 0x6c, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x43, 0x0a, + 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, + 0x61, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x0c, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x04, + 0x64, 0x65, 0x70, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x44, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x22, 0x50, 0x0a, + 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x22, + 0x4b, 0x0a, 0x13, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x31, 0x5a, 0x2f, + 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x2f, 0x73, 0x6f, 0x6f, 0x6e, 0x67, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_license_metadata_proto_rawDescOnce sync.Once + file_license_metadata_proto_rawDescData = file_license_metadata_proto_rawDesc +) + +func file_license_metadata_proto_rawDescGZIP() []byte { + file_license_metadata_proto_rawDescOnce.Do(func() { + file_license_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_license_metadata_proto_rawDescData) + }) + return file_license_metadata_proto_rawDescData +} + +var file_license_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_license_metadata_proto_goTypes = []interface{}{ + (*LicenseMetadata)(nil), // 0: build_license_metadata.LicenseMetadata + (*InstallMap)(nil), // 1: build_license_metadata.InstallMap + (*AnnotatedDependency)(nil), // 2: build_license_metadata.AnnotatedDependency +} +var file_license_metadata_proto_depIdxs = []int32{ + 1, // 0: build_license_metadata.LicenseMetadata.install_map:type_name -> build_license_metadata.InstallMap + 2, // 1: build_license_metadata.LicenseMetadata.deps:type_name -> build_license_metadata.AnnotatedDependency + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_license_metadata_proto_init() } +func file_license_metadata_proto_init() { + if File_license_metadata_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_license_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_license_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstallMap); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_license_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AnnotatedDependency); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_license_metadata_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_license_metadata_proto_goTypes, + DependencyIndexes: file_license_metadata_proto_depIdxs, + MessageInfos: file_license_metadata_proto_msgTypes, + }.Build() + File_license_metadata_proto = out.File + file_license_metadata_proto_rawDesc = nil + file_license_metadata_proto_goTypes = nil + file_license_metadata_proto_depIdxs = nil +} diff --git a/compliance/license_metadata_proto/license_metadata.proto b/compliance/license_metadata_proto/license_metadata.proto new file mode 100644 index 000000000..1b4f34fa8 --- /dev/null +++ b/compliance/license_metadata_proto/license_metadata.proto @@ -0,0 +1,76 @@ +// Copyright 2021 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. + +syntax = "proto2"; + +package build_license_metadata; +option go_package = "android/soong/compliance/license_metadata_proto"; + +message LicenseMetadata { + // package_name identifies the source package. License texts are named relative to the package name. + optional string package_name = 1; + + repeated string module_types = 2; + + repeated string module_classes = 3; + + // projects identifies the git project(s) containing the associated source code. + repeated string projects = 4; + + // license_kinds lists the kinds of licenses. e.g. SPDX-license-identifier-Apache-2.0 or legacy_notice. + repeated string license_kinds = 5; + + // license_conditions lists the conditions that apply to the license kinds. e.g. notice or restricted. + repeated string license_conditions = 6; + + // license_texts lists the filenames of the associated license text(s). + repeated string license_texts = 7; + + // is_container is true for target types that merely aggregate. e.g. .img or .zip files. + optional bool is_container = 8; + + // built lists the built targets. + repeated string built = 9; + + // installed lists the installed targets. + repeated string installed = 10; + + // installMap identifies the substitutions to make to path names when moving into installed location. + repeated InstallMap install_map = 11; + + // sources lists the targets depended on. + repeated string sources = 12; + + // deps lists the license metadata files depended on. + repeated AnnotatedDependency deps = 13; +} + +// InstallMap messages describe the mapping from an input filesystem file to the path to the file +// in a container. +message InstallMap { + // The input path on the filesystem. + optional string from_path = 1; + + // The path to the file inside the container or installed location. + optional string container_path = 2; +} + +// AnnotateDepencency messages describe edges in the build graph. +message AnnotatedDependency { + // The path to the dependency license metadata file. + optional string file = 1; + + // The annotations attached to the dependency. + repeated string annotations = 2; +}