func (m *resource) outputs() []string {
	return []string{}
}
Resources don't have any outputs (i.e. stuff generated in the build
directory) - they only copy source files to the installation dir. This
method exists to implement PhonyInterface.
package core
import (
	"fmt"
	"path/filepath"
	"github.com/google/blueprint"
)
type EnableableProps struct {
	Enabled *bool
	Build_by_default *bool
	Required bool `blueprint:"mutated"`
}
type enableable interface {
	getEnableableProps() *EnableableProps
}
func isEnabled(e enableable) bool {
	props := e.getEnableableProps()
	if props.Enabled != nil {
		return *props.Enabled
	}
	return true
}
func isBuiltByDefault(e enableable) bool {
	props := e.getEnableableProps()
	if props.Build_by_default != nil {
		return *props.Build_by_default
	}
	switch m := e.(type) {
	case *binary:
		if m.Properties.TargetType == tgtTypeTarget {
			return true
		}
	case *kernelModule:
		return true
	}
	return false
}
func isRequired(e enableable) bool {
	return e.getEnableableProps().Required
}
func markAsRequired(e enableable) {
	e.getEnableableProps().Required = true
}
type InstallableProps struct {
	Install_group *string
	Install_deps []string
	Relative_install_path *string
	Post_install_tool *string
	Post_install_cmd *string
	Post_install_args []string
	InstallGroupPath *string `blueprint:"mutated"`
}
func (props *InstallableProps) processPaths(ctx blueprint.BaseModuleContext, g generatorBackend) {
	if props.Post_install_tool != nil {
		*props.Post_install_tool = getBackendPathInSourceDir(g, projectModuleDir(ctx), *props.Post_install_tool)
	}
}
func (props *InstallableProps) getInstallPath() (string, bool) {
	if props.InstallGroupPath == nil {
		return "", false
	}
	installPath := *props.InstallGroupPath
	if props.Relative_install_path != nil {
		installPath = filepath.Join(installPath, *props.Relative_install_path)
	}
	return installPath, true
}
func getShortNamesForDirectDepsIf(ctx blueprint.ModuleContext,
	pred func(m blueprint.Module) bool) (ret []string) {
	visited := map[string]bool{}
	ctx.VisitDirectDepsIf(pred,
		func(m blueprint.Module) {
			if dep, ok := m.(phonyInterface); ok {
				if _, ok := visited[m.Name()]; !ok {
					ret = append(ret, dep.shortName())
				}
			} else {
				panic(fmt.Errorf("install_dep on non-dependendable module %s", m.Name()))
			}
			visited[m.Name()] = true
		})
	return
}
func getShortNamesForDirectDepsWithTags(ctx blueprint.ModuleContext,
	tags ...dependencyTag) (ret []string) {
	return getShortNamesForDirectDepsIf(ctx,
		func(m blueprint.Module) bool {
			tag := ctx.OtherModuleDependencyTag(m)
			for _, i := range tags {
				if tag == i {
					return true
				}
			}
			return false
		})
}
type InstallGroupProps struct {
	Install_path *string
}
type installGroup struct {
	moduleBase
	Properties struct {
		InstallGroupProps
		Features
	}
}
func (m *installGroup) GenerateBuildActions(ctx blueprint.ModuleContext) {
}
func (m *installGroup) featurableProperties() []interface{} {
	return []interface{}{&m.Properties.InstallGroupProps}
}
func (m *installGroup) features() *Features {
	return &m.Properties.Features
}
type symlinkInstaller interface {
	librarySymlinks(ctx blueprint.ModuleContext) map[string]string
}
type installable interface {
	filesToInstall(ctx blueprint.BaseModuleContext) []string
	getInstallableProps() *InstallableProps
	getInstallDepPhonyNames(ctx blueprint.ModuleContext) []string
}
type ResourceProps struct {
	SourceProps
	AliasableProps
	InstallableProps
	EnableableProps
	AndroidProps
}
type resource struct {
	moduleBase
	Properties struct {
		ResourceProps
		Features
	}
}
func (m *resource) GenerateBuildActions(ctx blueprint.ModuleContext) {
	if isEnabled(m) {
		getBackend(ctx).resourceActions(m, ctx)
	}
}
func (m *resource) featurableProperties() []interface{} {
	return []interface{}{&m.Properties.ResourceProps}
}
func (m *resource) features() *Features {
	return &m.Properties.Features
}
func (m *resource) getInstallDepPhonyNames(ctx blueprint.ModuleContext) []string {
	return getShortNamesForDirectDepsWithTags(ctx, installDepTag)
}
func (m *resource) shortName() string {
	return m.Name()
}
func (m *resource) altName() string {
	return m.Name()
}
func (m *resource) altShortName() string {
	return m.shortName()
}
func (m *resource) getEnableableProps() *EnableableProps {
	return &m.Properties.EnableableProps
}