Merge changes from topic "aconfig_renames"

* changes:
  Rename device_config --> aconfig and definitions --> declarations
  Rename aconfig namespace to package.
This commit is contained in:
Joe Onorato
2023-06-22 13:30:53 +00:00
committed by Gerrit Code Review
13 changed files with 172 additions and 172 deletions

View File

@@ -3,8 +3,8 @@ package {
}
bootstrap_go_package {
name: "soong-device_config",
pkgPath: "android/soong/device_config",
name: "soong-aconfig",
pkgPath: "android/soong/aconfig",
deps: [
"blueprint",
"blueprint-pathtools",
@@ -16,17 +16,17 @@ bootstrap_go_package {
"soong-java",
],
srcs: [
"device_config_definitions.go",
"device_config_values.go",
"device_config_value_set.go",
"aconfig_declarations.go",
"aconfig_values.go",
"aconfig_value_set.go",
"init.go",
"java_device_config_definitions_library.go",
"java_aconfig_library.go",
"testing.go",
],
testSrcs: [
"device_config_definitions_test.go",
"device_config_values_test.go",
"device_config_value_set_test.go",
"aconfig_declarations_test.go",
"aconfig_values_test.go",
"aconfig_value_set_test.go",
],
pluginFor: ["soong_build"],
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"android/soong/android"
@@ -21,27 +21,27 @@ import (
"strings"
)
type DefinitionsModule struct {
type DeclarationsModule struct {
android.ModuleBase
android.DefaultableModuleBase
// Properties for "device_config_definitions"
// Properties for "aconfig_declarations"
properties struct {
// aconfig files, relative to this Android.bp file
Srcs []string `android:"path"`
// Release config flag namespace
Namespace string
// Release config flag package
Package string
// Values from TARGET_RELEASE / RELEASE_DEVICE_CONFIG_VALUE_SETS
// Values from TARGET_RELEASE / RELEASE_ACONFIG_VALUE_SETS
Values []string `blueprint:"mutated"`
}
intermediatePath android.WritablePath
}
func DefinitionsFactory() android.Module {
module := &DefinitionsModule{}
func DeclarationsFactory() android.Module {
module := &DeclarationsModule{}
android.InitAndroidModule(module)
android.InitDefaultableModule(module)
@@ -58,24 +58,24 @@ type implicitValuesTagType struct {
var implicitValuesTag = implicitValuesTagType{}
func (module *DefinitionsModule) DepsMutator(ctx android.BottomUpMutatorContext) {
func (module *DeclarationsModule) DepsMutator(ctx android.BottomUpMutatorContext) {
// Validate Properties
if len(module.properties.Srcs) == 0 {
ctx.PropertyErrorf("srcs", "missing source files")
return
}
if len(module.properties.Namespace) == 0 {
ctx.PropertyErrorf("namespace", "missing namespace property")
if len(module.properties.Package) == 0 {
ctx.PropertyErrorf("package", "missing package property")
}
// Add a dependency on the device_config_value_sets defined in
// RELEASE_DEVICE_CONFIG_VALUE_SETS, and add any device_config_values that
// match our namespace.
valuesFromConfig := ctx.Config().ReleaseDeviceConfigValueSets()
// Add a dependency on the aconfig_value_sets defined in
// RELEASE_ACONFIG_VALUE_SETS, and add any aconfig_values that
// match our package.
valuesFromConfig := ctx.Config().ReleaseAconfigValueSets()
ctx.AddDependency(ctx.Module(), implicitValuesTag, valuesFromConfig...)
}
func (module *DefinitionsModule) OutputFiles(tag string) (android.Paths, error) {
func (module *DeclarationsModule) OutputFiles(tag string) (android.Paths, error) {
switch tag {
case "":
// The default output of this module is the intermediates format, which is
@@ -83,7 +83,7 @@ func (module *DefinitionsModule) OutputFiles(tag string) (android.Paths, error)
// correctly.
return []android.Path{module.intermediatePath}, nil
default:
return nil, fmt.Errorf("unsupported device_config_definitions module reference tag %q", tag)
return nil, fmt.Errorf("unsupported aconfig_declarations module reference tag %q", tag)
}
}
@@ -96,23 +96,23 @@ func joinAndPrefix(prefix string, values []string) string {
return sb.String()
}
// Provider published by device_config_value_set
type definitionsProviderData struct {
namespace string
intermediatePath android.WritablePath
// Provider published by aconfig_value_set
type declarationsProviderData struct {
Package string
IntermediatePath android.WritablePath
}
var definitionsProviderKey = blueprint.NewProvider(definitionsProviderData{})
var declarationsProviderKey = blueprint.NewProvider(declarationsProviderData{})
func (module *DefinitionsModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Get the values that came from the global RELEASE_DEVICE_CONFIG_VALUE_SETS flag
func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
ctx.VisitDirectDeps(func(dep android.Module) {
if !ctx.OtherModuleHasProvider(dep, valueSetProviderKey) {
// Other modules get injected as dependencies too, for example the license modules
return
}
depData := ctx.OtherModuleProvider(dep, valueSetProviderKey).(valueSetProviderData)
valuesFiles, ok := depData.AvailableNamespaces[module.properties.Namespace]
valuesFiles, ok := depData.AvailablePackages[module.properties.Package]
if ok {
for _, path := range valuesFiles {
module.properties.Values = append(module.properties.Values, path.String())
@@ -127,17 +127,17 @@ func (module *DefinitionsModule) GenerateAndroidBuildActions(ctx android.ModuleC
Rule: aconfigRule,
Inputs: inputFiles,
Output: intermediatePath,
Description: "device_config_definitions",
Description: "aconfig_declarations",
Args: map[string]string{
"release_version": ctx.Config().ReleaseVersion(),
"namespace": module.properties.Namespace,
"package": module.properties.Package,
"values": joinAndPrefix(" --values ", module.properties.Values),
},
})
ctx.SetProvider(definitionsProviderKey, definitionsProviderData{
namespace: module.properties.Namespace,
intermediatePath: intermediatePath,
ctx.SetProvider(declarationsProviderKey, declarationsProviderData{
Package: module.properties.Package,
IntermediatePath: intermediatePath,
})
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"strings"
@@ -21,22 +21,22 @@ import (
"android/soong/android"
)
func TestDeviceConfigDefinitions(t *testing.T) {
func TestAconfigDeclarations(t *testing.T) {
bp := `
device_config_definitions {
aconfig_declarations {
name: "module_name",
namespace: "com.example.package",
package: "com.example.package",
srcs: ["foo.aconfig"],
}
`
result := runTest(t, android.FixtureExpectsNoErrors, bp)
module := result.ModuleForTests("module_name", "").Module().(*DefinitionsModule)
module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule)
// Check that the provider has the right contents
depData := result.ModuleProvider(module, definitionsProviderKey).(definitionsProviderData)
android.AssertStringEquals(t, "namespace", depData.namespace, "com.example.package")
if !strings.HasSuffix(depData.intermediatePath.String(), "/intermediate.pb") {
t.Errorf("Missing intermediates path in provider: %s", depData.intermediatePath.String())
depData := result.ModuleProvider(module, declarationsProviderKey).(declarationsProviderData)
android.AssertStringEquals(t, "package", depData.Package, "com.example.package")
if !strings.HasSuffix(depData.IntermediatePath.String(), "/intermediate.pb") {
t.Errorf("Missing intermediates path in provider: %s", depData.IntermediatePath.String())
}
}

View File

@@ -12,20 +12,20 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"android/soong/android"
"github.com/google/blueprint"
)
// Properties for "device_config_value_set"
// Properties for "aconfig_value_set"
type ValueSetModule struct {
android.ModuleBase
android.DefaultableModuleBase
properties struct {
// device_config_values modules
// aconfig_values modules
Values []string
}
}
@@ -49,11 +49,11 @@ type valueSetType struct {
var valueSetTag = valueSetType{}
// Provider published by device_config_value_set
// Provider published by aconfig_value_set
type valueSetProviderData struct {
// The namespace of each of the
// (map of namespace --> device_config_module)
AvailableNamespaces map[string]android.Paths
// The package of each of the
// (map of package --> aconfig_module)
AvailablePackages map[string]android.Paths
}
var valueSetProviderKey = blueprint.NewProvider(valueSetProviderData{})
@@ -63,17 +63,17 @@ func (module *ValueSetModule) DepsMutator(ctx android.BottomUpMutatorContext) {
for _, dep := range deps {
_, ok := dep.(*ValuesModule)
if !ok {
ctx.PropertyErrorf("values", "values must be a device_config_values module")
ctx.PropertyErrorf("values", "values must be a aconfig_values module")
return
}
}
}
func (module *ValueSetModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Accumulate the namespaces of the values modules listed, and set that as an
// valueSetProviderKey provider that device_config modules can read and use
// Accumulate the packages of the values modules listed, and set that as an
// valueSetProviderKey provider that aconfig modules can read and use
// to append values to their aconfig actions.
namespaces := make(map[string]android.Paths)
packages := make(map[string]android.Paths)
ctx.VisitDirectDeps(func(dep android.Module) {
if !ctx.OtherModuleHasProvider(dep, valuesProviderKey) {
// Other modules get injected as dependencies too, for example the license modules
@@ -83,10 +83,10 @@ func (module *ValueSetModule) GenerateAndroidBuildActions(ctx android.ModuleCont
srcs := make([]android.Path, len(depData.Values))
copy(srcs, depData.Values)
namespaces[depData.Namespace] = srcs
packages[depData.Package] = srcs
})
ctx.SetProvider(valueSetProviderKey, valueSetProviderData{
AvailableNamespaces: namespaces,
AvailablePackages: packages,
})
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"testing"
@@ -20,15 +20,15 @@ import (
"android/soong/android"
)
func TestDeviceConfigValueSet(t *testing.T) {
func TestAconfigValueSet(t *testing.T) {
bp := `
device_config_values {
aconfig_values {
name: "one",
srcs: [ "blah.aconfig_values" ],
namespace: "foo.namespace"
package: "foo.package"
}
device_config_value_set {
aconfig_value_set {
name: "module_name",
values: [ "one" ],
}
@@ -39,5 +39,5 @@ func TestDeviceConfigValueSet(t *testing.T) {
// Check that the provider has the right contents
depData := result.ModuleProvider(module, valueSetProviderKey).(valueSetProviderData)
android.AssertStringEquals(t, "AvailableNamespaces", "blah.aconfig_values", depData.AvailableNamespaces["foo.namespace"][0].String())
android.AssertStringEquals(t, "AvailablePackages", "blah.aconfig_values", depData.AvailablePackages["foo.package"][0].String())
}

View File

@@ -12,14 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"android/soong/android"
"github.com/google/blueprint"
)
// Properties for "device_config_value"
// Properties for "aconfig_value"
type ValuesModule struct {
android.ModuleBase
android.DefaultableModuleBase
@@ -28,8 +28,8 @@ type ValuesModule struct {
// aconfig files, relative to this Android.bp file
Srcs []string `android:"path"`
// Release config flag namespace
Namespace string
// Release config flag package
Package string
}
}
@@ -45,10 +45,10 @@ func ValuesFactory() android.Module {
return module
}
// Provider published by device_config_value_set
// Provider published by aconfig_value_set
type valuesProviderData struct {
// The namespace that this values module values
Namespace string
// The package that this values module values
Package string
// The values aconfig files, relative to the root of the tree
Values android.Paths
@@ -57,14 +57,14 @@ type valuesProviderData struct {
var valuesProviderKey = blueprint.NewProvider(valuesProviderData{})
func (module *ValuesModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if len(module.properties.Namespace) == 0 {
ctx.PropertyErrorf("namespace", "missing namespace property")
if len(module.properties.Package) == 0 {
ctx.PropertyErrorf("package", "missing package property")
}
// Provide the our source files list to the device_config_value_set as a list of files
// Provide the our source files list to the aconfig_value_set as a list of files
providerData := valuesProviderData{
Namespace: module.properties.Namespace,
Values: android.PathsForModuleSrc(ctx, module.properties.Srcs),
Package: module.properties.Package,
Values: android.PathsForModuleSrc(ctx, module.properties.Srcs),
}
ctx.SetProvider(valuesProviderKey, providerData)
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"testing"
@@ -20,12 +20,12 @@ import (
"android/soong/android"
)
func TestDeviceConfigValues(t *testing.T) {
func TestAconfigValues(t *testing.T) {
bp := `
device_config_values {
aconfig_values {
name: "module_name",
srcs: [ "blah.aconfig_values" ],
namespace: "foo.namespace"
package: "foo.package"
}
`
result := runTest(t, android.FixtureExpectsNoErrors, bp)
@@ -34,6 +34,6 @@ func TestDeviceConfigValues(t *testing.T) {
// Check that the provider has the right contents
depData := result.ModuleProvider(module, valuesProviderKey).(valuesProviderData)
android.AssertStringEquals(t, "namespace", "foo.namespace", depData.Namespace)
android.AssertStringEquals(t, "package", "foo.package", depData.Package)
android.AssertPathsEndWith(t, "srcs", []string{"blah.aconfig_values"}, depData.Values)
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"android/soong/android"
@@ -20,13 +20,13 @@ import (
)
var (
pctx = android.NewPackageContext("android/soong/device_config")
pctx = android.NewPackageContext("android/soong/aconfig")
// For device_config_definitions: Generate cache file
// For aconfig_declarations: Generate cache file
aconfigRule = pctx.AndroidStaticRule("aconfig",
blueprint.RuleParams{
Command: `${aconfig} create-cache` +
` --package ${namespace}` +
` --package ${package}` +
` --declarations ${in}` +
` ${values}` +
` --cache ${out}.tmp` +
@@ -36,9 +36,9 @@ var (
"${aconfig}",
},
Restat: true,
}, "release_version", "namespace", "values")
}, "release_version", "package", "values")
// For java_device_config_definitions_library: Generate java file
// For java_aconfig_library: Generate java file
srcJarRule = pctx.AndroidStaticRule("aconfig_srcjar",
blueprint.RuleParams{
Command: `rm -rf ${out}.tmp` +
@@ -63,8 +63,8 @@ func init() {
}
func registerBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("device_config_definitions", DefinitionsFactory)
ctx.RegisterModuleType("device_config_values", ValuesFactory)
ctx.RegisterModuleType("device_config_value_set", ValueSetFactory)
ctx.RegisterModuleType("java_device_config_definitions_library", JavaDefinitionsLibraryFactory)
ctx.RegisterModuleType("aconfig_declarations", DeclarationsFactory)
ctx.RegisterModuleType("aconfig_values", ValuesFactory)
ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory)
ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory)
}

View File

@@ -0,0 +1,71 @@
// 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 aconfig
import (
"android/soong/android"
"android/soong/java"
"fmt"
"github.com/google/blueprint"
)
type declarationsTagType struct {
blueprint.BaseDependencyTag
}
var declarationsTag = declarationsTagType{}
type JavaAconfigDeclarationsLibraryProperties struct {
// name of the aconfig_declarations module to generate a library for
Aconfig_declarations string
}
type JavaAconfigDeclarationsLibraryCallbacks struct {
properties JavaAconfigDeclarationsLibraryProperties
}
func JavaDeclarationsLibraryFactory() android.Module {
callbacks := &JavaAconfigDeclarationsLibraryCallbacks{}
return java.GeneratedJavaLibraryModuleFactory("java_aconfig_library", callbacks, &callbacks.properties)
}
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) DepsMutator(module *java.GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
declarations := callbacks.properties.Aconfig_declarations
if len(declarations) == 0 {
// TODO: Add test for this case
ctx.PropertyErrorf("aconfig_declarations", "aconfig_declarations property required")
} else {
ctx.AddDependency(ctx.Module(), declarationsTag, declarations)
}
}
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(ctx android.ModuleContext) android.Path {
// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag)
if len(declarationsModules) != 1 {
panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
}
declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData)
srcJarPath := android.PathForModuleGen(ctx, ctx.ModuleName()+".srcjar")
ctx.Build(pctx, android.BuildParams{
Rule: srcJarRule,
Input: declarations.IntermediatePath,
Output: srcJarPath,
Description: "aconfig.srcjar",
})
return srcJarPath
}

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package device_config
package aconfig
import (
"testing"
@@ -20,10 +20,10 @@ import (
"android/soong/android"
)
var PrepareForTestWithDeviceConfigBuildComponents = android.FixtureRegisterWithContext(registerBuildComponents)
var PrepareForTestWithAconfigBuildComponents = android.FixtureRegisterWithContext(registerBuildComponents)
func runTest(t *testing.T, errorHandler android.FixtureErrorHandler, bp string) *android.TestResult {
return android.GroupFixturePreparers(PrepareForTestWithDeviceConfigBuildComponents).
return android.GroupFixturePreparers(PrepareForTestWithAconfigBuildComponents).
ExtendWithErrorHandler(errorHandler).
RunTestWithBp(t, bp)
}

View File

@@ -184,8 +184,8 @@ func (c Config) ReleaseVersion() string {
}
// The flag values files passed to aconfig, derived from RELEASE_VERSION
func (c Config) ReleaseDeviceConfigValueSets() []string {
return c.config.productVariables.ReleaseDeviceConfigValueSets
func (c Config) ReleaseAconfigValueSets() []string {
return c.config.productVariables.ReleaseAconfigValueSets
}
// A DeviceConfig object represents the configuration for a particular device

View File

@@ -477,8 +477,8 @@ type productVariables struct {
ProductBrand string `json:",omitempty"`
BuildVersionTags []string `json:",omitempty"`
ReleaseVersion string `json:",omitempty"`
ReleaseDeviceConfigValueSets []string `json:",omitempty"`
ReleaseVersion string `json:",omitempty"`
ReleaseAconfigValueSets []string `json:",omitempty"`
}
func boolPtr(v bool) *bool {

View File

@@ -1,71 +0,0 @@
// 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 device_config
import (
"android/soong/android"
"android/soong/java"
"fmt"
"github.com/google/blueprint"
)
type definitionsTagType struct {
blueprint.BaseDependencyTag
}
var definitionsTag = definitionsTagType{}
type JavaDeviceConfigDefinitionsLibraryProperties struct {
// name of the device_config_definitions module to generate a library for
Device_config_definitions string
}
type JavaDeviceConfigDefinitionsLibraryCallbacks struct {
properties JavaDeviceConfigDefinitionsLibraryProperties
}
func JavaDefinitionsLibraryFactory() android.Module {
callbacks := &JavaDeviceConfigDefinitionsLibraryCallbacks{}
return java.GeneratedJavaLibraryModuleFactory("java_device_config_definitions_library", callbacks, &callbacks.properties)
}
func (callbacks *JavaDeviceConfigDefinitionsLibraryCallbacks) DepsMutator(module *java.GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
definitions := callbacks.properties.Device_config_definitions
if len(definitions) == 0 {
// TODO: Add test for this case
ctx.PropertyErrorf("device_config_definitions", "device_config_definitions property required")
} else {
ctx.AddDependency(ctx.Module(), definitionsTag, definitions)
}
}
func (callbacks *JavaDeviceConfigDefinitionsLibraryCallbacks) GenerateSourceJarBuildActions(ctx android.ModuleContext) android.Path {
// Get the values that came from the global RELEASE_DEVICE_CONFIG_VALUE_SETS flag
definitionsModules := ctx.GetDirectDepsWithTag(definitionsTag)
if len(definitionsModules) != 1 {
panic(fmt.Errorf("Exactly one device_config_definitions property required"))
}
definitions := ctx.OtherModuleProvider(definitionsModules[0], definitionsProviderKey).(definitionsProviderData)
srcJarPath := android.PathForModuleGen(ctx, ctx.ModuleName()+".srcjar")
ctx.Build(pctx, android.BuildParams{
Rule: srcJarRule,
Input: definitions.intermediatePath,
Output: srcJarPath,
Description: "device_config.srcjar",
})
return srcJarPath
}