Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 735a80bf authored by LaMont Jones's avatar LaMont Jones
Browse files

Add release_config_contributions modules

These are used to enumerate what directories may contribute to release
configs, whether or not they are actually used in the build.

Bug: b/370544058
Test: manual, TH
Change-Id: I1509eb3795a9b51b29995b182b77ade76021bb52
parent 1119e46b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ bootstrap_go_package {
        "build_flags_singleton.go",
        "declarations.go",
        "init.go",
        "release_configs.go",
    ],
    testSrcs: [
    ],
+63 −18
Original line number Diff line number Diff line
@@ -30,49 +30,94 @@ func AllBuildFlagDeclarationsFactory() android.Singleton {
}

type allBuildFlagDeclarationsSingleton struct {
	intermediateBinaryProtoPath android.OutputPath
	intermediateTextProtoPath   android.OutputPath
	flagsBinaryProtoPath   android.OutputPath
	flagsTextProtoPath     android.OutputPath
	configsBinaryProtoPath android.OutputPath
	configsTextProtoPath   android.OutputPath
}

func (this *allBuildFlagDeclarationsSingleton) GenerateBuildActions(ctx android.SingletonContext) {
	// Find all of the build_flag_declarations modules
	var intermediateFiles android.Paths
	var flagsFiles android.Paths
	// Find all of the release_config_contribution modules
	var contributionDirs android.Paths
	ctx.VisitAllModules(func(module android.Module) {
		decl, ok := android.OtherModuleProvider(ctx, module, BuildFlagDeclarationsProviderKey)
		if !ok {
			return
		if ok {
			flagsFiles = append(flagsFiles, decl.IntermediateCacheOutputPath)
		}

		contrib, ok := android.OtherModuleProvider(ctx, module, ReleaseConfigContributionsProviderKey)
		if ok {
			contributionDirs = append(contributionDirs, contrib.ContributionDir)
		}
		intermediateFiles = append(intermediateFiles, decl.IntermediateCacheOutputPath)
	})

	// Generate build action for build_flag (binary proto output)
	this.intermediateBinaryProtoPath = android.PathForIntermediates(ctx, "all_build_flag_declarations.pb")
	this.flagsBinaryProtoPath = android.PathForIntermediates(ctx, "all_build_flag_declarations.pb")
	ctx.Build(pctx, android.BuildParams{
		Rule:        allDeclarationsRule,
		Inputs:      intermediateFiles,
		Output:      this.intermediateBinaryProtoPath,
		Inputs:      flagsFiles,
		Output:      this.flagsBinaryProtoPath,
		Description: "all_build_flag_declarations",
		Args: map[string]string{
			"intermediates": android.JoinPathsWithPrefix(intermediateFiles, "--intermediate "),
			"intermediates": android.JoinPathsWithPrefix(flagsFiles, "--intermediate "),
		},
	})
	ctx.Phony("all_build_flag_declarations", this.intermediateBinaryProtoPath)
	ctx.Phony("all_build_flag_declarations", this.flagsBinaryProtoPath)

	// Generate build action for build_flag (text proto output)
	this.intermediateTextProtoPath = android.PathForIntermediates(ctx, "all_build_flag_declarations.textproto")
	this.flagsTextProtoPath = android.PathForIntermediates(ctx, "all_build_flag_declarations.textproto")
	ctx.Build(pctx, android.BuildParams{
		Rule:        allDeclarationsRuleTextProto,
		Input:       this.intermediateBinaryProtoPath,
		Output:      this.intermediateTextProtoPath,
		Input:       this.flagsBinaryProtoPath,
		Output:      this.flagsTextProtoPath,
		Description: "all_build_flag_declarations_textproto",
	})
	ctx.Phony("all_build_flag_declarations_textproto", this.intermediateTextProtoPath)
	ctx.Phony("all_build_flag_declarations_textproto", this.flagsTextProtoPath)

	// Generate build action for release_configs (binary proto output)
	this.configsBinaryProtoPath = android.PathForIntermediates(ctx, "all_release_config_contributions.pb")
	ctx.Build(pctx, android.BuildParams{
		Rule:        allReleaseConfigContributionsRule,
		Inputs:      contributionDirs,
		Output:      this.configsBinaryProtoPath,
		Description: "all_release_config_contributions",
		Args: map[string]string{
			"dirs":   android.JoinPathsWithPrefix(contributionDirs, "--dir "),
			"format": "pb",
		},
	})
	ctx.Phony("all_release_config_contributions", this.configsBinaryProtoPath)

	this.configsTextProtoPath = android.PathForIntermediates(ctx, "all_release_config_contributions.textproto")
	ctx.Build(pctx, android.BuildParams{
		Rule:        allReleaseConfigContributionsRule,
		Inputs:      contributionDirs,
		Output:      this.configsTextProtoPath,
		Description: "all_release_config_contributions_textproto",
		Args: map[string]string{
			"dirs":   android.JoinPathsWithPrefix(contributionDirs, "--dir "),
			"format": "textproto",
		},
	})
	ctx.Phony("all_release_config_contributions_textproto", this.configsTextProtoPath)

	// Add a simple target for ci/build_metadata to use.
	ctx.Phony("release_config_metadata",
		this.flagsBinaryProtoPath,
		this.flagsTextProtoPath,
		this.configsBinaryProtoPath,
		this.configsTextProtoPath,
	)
}

func (this *allBuildFlagDeclarationsSingleton) MakeVars(ctx android.MakeVarsContext) {
	ctx.DistForGoal("droid", this.intermediateBinaryProtoPath)
	ctx.DistForGoal("droid", this.flagsBinaryProtoPath)
	for _, goal := range []string{"docs", "droid", "sdk"} {
		ctx.DistForGoalWithFilename(goal, this.intermediateBinaryProtoPath, "build_flags/all_flags.pb")
		ctx.DistForGoalWithFilename(goal, this.intermediateTextProtoPath, "build_flags/all_flags.textproto")
		ctx.DistForGoalWithFilename(goal, this.flagsBinaryProtoPath, "build_flags/all_flags.pb")
		ctx.DistForGoalWithFilename(goal, this.flagsTextProtoPath, "build_flags/all_flags.textproto")
		ctx.DistForGoalWithFilename(goal, this.configsBinaryProtoPath, "build_flags/all_release_config_contributions.pb")
		ctx.DistForGoalWithFilename(goal, this.configsTextProtoPath, "build_flags/all_release_config_contributions.textproto")
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ type DeclarationsModule struct {

	// Properties for "aconfig_declarations"
	properties struct {
		// aconfig files, relative to this Android.bp file
		// build flag declaration files, relative to this Android.bp file
		Srcs []string `android:"path"`
	}
}
+17 −0
Original line number Diff line number Diff line
@@ -65,15 +65,32 @@ var (
				"${buildFlagDeclarations}",
			},
		})

	allReleaseConfigContributionsRule = pctx.AndroidStaticRule("all-release-config-contributions-dump",
		blueprint.RuleParams{
			Command: `${releaseConfigContributions} ${dirs} --format ${format} --output ${out}`,
			CommandDeps: []string{
				"${releaseConfigContributions}",
			},
		}, "dirs", "format")
	allReleaseConfigContributionsRuleText = pctx.AndroidStaticRule("all-release-config-contributions-dumptext",
		blueprint.RuleParams{
			Command: `${releaseConfigContributions} ${dirs} --format ${format} --output ${out}`,
			CommandDeps: []string{
				"${releaseConfigContributions}",
			},
		}, "dirs", "format")
)

