summaryrefslogtreecommitdiff
path: root/aconfig/build_flags/release_configs.go
blob: 3fa8a7c02fe739c11c658e47981a6998b16f4e10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 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),
	})

}