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

Commit 8b8846ae authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add aconfig flags and a generic generated library plugin module for cc" into main

parents 66b27cb8 37f900ca
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ bootstrap_go_package {
        "aconfig_values.go",
        "aconfig_value_set.go",
        "all_aconfig_declarations.go",
        "cc_aconfig_library.go",
        "init.go",
        "java_aconfig_library.go",
        "testing.go",
+128 −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 aconfig

import (
	"android/soong/android"
	"android/soong/cc"
	"github.com/google/blueprint"

	"fmt"
	"strings"
)

type ccDeclarationsTagType struct {
	blueprint.BaseDependencyTag
}

var ccDeclarationsTag = ccDeclarationsTagType{}

type CcAconfigLibraryProperties struct {
	// name of the aconfig_declarations module to generate a library for
	Aconfig_declarations string
}

type CcAconfigLibraryCallbacks struct {
	properties *CcAconfigLibraryProperties

	generatedDir android.WritablePath
	headerDir    android.WritablePath
	generatedCpp android.WritablePath
	generatedH   android.WritablePath
}

func CcAconfigLibraryFactory() android.Module {
	callbacks := &CcAconfigLibraryCallbacks{
		properties: &CcAconfigLibraryProperties{},
	}
	return cc.GeneratedCcLibraryModuleFactory("cc_aconfig_library", callbacks)
}

func (this *CcAconfigLibraryCallbacks) GeneratorInit(ctx cc.BaseModuleContext) {
}

func (this *CcAconfigLibraryCallbacks) GeneratorProps() []interface{} {
	return []interface{}{this.properties}
}

func (this *CcAconfigLibraryCallbacks) GeneratorDeps(ctx cc.DepsContext, deps cc.Deps) cc.Deps {
	// Add a dependency for the declarations module
	declarations := this.properties.Aconfig_declarations
	if len(declarations) == 0 {
		ctx.PropertyErrorf("aconfig_declarations", "aconfig_declarations property required")
	} else {
		ctx.AddDependency(ctx.Module(), ccDeclarationsTag, declarations)
	}

	// Add a dependency for the aconfig flags base library
	deps.SharedLibs = append(deps.SharedLibs, "server_configurable_flags")
	// TODO: It'd be really nice if we could reexport this library and not make everyone do it.

	return deps
}

func (this *CcAconfigLibraryCallbacks) GeneratorSources(ctx cc.ModuleContext) cc.GeneratedSource {
	result := cc.GeneratedSource{}

	// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
	declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag)
	if len(declarationsModules) != 1 {
		panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
	}
	declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData)

	// Figure out the generated file paths.  This has to match aconfig's codegen_cpp.rs.
	this.generatedDir = android.PathForModuleGen(ctx)

	this.headerDir = android.PathForModuleGen(ctx, "include")
	result.IncludeDirs = []android.Path{this.headerDir}
	result.ReexportedDirs = []android.Path{this.headerDir}

	basename := strings.ReplaceAll(declarations.Package, ".", "_")

	this.generatedCpp = android.PathForModuleGen(ctx, basename+".cc")
	result.Sources = []android.Path{this.generatedCpp}

	this.generatedH = android.PathForModuleGen(ctx, "include", basename+".h")
	result.Headers = []android.Path{this.generatedH}

	return result
}

func (this *CcAconfigLibraryCallbacks) GeneratorFlags(ctx cc.ModuleContext, flags cc.Flags, deps cc.PathDeps) cc.Flags {
	return flags
}

func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContext, flags cc.Flags, deps cc.PathDeps) {
	// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
	declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag)
	if len(declarationsModules) != 1 {
		panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
	}
	declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData)

	ctx.Build(pctx, android.BuildParams{
		Rule:  cppRule,
		Input: declarations.IntermediatePath,
		Outputs: []android.WritablePath{
			this.generatedCpp,
			this.generatedH,
		},
		Description: "cc_aconfig_library",
		Args: map[string]string{
			"gendir": this.generatedDir.String(),
		},
	})
}
+16 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ var (
		}, "release_version", "package", "declarations", "values")

	// For java_aconfig_library: Generate java file
	srcJarRule = pctx.AndroidStaticRule("aconfig_srcjar",
	javaRule = pctx.AndroidStaticRule("java_aconfig_library",
		blueprint.RuleParams{
			Command: `rm -rf ${out}.tmp` +
				` && mkdir -p ${out}.tmp` +
@@ -55,6 +55,20 @@ var (
			Restat: true,
		})

	// For java_aconfig_library: Generate java file
	cppRule = pctx.AndroidStaticRule("cc_aconfig_library",
		blueprint.RuleParams{
			Command: `rm -rf ${gendir}` +
				` && mkdir -p ${gendir}` +
				` && ${aconfig} create-cpp-lib` +
				`    --cache ${in}` +
				`    --out ${gendir}`,
			CommandDeps: []string{
				"$aconfig",
				"$soong_zip",
			},
		}, "gendir")

	// For all_aconfig_declarations
	allDeclarationsRule = pctx.AndroidStaticRule("all_aconfig_declarations_dump",
		blueprint.RuleParams{
@@ -75,6 +89,7 @@ func registerBuildComponents(ctx android.RegistrationContext) {
	ctx.RegisterModuleType("aconfig_declarations", DeclarationsFactory)
	ctx.RegisterModuleType("aconfig_values", ValuesFactory)
	ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory)
	ctx.RegisterModuleType("cc_aconfig_library", CcAconfigLibraryFactory)
	ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory)
	ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory)
}
+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild
	// Generate the action to build the srcjar
	srcJarPath := android.PathForModuleGen(ctx, ctx.ModuleName()+".srcjar")
	ctx.Build(pctx, android.BuildParams{
		Rule:        srcJarRule,
		Rule:        javaRule,
		Input:       declarations.IntermediatePath,
		Output:      srcJarPath,
		Description: "aconfig.srcjar",
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ bootstrap_go_package {
        "check.go",
        "coverage.go",
        "gen.go",
        "generated_cc_library.go",
        "image.go",
        "linkable.go",
        "lto.go",
Loading