/* * Copyright (C) 2022 The Android Open Source Project * * 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 provenance import ( "android/soong/android" "github.com/google/blueprint" ) var ( pctx = android.NewPackageContext("android/soong/provenance") rule = pctx.HostBinToolVariable("gen_provenance_metadata", "gen_provenance_metadata") genProvenanceMetaData = pctx.AndroidStaticRule("genProvenanceMetaData", blueprint.RuleParams{ Command: `rm -rf "$out" && ` + `${gen_provenance_metadata} --module_name=${module_name} ` + `--artifact_path=$in --install_path=${install_path} --metadata_path=$out`, CommandDeps: []string{"${gen_provenance_metadata}"}, }, "module_name", "install_path") mergeProvenanceMetaData = pctx.AndroidStaticRule("mergeProvenanceMetaData", blueprint.RuleParams{ Command: `rm -rf $out && ` + `echo "# proto-file: build/soong/provenance/proto/provenance_metadata.proto" > $out && ` + `echo "# proto-message: ProvenanceMetaDataList" >> $out && ` + `cat $out.rsp | tr ' ' '\n' | while read -r file || [ -n "$$file" ]; do echo '' >> $out; echo 'metadata {' | cat - $$file | grep -Ev "^#.*|^$$" >> $out; echo '}' >> $out; done`, Rspfile: `$out.rsp`, RspfileContent: `$in`, }) ) type ProvenanceMetadata interface { ProvenanceMetaDataFile() android.OutputPath } func init() { RegisterProvenanceSingleton(android.InitRegistrationContext) } func RegisterProvenanceSingleton(ctx android.RegistrationContext) { ctx.RegisterParallelSingletonType("provenance_metadata_singleton", provenanceInfoSingletonFactory) } var PrepareForTestWithProvenanceSingleton = android.FixtureRegisterWithContext(RegisterProvenanceSingleton) func provenanceInfoSingletonFactory() android.Singleton { return &provenanceInfoSingleton{} } type provenanceInfoSingleton struct { mergedMetaDataFile android.OutputPath } func (p *provenanceInfoSingleton) GenerateBuildActions(context android.SingletonContext) { allMetaDataFiles := make([]android.Path, 0) context.VisitAllModulesIf(moduleFilter, func(module android.Module) { if p, ok := module.(ProvenanceMetadata); ok { allMetaDataFiles = append(allMetaDataFiles, p.ProvenanceMetaDataFile()) } }) p.mergedMetaDataFile = android.PathForOutput(context, "provenance_metadata.textproto") context.Build(pctx, android.BuildParams{ Rule: mergeProvenanceMetaData, Description: "merge provenance metadata", Inputs: allMetaDataFiles, Output: p.mergedMetaDataFile, }) context.Build(pctx, android.BuildParams{ Rule: blueprint.Phony, Description: "phony rule of merge provenance metadata", Inputs: []android.Path{p.mergedMetaDataFile}, Output: android.PathForPhony(context, "provenance_metadata"), }) context.Phony("droidcore", android.PathForPhony(context, "provenance_metadata")) } func moduleFilter(module android.Module) bool { if !module.Enabled() || module.IsSkipInstall() { return false } if p, ok := module.(ProvenanceMetadata); ok { return p.ProvenanceMetaDataFile().String() != "" } return false } func GenerateArtifactProvenanceMetaData(ctx android.ModuleContext, artifactPath android.Path, installedFile android.InstallPath) android.OutputPath { onDevicePathOfInstalledFile := android.InstallPathToOnDevicePath(ctx, installedFile) artifactMetaDataFile := android.PathForIntermediates(ctx, "provenance_metadata", ctx.ModuleDir(), ctx.ModuleName(), "provenance_metadata.textproto") ctx.Build(pctx, android.BuildParams{ Rule: genProvenanceMetaData, Description: "generate artifact provenance metadata", Inputs: []android.Path{artifactPath}, Output: artifactMetaDataFile, Args: map[string]string{ "module_name": ctx.ModuleName(), "install_path": onDevicePathOfInstalledFile, }}) return artifactMetaDataFile } func (p *provenanceInfoSingleton) MakeVars(ctx android.MakeVarsContext) { ctx.DistForGoal("droidcore", p.mergedMetaDataFile) } var _ android.SingletonMakeVarsProvider = (*provenanceInfoSingleton)(nil)