1*333d2b36SAndroid Build Coastguard Worker/* 2*333d2b36SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*333d2b36SAndroid Build Coastguard Worker * 4*333d2b36SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*333d2b36SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*333d2b36SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*333d2b36SAndroid Build Coastguard Worker * 8*333d2b36SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*333d2b36SAndroid Build Coastguard Worker * 10*333d2b36SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*333d2b36SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*333d2b36SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*333d2b36SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*333d2b36SAndroid Build Coastguard Worker * limitations under the License. 15*333d2b36SAndroid Build Coastguard Worker */ 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerpackage provenance 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport ( 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workervar ( 26*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/provenance") 27*333d2b36SAndroid Build Coastguard Worker rule = pctx.HostBinToolVariable("gen_provenance_metadata", "gen_provenance_metadata") 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker genProvenanceMetaData = pctx.AndroidStaticRule("genProvenanceMetaData", 30*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 31*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf "$out" && ` + 32*333d2b36SAndroid Build Coastguard Worker `${gen_provenance_metadata} --module_name=${module_name} ` + 33*333d2b36SAndroid Build Coastguard Worker `--artifact_path=$in --install_path=${install_path} --metadata_path=$out`, 34*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${gen_provenance_metadata}"}, 35*333d2b36SAndroid Build Coastguard Worker }, "module_name", "install_path") 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Worker mergeProvenanceMetaData = pctx.AndroidStaticRule("mergeProvenanceMetaData", 38*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 39*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $out && ` + 40*333d2b36SAndroid Build Coastguard Worker `echo "# proto-file: build/soong/provenance/proto/provenance_metadata.proto" > $out && ` + 41*333d2b36SAndroid Build Coastguard Worker `echo "# proto-message: ProvenanceMetaDataList" >> $out && ` + 42*333d2b36SAndroid Build Coastguard Worker `cat $out.rsp | tr ' ' '\n' | while read -r file || [ -n "$$file" ]; do echo '' >> $out; echo 'metadata {' | cat - $$file | grep -Ev "^#.*|^$$" >> $out; echo '}' >> $out; done`, 43*333d2b36SAndroid Build Coastguard Worker Rspfile: `$out.rsp`, 44*333d2b36SAndroid Build Coastguard Worker RspfileContent: `$in`, 45*333d2b36SAndroid Build Coastguard Worker }) 46*333d2b36SAndroid Build Coastguard Worker) 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workertype ProvenanceMetadata interface { 49*333d2b36SAndroid Build Coastguard Worker ProvenanceMetaDataFile() android.Path 50*333d2b36SAndroid Build Coastguard Worker} 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerfunc init() { 53*333d2b36SAndroid Build Coastguard Worker RegisterProvenanceSingleton(android.InitRegistrationContext) 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc RegisterProvenanceSingleton(ctx android.RegistrationContext) { 57*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("provenance_metadata_singleton", provenanceInfoSingletonFactory) 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithProvenanceSingleton = android.FixtureRegisterWithContext(RegisterProvenanceSingleton) 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc provenanceInfoSingletonFactory() android.Singleton { 63*333d2b36SAndroid Build Coastguard Worker return &provenanceInfoSingleton{} 64*333d2b36SAndroid Build Coastguard Worker} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workertype provenanceInfoSingleton struct { 67*333d2b36SAndroid Build Coastguard Worker mergedMetaDataFile android.OutputPath 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workerfunc (p *provenanceInfoSingleton) GenerateBuildActions(context android.SingletonContext) { 71*333d2b36SAndroid Build Coastguard Worker allMetaDataFiles := make([]android.Path, 0) 72*333d2b36SAndroid Build Coastguard Worker moduleFilter := func(module android.Module) bool { 73*333d2b36SAndroid Build Coastguard Worker if !module.Enabled(context) || module.IsSkipInstall() { 74*333d2b36SAndroid Build Coastguard Worker return false 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker if p, ok := module.(ProvenanceMetadata); ok { 77*333d2b36SAndroid Build Coastguard Worker return p.ProvenanceMetaDataFile() != nil 78*333d2b36SAndroid Build Coastguard Worker } 79*333d2b36SAndroid Build Coastguard Worker return false 80*333d2b36SAndroid Build Coastguard Worker } 81*333d2b36SAndroid Build Coastguard Worker context.VisitAllModulesIf(moduleFilter, func(module android.Module) { 82*333d2b36SAndroid Build Coastguard Worker if p, ok := module.(ProvenanceMetadata); ok { 83*333d2b36SAndroid Build Coastguard Worker allMetaDataFiles = append(allMetaDataFiles, p.ProvenanceMetaDataFile()) 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker }) 86*333d2b36SAndroid Build Coastguard Worker p.mergedMetaDataFile = android.PathForOutput(context, "provenance_metadata.textproto") 87*333d2b36SAndroid Build Coastguard Worker context.Build(pctx, android.BuildParams{ 88*333d2b36SAndroid Build Coastguard Worker Rule: mergeProvenanceMetaData, 89*333d2b36SAndroid Build Coastguard Worker Description: "merge provenance metadata", 90*333d2b36SAndroid Build Coastguard Worker Inputs: allMetaDataFiles, 91*333d2b36SAndroid Build Coastguard Worker Output: p.mergedMetaDataFile, 92*333d2b36SAndroid Build Coastguard Worker }) 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker context.Build(pctx, android.BuildParams{ 95*333d2b36SAndroid Build Coastguard Worker Rule: blueprint.Phony, 96*333d2b36SAndroid Build Coastguard Worker Description: "phony rule of merge provenance metadata", 97*333d2b36SAndroid Build Coastguard Worker Inputs: []android.Path{p.mergedMetaDataFile}, 98*333d2b36SAndroid Build Coastguard Worker Output: android.PathForPhony(context, "provenance_metadata"), 99*333d2b36SAndroid Build Coastguard Worker }) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker context.Phony("droidcore", android.PathForPhony(context, "provenance_metadata")) 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Workerfunc GenerateArtifactProvenanceMetaData(ctx android.ModuleContext, artifactPath android.Path, installedFile android.InstallPath) android.Path { 105*333d2b36SAndroid Build Coastguard Worker onDevicePathOfInstalledFile := android.InstallPathToOnDevicePath(ctx, installedFile) 106*333d2b36SAndroid Build Coastguard Worker artifactMetaDataFile := android.PathForIntermediates(ctx, "provenance_metadata", ctx.ModuleDir(), ctx.ModuleName(), "provenance_metadata.textproto") 107*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 108*333d2b36SAndroid Build Coastguard Worker Rule: genProvenanceMetaData, 109*333d2b36SAndroid Build Coastguard Worker Description: "generate artifact provenance metadata", 110*333d2b36SAndroid Build Coastguard Worker Inputs: []android.Path{artifactPath}, 111*333d2b36SAndroid Build Coastguard Worker Output: artifactMetaDataFile, 112*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 113*333d2b36SAndroid Build Coastguard Worker "module_name": ctx.ModuleName(), 114*333d2b36SAndroid Build Coastguard Worker "install_path": onDevicePathOfInstalledFile, 115*333d2b36SAndroid Build Coastguard Worker }}) 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker return artifactMetaDataFile 118*333d2b36SAndroid Build Coastguard Worker} 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Workerfunc (p *provenanceInfoSingleton) MakeVars(ctx android.MakeVarsContext) { 121*333d2b36SAndroid Build Coastguard Worker ctx.DistForGoal("droidcore", p.mergedMetaDataFile) 122*333d2b36SAndroid Build Coastguard Worker} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Workervar _ android.SingletonMakeVarsProvider = (*provenanceInfoSingleton)(nil) 125