func init() {
	RegisterBuildComponents(android.InitRegistrationContext)
	pctx.Import("android/soong/android")
	pctx.HostBinToolVariable("buildFlagDeclarations", "build-flag-declarations")
	pctx.HostBinToolVariable("releaseConfigContributions", "release-config-contributions")
}

func RegisterBuildComponents(ctx android.RegistrationContext) {
	ctx.RegisterModuleType("build_flag_declarations", DeclarationsFactory)
	ctx.RegisterModuleType("release_config_contributions", ReleaseConfigContributionsFactory)
	ctx.RegisterParallelSingletonType("all_build_flag_declarations", AllBuildFlagDeclarationsFactory)
}
+78 −0
Original line number Diff line number Diff line
// Copyright 2023 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 build_flags

import (
	"path/filepath"

	"android/soong/android"

	"github.com/google/blueprint"
)

type ReleaseConfigContributionsProviderData struct {
	ContributionDir android.SourcePath
}

var ReleaseConfigContributionsProviderKey = blueprint.NewProvider[ReleaseConfigContributionsProviderData]()

// Soong uses `release_config_contributions` modules to produce the
// `build_flags/all_release_config_contributions.*` artifacts, listing *all* of
// the directories in the source tree that contribute to each release config,
// whether or not they are actually used for the lunch product.
//
// This artifact helps flagging automation determine in which directory a flag
// should be placed by default.
type ReleaseConfigContributionsModule struct {
	android.ModuleBase
	android.DefaultableModuleBase

	// Properties for "release_config_contributions"
	properties struct {
		// The `release_configs/*.textproto` files provided by this
		// directory, relative to this Android.bp file
		Srcs []string `android:"path"`
	}
}

func ReleaseConfigContributionsFactory() android.Module {
	module := &ReleaseConfigContributionsModule{}

	android.InitAndroidModule(module)
	android.InitDefaultableModule(module)
	module.AddProperties(&module.properties)

	return module
}

func (module *ReleaseConfigContributionsModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	srcs := android.PathsForModuleSrc(ctx, module.properties.Srcs)
	if len(srcs) == 0 {
		return
	}
	contributionDir := filepath.Dir(filepath.Dir(srcs[0].String()))
	for _, file := range srcs {
		if filepath.Dir(filepath.Dir(file.String())) != contributionDir {
			ctx.ModuleErrorf("Cannot include %s with %s contributions", file, contributionDir)
		}
		if filepath.Base(filepath.Dir(file.String())) != "release_configs" || file.Ext() != ".textproto" {
			ctx.ModuleErrorf("Invalid contribution file %s", file)
		}
	}
	android.SetProvider(ctx, ReleaseConfigContributionsProviderKey, ReleaseConfigContributionsProviderData{
		ContributionDir: android.PathForSource(ctx, contributionDir),
	})

}
Loading