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

Commit 31a738bd authored by Colin Cross's avatar Colin Cross
Browse files

Use blueprint's load hooks

Make android.AddLoadHook wrap blueprint.AddLoadHook.  Also pass
the config object to ParseBlueprintsFiles.

Test: all soong tests
Change-Id: I60c988b717d395f52498ec23ef7c9046d9861a6e
parent c34d2329
Loading
Loading
Loading
Loading
+60 −24
Original line number Diff line number Diff line
@@ -15,7 +15,10 @@
package android

import (
	"reflect"

	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"
)

// This file implements hooks that external module types can use to inject logic into existing
@@ -34,19 +37,68 @@ type LoadHookContext interface {
}

func AddLoadHook(m blueprint.Module, hook func(LoadHookContext)) {
	h := &m.(Module).base().hooks
	h.load = append(h.load, hook)
	blueprint.AddLoadHook(m, func(ctx blueprint.LoadHookContext) {
		actx := &loadHookContext{
			earlyModuleContext: m.(Module).base().earlyModuleContextFactory(ctx),
			bp:                 ctx,
		}
		hook(actx)
	})
}

func (x *hooks) runLoadHooks(ctx LoadHookContext, m *ModuleBase) {
	if len(x.load) > 0 {
		for _, x := range x.load {
			x(ctx)
			if ctx.Failed() {
				return
type loadHookContext struct {
	earlyModuleContext
	bp     blueprint.LoadHookContext
	module Module
}

func (l *loadHookContext) AppendProperties(props ...interface{}) {
	for _, p := range props {
		err := proptools.AppendMatchingProperties(l.Module().base().customizableProperties,
			p, nil)
		if err != nil {
			if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
				l.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
			} else {
				panic(err)
			}
		}
	}
}

func (l *loadHookContext) PrependProperties(props ...interface{}) {
	for _, p := range props {
		err := proptools.PrependMatchingProperties(l.Module().base().customizableProperties,
			p, nil)
		if err != nil {
			if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
				l.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
			} else {
				panic(err)
			}
		}
	}
}

func (l *loadHookContext) CreateModule(factory ModuleFactory, props ...interface{}) Module {
	inherited := []interface{}{&l.Module().base().commonProperties}
	module := l.bp.CreateModule(ModuleFactoryAdaptor(factory), append(inherited, props...)...).(Module)

	if l.Module().base().variableProperties != nil && module.base().variableProperties != nil {
		src := l.Module().base().variableProperties
		dst := []interface{}{
			module.base().variableProperties,
			// Put an empty copy of the src properties into dst so that properties in src that are not in dst
			// don't cause a "failed to find property to extend" error.
			proptools.CloneEmptyProperties(reflect.ValueOf(src).Elem()).Interface(),
		}
		err := proptools.AppendMatchingProperties(dst, src, nil)
		if err != nil {
			panic(err)
		}
	}

	return module
}

type InstallHookContext interface {
@@ -94,21 +146,5 @@ func (x *hooks) runInstallHooks(ctx ModuleContext, path InstallPath, symlink boo
}

type hooks struct {
	load    []func(LoadHookContext)
	install []func(InstallHookContext)
}

func registerLoadHookMutator(ctx RegisterMutatorsContext) {
	ctx.TopDown("load_hooks", LoadHookMutator).Parallel()
}

func LoadHookMutator(ctx TopDownMutatorContext) {
	if m, ok := ctx.Module().(Module); ok {
		m.base().commonProperties.DebugName = ctx.ModuleName()

		// Cast through *topDownMutatorContext because AppendProperties is implemented
		// on *topDownMutatorContext but not exposed through TopDownMutatorContext
		var loadHookCtx LoadHookContext = ctx.(*topDownMutatorContext)
		m.base().hooks.runLoadHooks(loadHookCtx, m.base())
	}
}
+0 −1
Original line number Diff line number Diff line
@@ -75,7 +75,6 @@ type RegisterMutatorsContext interface {
type RegisterMutatorFunc func(RegisterMutatorsContext)

var preArch = []RegisterMutatorFunc{
	registerLoadHookMutator,
	RegisterNamespaceMutator,
	// Rename package module types.
	RegisterPackageRenamer,
+1 −0
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ func (r *NameResolver) NewModule(ctx blueprint.NamespaceContext, moduleGroup blu
	if ok {
		// inform the module whether its namespace is one that we want to export to Make
		amod.base().commonProperties.NamespaceExportedToMake = ns.exportToKati
		amod.base().commonProperties.DebugName = module.Name()
	}

	return ns, nil
+15 −2
Original line number Diff line number Diff line
@@ -37,8 +37,6 @@ func NewTestContext() *TestContext {

	ctx.SetNameInterface(nameResolver)

	ctx.preArch = append(ctx.preArch, registerLoadHookMutator)

	ctx.postDeps = append(ctx.postDeps, registerPathDepsMutator)

	return ctx
@@ -54,6 +52,7 @@ type TestContext struct {
	*Context
	preArch, preDeps, postDeps []RegisterMutatorFunc
	NameResolver               *NameResolver
	config                     Config
}

func (ctx *TestContext) PreArchMutators(f RegisterMutatorFunc) {
@@ -76,6 +75,20 @@ func (ctx *TestContext) Register(config Config) {
	registerMutators(ctx.Context.Context, ctx.preArch, ctx.preDeps, ctx.postDeps)

	ctx.RegisterSingletonType("env", EnvSingleton)

	ctx.config = config
}

func (ctx *TestContext) ParseFileList(rootDir string, filePaths []string) (deps []string, errs []error) {
	// This function adapts the old style ParseFileList calls that are spread throughout the tests
	// to the new style that takes a config.
	return ctx.Context.ParseFileList(rootDir, filePaths, ctx.config)
}

func (ctx *TestContext) ParseBlueprintsFiles(rootDir string) (deps []string, errs []error) {
	// This function adapts the old style ParseBlueprintsFiles calls that are spread throughout the
	// tests to the new style that takes a config.
	return ctx.Context.ParseBlueprintsFiles(rootDir, ctx.config)
}

func (ctx *TestContext) RegisterModuleType(name string, factory ModuleFactory) {