Snap for 12361654 from e021e615fa
to 24Q4-release
Change-Id: I7083a22c54bad320f5dfb85aa3af19bfeb194225
This commit is contained in:
@@ -187,6 +187,20 @@ func aconfigUpdateAndroidMkEntries(ctx fillInEntriesContext, mod Module, entries
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func aconfigUpdateAndroidMkInfos(ctx fillInEntriesContext, mod Module, infos *AndroidMkProviderInfo) {
|
||||||
|
info, ok := OtherModuleProvider(ctx, mod, AconfigPropagatingProviderKey)
|
||||||
|
if !ok || len(info.AconfigFiles) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// All of the files in the module potentially depend on the aconfig flag values.
|
||||||
|
infos.PrimaryInfo.AddPaths("LOCAL_ACONFIG_FILES", getAconfigFilePaths(mod.base(), info.AconfigFiles))
|
||||||
|
if len(infos.ExtraInfo) > 0 {
|
||||||
|
for _, ei := range (*infos).ExtraInfo {
|
||||||
|
ei.AddPaths("LOCAL_ACONFIG_FILES", getAconfigFilePaths(mod.base(), info.AconfigFiles))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func mergeAconfigFiles(ctx ModuleContext, container string, inputs Paths, generateRule bool) Paths {
|
func mergeAconfigFiles(ctx ModuleContext, container string, inputs Paths, generateRule bool) Paths {
|
||||||
inputs = SortedUniquePaths(inputs)
|
inputs = SortedUniquePaths(inputs)
|
||||||
if len(inputs) == 1 {
|
if len(inputs) == 1 {
|
||||||
|
@@ -34,7 +34,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/bootstrap"
|
|
||||||
"github.com/google/blueprint/pathtools"
|
"github.com/google/blueprint/pathtools"
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
)
|
)
|
||||||
@@ -502,6 +501,7 @@ type fillInEntriesContext interface {
|
|||||||
otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
|
otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
|
||||||
ModuleType(module blueprint.Module) string
|
ModuleType(module blueprint.Module) string
|
||||||
OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{})
|
OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{})
|
||||||
|
HasMutatorFinished(mutatorName string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) {
|
func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) {
|
||||||
@@ -806,16 +806,20 @@ func translateAndroidMkModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs
|
|||||||
|
|
||||||
// Additional cases here require review for correct license propagation to make.
|
// Additional cases here require review for correct license propagation to make.
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if info, ok := ctx.otherModuleProvider(mod, AndroidMkInfoProvider); ok {
|
||||||
|
androidMkEntriesInfos := info.(*AndroidMkProviderInfo)
|
||||||
|
err = translateAndroidMkEntriesInfoModule(ctx, w, moduleInfoJSONs, mod, androidMkEntriesInfos)
|
||||||
|
} else {
|
||||||
switch x := mod.(type) {
|
switch x := mod.(type) {
|
||||||
case AndroidMkDataProvider:
|
case AndroidMkDataProvider:
|
||||||
err = translateAndroidModule(ctx, w, moduleInfoJSONs, mod, x)
|
err = translateAndroidModule(ctx, w, moduleInfoJSONs, mod, x)
|
||||||
case bootstrap.GoBinaryTool:
|
|
||||||
err = translateGoBinaryModule(ctx, w, mod, x)
|
|
||||||
case AndroidMkEntriesProvider:
|
case AndroidMkEntriesProvider:
|
||||||
err = translateAndroidMkEntriesModule(ctx, w, moduleInfoJSONs, mod, x)
|
err = translateAndroidMkEntriesModule(ctx, w, moduleInfoJSONs, mod, x)
|
||||||
default:
|
default:
|
||||||
// Not exported to make so no make variables to set.
|
// Not exported to make so no make variables to set.
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -824,23 +828,6 @@ func translateAndroidMkModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// A simple, special Android.mk entry output func to make it possible to build blueprint tools using
|
|
||||||
// m by making them phony targets.
|
|
||||||
func translateGoBinaryModule(ctx SingletonContext, w io.Writer, mod blueprint.Module,
|
|
||||||
goBinary bootstrap.GoBinaryTool) error {
|
|
||||||
|
|
||||||
name := ctx.ModuleName(mod)
|
|
||||||
fmt.Fprintln(w, ".PHONY:", name)
|
|
||||||
fmt.Fprintln(w, name+":", goBinary.InstallPath())
|
|
||||||
fmt.Fprintln(w, "")
|
|
||||||
// Assuming no rules in make include go binaries in distributables.
|
|
||||||
// If the assumption is wrong, make will fail to build without the necessary .meta_lic and .meta_module files.
|
|
||||||
// In that case, add the targets and rules here to build a .meta_lic file for `name` and a .meta_module for
|
|
||||||
// `goBinary.InstallPath()` pointing to the `name`.meta_lic file.
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (data *AndroidMkData) fillInData(ctx fillInEntriesContext, mod blueprint.Module) {
|
func (data *AndroidMkData) fillInData(ctx fillInEntriesContext, mod blueprint.Module) {
|
||||||
// Get the preamble content through AndroidMkEntries logic.
|
// Get the preamble content through AndroidMkEntries logic.
|
||||||
data.Entries = AndroidMkEntries{
|
data.Entries = AndroidMkEntries{
|
||||||
@@ -983,11 +970,11 @@ func translateAndroidMkEntriesModule(ctx SingletonContext, w io.Writer, moduleIn
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ShouldSkipAndroidMkProcessing(ctx ConfigAndErrorContext, module Module) bool {
|
func ShouldSkipAndroidMkProcessing(ctx ConfigurableEvaluatorContext, module Module) bool {
|
||||||
return shouldSkipAndroidMkProcessing(ctx, module.base())
|
return shouldSkipAndroidMkProcessing(ctx, module.base())
|
||||||
}
|
}
|
||||||
|
|
||||||
func shouldSkipAndroidMkProcessing(ctx ConfigAndErrorContext, module *ModuleBase) bool {
|
func shouldSkipAndroidMkProcessing(ctx ConfigurableEvaluatorContext, module *ModuleBase) bool {
|
||||||
if !module.commonProperties.NamespaceExportedToMake {
|
if !module.commonProperties.NamespaceExportedToMake {
|
||||||
// TODO(jeffrygaston) do we want to validate that there are no modules being
|
// TODO(jeffrygaston) do we want to validate that there are no modules being
|
||||||
// exported to Kati that depend on this module?
|
// exported to Kati that depend on this module?
|
||||||
@@ -1063,3 +1050,564 @@ func AndroidMkEmitAssignList(w io.Writer, varName string, lists ...[]string) {
|
|||||||
}
|
}
|
||||||
fmt.Fprintln(w)
|
fmt.Fprintln(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AndroidMkProviderInfo struct {
|
||||||
|
PrimaryInfo AndroidMkInfo
|
||||||
|
ExtraInfo []AndroidMkInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
type AndroidMkInfo struct {
|
||||||
|
// Android.mk class string, e.g. EXECUTABLES, JAVA_LIBRARIES, ETC
|
||||||
|
Class string
|
||||||
|
// Optional suffix to append to the module name. Useful when a module wants to return multiple
|
||||||
|
// AndroidMkEntries objects. For example, when a java_library returns an additional entry for
|
||||||
|
// its hostdex sub-module, this SubName field is set to "-hostdex" so that it can have a
|
||||||
|
// different name than the parent's.
|
||||||
|
SubName string
|
||||||
|
// If set, this value overrides the base module name. SubName is still appended.
|
||||||
|
OverrideName string
|
||||||
|
// Dist files to output
|
||||||
|
DistFiles TaggedDistFiles
|
||||||
|
// The output file for Kati to process and/or install. If absent, the module is skipped.
|
||||||
|
OutputFile OptionalPath
|
||||||
|
// If true, the module is skipped and does not appear on the final Android-<product name>.mk
|
||||||
|
// file. Useful when a module needs to be skipped conditionally.
|
||||||
|
Disabled bool
|
||||||
|
// The postprocessing mk file to include, e.g. $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk
|
||||||
|
// If not set, $(BUILD_SYSTEM)/prebuilt.mk is used.
|
||||||
|
Include string
|
||||||
|
// Required modules that need to be built and included in the final build output when building
|
||||||
|
// this module.
|
||||||
|
Required []string
|
||||||
|
// Required host modules that need to be built and included in the final build output when
|
||||||
|
// building this module.
|
||||||
|
Host_required []string
|
||||||
|
// Required device modules that need to be built and included in the final build output when
|
||||||
|
// building this module.
|
||||||
|
Target_required []string
|
||||||
|
|
||||||
|
HeaderStrings []string
|
||||||
|
FooterStrings []string
|
||||||
|
|
||||||
|
// A map that holds the up-to-date Make variable values. Can be accessed from tests.
|
||||||
|
EntryMap map[string][]string
|
||||||
|
// A list of EntryMap keys in insertion order. This serves a few purposes:
|
||||||
|
// 1. Prevents churns. Golang map doesn't provide consistent iteration order, so without this,
|
||||||
|
// the outputted Android-*.mk file may change even though there have been no content changes.
|
||||||
|
// 2. Allows modules to refer to other variables, like LOCAL_BAR_VAR := $(LOCAL_FOO_VAR),
|
||||||
|
// without worrying about the variables being mixed up in the actual mk file.
|
||||||
|
// 3. Makes troubleshooting and spotting errors easier.
|
||||||
|
EntryOrder []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: rename it to AndroidMkEntriesProvider after AndroidMkEntriesProvider interface is gone.
|
||||||
|
var AndroidMkInfoProvider = blueprint.NewProvider[*AndroidMkProviderInfo]()
|
||||||
|
|
||||||
|
func translateAndroidMkEntriesInfoModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs *[]*ModuleInfoJSON,
|
||||||
|
mod blueprint.Module, providerInfo *AndroidMkProviderInfo) error {
|
||||||
|
if shouldSkipAndroidMkProcessing(ctx, mod.(Module).base()) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deep copy the provider info since we need to modify the info later
|
||||||
|
info := deepCopyAndroidMkProviderInfo(providerInfo)
|
||||||
|
|
||||||
|
aconfigUpdateAndroidMkInfos(ctx, mod.(Module), &info)
|
||||||
|
|
||||||
|
// Any new or special cases here need review to verify correct propagation of license information.
|
||||||
|
info.PrimaryInfo.fillInEntries(ctx, mod)
|
||||||
|
info.PrimaryInfo.write(w)
|
||||||
|
if len(info.ExtraInfo) > 0 {
|
||||||
|
for _, ei := range info.ExtraInfo {
|
||||||
|
ei.fillInEntries(ctx, mod)
|
||||||
|
ei.write(w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !info.PrimaryInfo.disabled() {
|
||||||
|
if moduleInfoJSON, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok {
|
||||||
|
*moduleInfoJSONs = append(*moduleInfoJSONs, moduleInfoJSON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utility funcs to manipulate Android.mk variable entries.
|
||||||
|
|
||||||
|
// SetString sets a Make variable with the given name to the given value.
|
||||||
|
func (a *AndroidMkInfo) SetString(name, value string) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = []string{value}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPath sets a Make variable with the given name to the given path string.
|
||||||
|
func (a *AndroidMkInfo) SetPath(name string, path Path) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = []string{path.String()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetOptionalPath sets a Make variable with the given name to the given path string if it is valid.
|
||||||
|
// It is a no-op if the given path is invalid.
|
||||||
|
func (a *AndroidMkInfo) SetOptionalPath(name string, path OptionalPath) {
|
||||||
|
if path.Valid() {
|
||||||
|
a.SetPath(name, path.Path())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddPath appends the given path string to a Make variable with the given name.
|
||||||
|
func (a *AndroidMkInfo) AddPath(name string, path Path) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = append(a.EntryMap[name], path.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOptionalPath appends the given path string to a Make variable with the given name if it is
|
||||||
|
// valid. It is a no-op if the given path is invalid.
|
||||||
|
func (a *AndroidMkInfo) AddOptionalPath(name string, path OptionalPath) {
|
||||||
|
if path.Valid() {
|
||||||
|
a.AddPath(name, path.Path())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPaths sets a Make variable with the given name to a slice of the given path strings.
|
||||||
|
func (a *AndroidMkInfo) SetPaths(name string, paths Paths) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = paths.Strings()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetOptionalPaths sets a Make variable with the given name to a slice of the given path strings
|
||||||
|
// only if there are a non-zero amount of paths.
|
||||||
|
func (a *AndroidMkInfo) SetOptionalPaths(name string, paths Paths) {
|
||||||
|
if len(paths) > 0 {
|
||||||
|
a.SetPaths(name, paths)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddPaths appends the given path strings to a Make variable with the given name.
|
||||||
|
func (a *AndroidMkInfo) AddPaths(name string, paths Paths) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = append(a.EntryMap[name], paths.Strings()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetBoolIfTrue sets a Make variable with the given name to true if the given flag is true.
|
||||||
|
// It is a no-op if the given flag is false.
|
||||||
|
func (a *AndroidMkInfo) SetBoolIfTrue(name string, flag bool) {
|
||||||
|
if flag {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = []string{"true"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetBool sets a Make variable with the given name to if the given bool flag value.
|
||||||
|
func (a *AndroidMkInfo) SetBool(name string, flag bool) {
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
if flag {
|
||||||
|
a.EntryMap[name] = []string{"true"}
|
||||||
|
} else {
|
||||||
|
a.EntryMap[name] = []string{"false"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddStrings appends the given strings to a Make variable with the given name.
|
||||||
|
func (a *AndroidMkInfo) AddStrings(name string, value ...string) {
|
||||||
|
if len(value) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, ok := a.EntryMap[name]; !ok {
|
||||||
|
a.EntryOrder = append(a.EntryOrder, name)
|
||||||
|
}
|
||||||
|
a.EntryMap[name] = append(a.EntryMap[name], value...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddCompatibilityTestSuites adds the supplied test suites to the EntryMap, with special handling
|
||||||
|
// for partial MTS and MCTS test suites.
|
||||||
|
func (a *AndroidMkInfo) AddCompatibilityTestSuites(suites ...string) {
|
||||||
|
// M(C)TS supports a full test suite and partial per-module MTS test suites, with naming mts-${MODULE}.
|
||||||
|
// To reduce repetition, if we find a partial M(C)TS test suite without an full M(C)TS test suite,
|
||||||
|
// we add the full test suite to our list.
|
||||||
|
if PrefixInList(suites, "mts-") && !InList("mts", suites) {
|
||||||
|
suites = append(suites, "mts")
|
||||||
|
}
|
||||||
|
if PrefixInList(suites, "mcts-") && !InList("mcts", suites) {
|
||||||
|
suites = append(suites, "mcts")
|
||||||
|
}
|
||||||
|
a.AddStrings("LOCAL_COMPATIBILITY_SUITE", suites...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AndroidMkInfo) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) {
|
||||||
|
helperInfo := AndroidMkInfo{
|
||||||
|
EntryMap: make(map[string][]string),
|
||||||
|
}
|
||||||
|
|
||||||
|
amod := mod.(Module)
|
||||||
|
base := amod.base()
|
||||||
|
name := base.BaseModuleName()
|
||||||
|
if a.OverrideName != "" {
|
||||||
|
name = a.OverrideName
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Include == "" {
|
||||||
|
a.Include = "$(BUILD_PREBUILT)"
|
||||||
|
}
|
||||||
|
a.Required = append(a.Required, amod.RequiredModuleNames(ctx)...)
|
||||||
|
a.Required = append(a.Required, amod.VintfFragmentModuleNames(ctx)...)
|
||||||
|
a.Host_required = append(a.Host_required, amod.HostRequiredModuleNames()...)
|
||||||
|
a.Target_required = append(a.Target_required, amod.TargetRequiredModuleNames()...)
|
||||||
|
|
||||||
|
for _, distString := range a.GetDistForGoals(ctx, mod) {
|
||||||
|
a.HeaderStrings = append(a.HeaderStrings, distString)
|
||||||
|
}
|
||||||
|
|
||||||
|
a.HeaderStrings = append(a.HeaderStrings, fmt.Sprintf("\ninclude $(CLEAR_VARS) # type: %s, name: %s, variant: %s\n", ctx.ModuleType(mod), base.BaseModuleName(), ctx.ModuleSubDir(mod)))
|
||||||
|
|
||||||
|
// Collect make variable assignment entries.
|
||||||
|
helperInfo.SetString("LOCAL_PATH", ctx.ModuleDir(mod))
|
||||||
|
helperInfo.SetString("LOCAL_MODULE", name+a.SubName)
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_CLASS", a.Class)
|
||||||
|
helperInfo.SetString("LOCAL_PREBUILT_MODULE_FILE", a.OutputFile.String())
|
||||||
|
helperInfo.AddStrings("LOCAL_REQUIRED_MODULES", a.Required...)
|
||||||
|
helperInfo.AddStrings("LOCAL_HOST_REQUIRED_MODULES", a.Host_required...)
|
||||||
|
helperInfo.AddStrings("LOCAL_TARGET_REQUIRED_MODULES", a.Target_required...)
|
||||||
|
helperInfo.AddStrings("LOCAL_SOONG_MODULE_TYPE", ctx.ModuleType(amod))
|
||||||
|
|
||||||
|
// If the install rule was generated by Soong tell Make about it.
|
||||||
|
info := OtherModuleProviderOrDefault(ctx, mod, InstallFilesProvider)
|
||||||
|
if len(info.KatiInstalls) > 0 {
|
||||||
|
// Assume the primary install file is last since it probably needs to depend on any other
|
||||||
|
// installed files. If that is not the case we can add a method to specify the primary
|
||||||
|
// installed file.
|
||||||
|
helperInfo.SetPath("LOCAL_SOONG_INSTALLED_MODULE", info.KatiInstalls[len(info.KatiInstalls)-1].to)
|
||||||
|
helperInfo.SetString("LOCAL_SOONG_INSTALL_PAIRS", info.KatiInstalls.BuiltInstalled())
|
||||||
|
helperInfo.SetPaths("LOCAL_SOONG_INSTALL_SYMLINKS", info.KatiSymlinks.InstallPaths().Paths())
|
||||||
|
} else {
|
||||||
|
// Soong may not have generated the install rule also when `no_full_install: true`.
|
||||||
|
// Mark this module as uninstallable in order to prevent Make from creating an
|
||||||
|
// install rule there.
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", proptools.Bool(base.commonProperties.No_full_install))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(info.TestData) > 0 {
|
||||||
|
helperInfo.AddStrings("LOCAL_TEST_DATA", androidMkDataPaths(info.TestData)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if am, ok := mod.(ApexModule); ok {
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_NOT_AVAILABLE_FOR_PLATFORM", am.NotAvailableForPlatform())
|
||||||
|
}
|
||||||
|
|
||||||
|
archStr := base.Arch().ArchType.String()
|
||||||
|
host := false
|
||||||
|
switch base.Os().Class {
|
||||||
|
case Host:
|
||||||
|
if base.Target().HostCross {
|
||||||
|
// Make cannot identify LOCAL_MODULE_HOST_CROSS_ARCH:= common.
|
||||||
|
if base.Arch().ArchType != Common {
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_HOST_CROSS_ARCH", archStr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Make cannot identify LOCAL_MODULE_HOST_ARCH:= common.
|
||||||
|
if base.Arch().ArchType != Common {
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_HOST_ARCH", archStr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
host = true
|
||||||
|
case Device:
|
||||||
|
// Make cannot identify LOCAL_MODULE_TARGET_ARCH:= common.
|
||||||
|
if base.Arch().ArchType != Common {
|
||||||
|
if base.Target().NativeBridge {
|
||||||
|
hostArchStr := base.Target().NativeBridgeHostArchName
|
||||||
|
if hostArchStr != "" {
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_TARGET_ARCH", hostArchStr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_TARGET_ARCH", archStr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !base.InVendorRamdisk() {
|
||||||
|
helperInfo.AddPaths("LOCAL_FULL_INIT_RC", info.InitRcPaths)
|
||||||
|
}
|
||||||
|
if len(info.VintfFragmentsPaths) > 0 {
|
||||||
|
helperInfo.AddPaths("LOCAL_FULL_VINTF_FRAGMENTS", info.VintfFragmentsPaths)
|
||||||
|
}
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_PROPRIETARY_MODULE", Bool(base.commonProperties.Proprietary))
|
||||||
|
if Bool(base.commonProperties.Vendor) || Bool(base.commonProperties.Soc_specific) {
|
||||||
|
helperInfo.SetString("LOCAL_VENDOR_MODULE", "true")
|
||||||
|
}
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_ODM_MODULE", Bool(base.commonProperties.Device_specific))
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_PRODUCT_MODULE", Bool(base.commonProperties.Product_specific))
|
||||||
|
helperInfo.SetBoolIfTrue("LOCAL_SYSTEM_EXT_MODULE", Bool(base.commonProperties.System_ext_specific))
|
||||||
|
if base.commonProperties.Owner != nil {
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_OWNER", *base.commonProperties.Owner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if host {
|
||||||
|
makeOs := base.Os().String()
|
||||||
|
if base.Os() == Linux || base.Os() == LinuxBionic || base.Os() == LinuxMusl {
|
||||||
|
makeOs = "linux"
|
||||||
|
}
|
||||||
|
helperInfo.SetString("LOCAL_MODULE_HOST_OS", makeOs)
|
||||||
|
helperInfo.SetString("LOCAL_IS_HOST_MODULE", "true")
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := ""
|
||||||
|
if base.ArchSpecific() {
|
||||||
|
switch base.Os().Class {
|
||||||
|
case Host:
|
||||||
|
if base.Target().HostCross {
|
||||||
|
prefix = "HOST_CROSS_"
|
||||||
|
} else {
|
||||||
|
prefix = "HOST_"
|
||||||
|
}
|
||||||
|
case Device:
|
||||||
|
prefix = "TARGET_"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if base.Arch().ArchType != ctx.Config().Targets[base.Os()][0].Arch.ArchType {
|
||||||
|
prefix = "2ND_" + prefix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if licenseMetadata, ok := OtherModuleProvider(ctx, mod, LicenseMetadataProvider); ok {
|
||||||
|
helperInfo.SetPath("LOCAL_SOONG_LICENSE_METADATA", licenseMetadata.LicenseMetadataPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok {
|
||||||
|
helperInfo.SetBool("LOCAL_SOONG_MODULE_INFO_JSON", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
a.mergeEntries(&helperInfo)
|
||||||
|
|
||||||
|
// Write to footer.
|
||||||
|
a.FooterStrings = append([]string{"include " + a.Include}, a.FooterStrings...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method merges the entries to helperInfo, then replaces a's EntryMap and
|
||||||
|
// EntryOrder with helperInfo's
|
||||||
|
func (a *AndroidMkInfo) mergeEntries(helperInfo *AndroidMkInfo) {
|
||||||
|
for _, extraEntry := range a.EntryOrder {
|
||||||
|
if v, ok := helperInfo.EntryMap[extraEntry]; ok {
|
||||||
|
v = append(v, a.EntryMap[extraEntry]...)
|
||||||
|
} else {
|
||||||
|
helperInfo.EntryMap[extraEntry] = a.EntryMap[extraEntry]
|
||||||
|
helperInfo.EntryOrder = append(helperInfo.EntryOrder, extraEntry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a.EntryOrder = helperInfo.EntryOrder
|
||||||
|
a.EntryMap = helperInfo.EntryMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AndroidMkInfo) disabled() bool {
|
||||||
|
return a.Disabled || !a.OutputFile.Valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
// write flushes the AndroidMkEntries's in-struct data populated by AndroidMkEntries into the
|
||||||
|
// given Writer object.
|
||||||
|
func (a *AndroidMkInfo) write(w io.Writer) {
|
||||||
|
if a.disabled() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
combinedHeaderString := strings.Join(a.HeaderStrings, "\n")
|
||||||
|
combinedFooterString := strings.Join(a.FooterStrings, "\n")
|
||||||
|
w.Write([]byte(combinedHeaderString))
|
||||||
|
for _, name := range a.EntryOrder {
|
||||||
|
AndroidMkEmitAssignList(w, name, a.EntryMap[name])
|
||||||
|
}
|
||||||
|
w.Write([]byte(combinedFooterString))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the list of Make strings to declare phony goals and dist-for-goals
|
||||||
|
// calls from the module's dist and dists properties.
|
||||||
|
func (a *AndroidMkInfo) GetDistForGoals(ctx fillInEntriesContext, mod blueprint.Module) []string {
|
||||||
|
distContributions := a.getDistContributions(ctx, mod)
|
||||||
|
if distContributions == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return generateDistContributionsForMake(distContributions)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the contributions that the module makes to the dist.
|
||||||
|
func (a *AndroidMkInfo) getDistContributions(ctx fillInEntriesContext, mod blueprint.Module) *distContributions {
|
||||||
|
amod := mod.(Module).base()
|
||||||
|
name := amod.BaseModuleName()
|
||||||
|
|
||||||
|
// Collate the set of associated tag/paths available for copying to the dist.
|
||||||
|
// Start with an empty (nil) set.
|
||||||
|
var availableTaggedDists TaggedDistFiles
|
||||||
|
|
||||||
|
// Then merge in any that are provided explicitly by the module.
|
||||||
|
if a.DistFiles != nil {
|
||||||
|
// Merge the DistFiles into the set.
|
||||||
|
availableTaggedDists = availableTaggedDists.merge(a.DistFiles)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no paths have been provided for the DefaultDistTag and the output file is
|
||||||
|
// valid then add that as the default dist path.
|
||||||
|
if _, ok := availableTaggedDists[DefaultDistTag]; !ok && a.OutputFile.Valid() {
|
||||||
|
availableTaggedDists = availableTaggedDists.addPathsForTag(DefaultDistTag, a.OutputFile.Path())
|
||||||
|
}
|
||||||
|
|
||||||
|
info := OtherModuleProviderOrDefault(ctx, mod, InstallFilesProvider)
|
||||||
|
// If the distFiles created by GenerateTaggedDistFiles contains paths for the
|
||||||
|
// DefaultDistTag then that takes priority so delete any existing paths.
|
||||||
|
if _, ok := info.DistFiles[DefaultDistTag]; ok {
|
||||||
|
delete(availableTaggedDists, DefaultDistTag)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, merge the distFiles created by GenerateTaggedDistFiles.
|
||||||
|
availableTaggedDists = availableTaggedDists.merge(info.DistFiles)
|
||||||
|
|
||||||
|
if len(availableTaggedDists) == 0 {
|
||||||
|
// Nothing dist-able for this module.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collate the contributions this module makes to the dist.
|
||||||
|
distContributions := &distContributions{}
|
||||||
|
|
||||||
|
if !exemptFromRequiredApplicableLicensesProperty(mod.(Module)) {
|
||||||
|
distContributions.licenseMetadataFile = info.LicenseMetadataFile
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over this module's dist structs, merged from the dist and dists properties.
|
||||||
|
for _, dist := range amod.Dists() {
|
||||||
|
// Get the list of goals this dist should be enabled for. e.g. sdk, droidcore
|
||||||
|
goals := strings.Join(dist.Targets, " ")
|
||||||
|
|
||||||
|
// Get the tag representing the output files to be dist'd. e.g. ".jar", ".proguard_map"
|
||||||
|
var tag string
|
||||||
|
if dist.Tag == nil {
|
||||||
|
// If the dist struct does not specify a tag, use the default output files tag.
|
||||||
|
tag = DefaultDistTag
|
||||||
|
} else {
|
||||||
|
tag = *dist.Tag
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the paths of the output files to be dist'd, represented by the tag.
|
||||||
|
// Can be an empty list.
|
||||||
|
tagPaths := availableTaggedDists[tag]
|
||||||
|
if len(tagPaths) == 0 {
|
||||||
|
// Nothing to dist for this tag, continue to the next dist.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(tagPaths) > 1 && (dist.Dest != nil || dist.Suffix != nil) {
|
||||||
|
errorMessage := "%s: Cannot apply dest/suffix for more than one dist " +
|
||||||
|
"file for %q goals tag %q in module %s. The list of dist files, " +
|
||||||
|
"which should have a single element, is:\n%s"
|
||||||
|
panic(fmt.Errorf(errorMessage, mod, goals, tag, name, tagPaths))
|
||||||
|
}
|
||||||
|
|
||||||
|
copiesForGoals := distContributions.getCopiesForGoals(goals)
|
||||||
|
|
||||||
|
// Iterate over each path adding a copy instruction to copiesForGoals
|
||||||
|
for _, path := range tagPaths {
|
||||||
|
// It's possible that the Path is nil from errant modules. Be defensive here.
|
||||||
|
if path == nil {
|
||||||
|
tagName := "default" // for error message readability
|
||||||
|
if dist.Tag != nil {
|
||||||
|
tagName = *dist.Tag
|
||||||
|
}
|
||||||
|
panic(fmt.Errorf("Dist file should not be nil for the %s tag in %s", tagName, name))
|
||||||
|
}
|
||||||
|
|
||||||
|
dest := filepath.Base(path.String())
|
||||||
|
|
||||||
|
if dist.Dest != nil {
|
||||||
|
var err error
|
||||||
|
if dest, err = validateSafePath(*dist.Dest); err != nil {
|
||||||
|
// This was checked in ModuleBase.GenerateBuildActions
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ext := filepath.Ext(dest)
|
||||||
|
suffix := ""
|
||||||
|
if dist.Suffix != nil {
|
||||||
|
suffix = *dist.Suffix
|
||||||
|
}
|
||||||
|
|
||||||
|
productString := ""
|
||||||
|
if dist.Append_artifact_with_product != nil && *dist.Append_artifact_with_product {
|
||||||
|
productString = fmt.Sprintf("_%s", ctx.Config().DeviceProduct())
|
||||||
|
}
|
||||||
|
|
||||||
|
if suffix != "" || productString != "" {
|
||||||
|
dest = strings.TrimSuffix(dest, ext) + suffix + productString + ext
|
||||||
|
}
|
||||||
|
|
||||||
|
if dist.Dir != nil {
|
||||||
|
var err error
|
||||||
|
if dest, err = validateSafePath(*dist.Dir, dest); err != nil {
|
||||||
|
// This was checked in ModuleBase.GenerateBuildActions
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
copiesForGoals.addCopyInstruction(path, dest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return distContributions
|
||||||
|
}
|
||||||
|
|
||||||
|
func deepCopyAndroidMkProviderInfo(providerInfo *AndroidMkProviderInfo) AndroidMkProviderInfo {
|
||||||
|
info := AndroidMkProviderInfo{
|
||||||
|
PrimaryInfo: deepCopyAndroidMkInfo(&providerInfo.PrimaryInfo),
|
||||||
|
}
|
||||||
|
if len(providerInfo.ExtraInfo) > 0 {
|
||||||
|
for _, i := range providerInfo.ExtraInfo {
|
||||||
|
info.ExtraInfo = append(info.ExtraInfo, deepCopyAndroidMkInfo(&i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return info
|
||||||
|
}
|
||||||
|
|
||||||
|
func deepCopyAndroidMkInfo(mkinfo *AndroidMkInfo) AndroidMkInfo {
|
||||||
|
info := AndroidMkInfo{
|
||||||
|
Class: mkinfo.Class,
|
||||||
|
SubName: mkinfo.SubName,
|
||||||
|
OverrideName: mkinfo.OverrideName,
|
||||||
|
// There is no modification on DistFiles or OutputFile, so no need to
|
||||||
|
// make their deep copy.
|
||||||
|
DistFiles: mkinfo.DistFiles,
|
||||||
|
OutputFile: mkinfo.OutputFile,
|
||||||
|
Disabled: mkinfo.Disabled,
|
||||||
|
Include: mkinfo.Include,
|
||||||
|
Required: deepCopyStringSlice(mkinfo.Required),
|
||||||
|
Host_required: deepCopyStringSlice(mkinfo.Host_required),
|
||||||
|
Target_required: deepCopyStringSlice(mkinfo.Target_required),
|
||||||
|
HeaderStrings: deepCopyStringSlice(mkinfo.HeaderStrings),
|
||||||
|
FooterStrings: deepCopyStringSlice(mkinfo.FooterStrings),
|
||||||
|
EntryOrder: deepCopyStringSlice(mkinfo.EntryOrder),
|
||||||
|
}
|
||||||
|
info.EntryMap = make(map[string][]string)
|
||||||
|
for k, v := range mkinfo.EntryMap {
|
||||||
|
info.EntryMap[k] = deepCopyStringSlice(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return info
|
||||||
|
}
|
||||||
|
|
||||||
|
func deepCopyStringSlice(original []string) []string {
|
||||||
|
result := make([]string, len(original))
|
||||||
|
copy(result, original)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
@@ -23,7 +23,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/bootstrap"
|
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -397,33 +396,8 @@ func (target Target) Variations() []blueprint.Variation {
|
|||||||
// device_supported and host_supported properties to determine which OsTypes are enabled for this
|
// device_supported and host_supported properties to determine which OsTypes are enabled for this
|
||||||
// module, then searches through the Targets to determine which have enabled Targets for this
|
// module, then searches through the Targets to determine which have enabled Targets for this
|
||||||
// module.
|
// module.
|
||||||
func osMutator(bpctx blueprint.BottomUpMutatorContext) {
|
func osMutator(mctx BottomUpMutatorContext) {
|
||||||
var module Module
|
module := mctx.Module()
|
||||||
var ok bool
|
|
||||||
if module, ok = bpctx.Module().(Module); !ok {
|
|
||||||
// The module is not a Soong module, it is a Blueprint module.
|
|
||||||
if bootstrap.IsBootstrapModule(bpctx.Module()) {
|
|
||||||
// Bootstrap Go modules are always the build OS or linux bionic.
|
|
||||||
config := bpctx.Config().(Config)
|
|
||||||
osNames := []string{config.BuildOSTarget.OsVariation()}
|
|
||||||
for _, hostCrossTarget := range config.Targets[LinuxBionic] {
|
|
||||||
if hostCrossTarget.Arch.ArchType == config.BuildOSTarget.Arch.ArchType {
|
|
||||||
osNames = append(osNames, hostCrossTarget.OsVariation())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
osNames = FirstUniqueStrings(osNames)
|
|
||||||
bpctx.CreateVariations(osNames...)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap Go module support above requires this mutator to be a
|
|
||||||
// blueprint.BottomUpMutatorContext because android.BottomUpMutatorContext
|
|
||||||
// filters out non-Soong modules. Now that we've handled them, create a
|
|
||||||
// normal android.BottomUpMutatorContext.
|
|
||||||
mctx := bottomUpMutatorContextFactory(bpctx, module, false)
|
|
||||||
defer bottomUpMutatorContextPool.Put(mctx)
|
|
||||||
|
|
||||||
base := module.base()
|
base := module.base()
|
||||||
|
|
||||||
// Nothing to do for modules that are not architecture specific (e.g. a genrule).
|
// Nothing to do for modules that are not architecture specific (e.g. a genrule).
|
||||||
@@ -553,24 +527,8 @@ var DarwinUniversalVariantTag = archDepTag{name: "darwin universal binary"}
|
|||||||
//
|
//
|
||||||
// Modules can be initialized with InitAndroidMultiTargetsArchModule, in which case they will be split by OsClass,
|
// Modules can be initialized with InitAndroidMultiTargetsArchModule, in which case they will be split by OsClass,
|
||||||
// but will have a common Target that is expected to handle all other selected Targets via ctx.MultiTargets().
|
// but will have a common Target that is expected to handle all other selected Targets via ctx.MultiTargets().
|
||||||
func archMutator(bpctx blueprint.BottomUpMutatorContext) {
|
func archMutator(mctx BottomUpMutatorContext) {
|
||||||
var module Module
|
module := mctx.Module()
|
||||||
var ok bool
|
|
||||||
if module, ok = bpctx.Module().(Module); !ok {
|
|
||||||
if bootstrap.IsBootstrapModule(bpctx.Module()) {
|
|
||||||
// Bootstrap Go modules are always the build architecture.
|
|
||||||
bpctx.CreateVariations(bpctx.Config().(Config).BuildOSTarget.ArchVariation())
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap Go module support above requires this mutator to be a
|
|
||||||
// blueprint.BottomUpMutatorContext because android.BottomUpMutatorContext
|
|
||||||
// filters out non-Soong modules. Now that we've handled them, create a
|
|
||||||
// normal android.BottomUpMutatorContext.
|
|
||||||
mctx := bottomUpMutatorContextFactory(bpctx, module, false)
|
|
||||||
defer bottomUpMutatorContextPool.Put(mctx)
|
|
||||||
|
|
||||||
base := module.base()
|
base := module.base()
|
||||||
|
|
||||||
if !base.ArchSpecific() {
|
if !base.ArchSpecific() {
|
||||||
|
@@ -220,6 +220,10 @@ type BaseModuleContext interface {
|
|||||||
// EvaluateConfiguration makes ModuleContext a valid proptools.ConfigurableEvaluator, so this context
|
// EvaluateConfiguration makes ModuleContext a valid proptools.ConfigurableEvaluator, so this context
|
||||||
// can be used to evaluate the final value of Configurable properties.
|
// can be used to evaluate the final value of Configurable properties.
|
||||||
EvaluateConfiguration(condition proptools.ConfigurableCondition, property string) proptools.ConfigurableValue
|
EvaluateConfiguration(condition proptools.ConfigurableCondition, property string) proptools.ConfigurableValue
|
||||||
|
|
||||||
|
// HasMutatorFinished returns true if the given mutator has finished running.
|
||||||
|
// It will panic if given an invalid mutator name.
|
||||||
|
HasMutatorFinished(mutatorName string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type baseModuleContext struct {
|
type baseModuleContext struct {
|
||||||
@@ -270,6 +274,10 @@ func (b *baseModuleContext) setProvider(provider blueprint.AnyProviderKey, value
|
|||||||
b.bp.SetProvider(provider, value)
|
b.bp.SetProvider(provider, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *baseModuleContext) HasMutatorFinished(mutatorName string) bool {
|
||||||
|
return b.bp.HasMutatorFinished(mutatorName)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
|
func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
|
||||||
return b.bp.GetDirectDepWithTag(name, tag)
|
return b.bp.GetDirectDepWithTag(name, tag)
|
||||||
}
|
}
|
||||||
|
@@ -1663,6 +1663,17 @@ func (c *config) ApexTrimEnabled() bool {
|
|||||||
return Bool(c.productVariables.TrimmedApex)
|
return Bool(c.productVariables.TrimmedApex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *config) UseSoongSystemImage() bool {
|
||||||
|
return Bool(c.productVariables.UseSoongSystemImage)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) SoongDefinedSystemImage() string {
|
||||||
|
if c.UseSoongSystemImage() {
|
||||||
|
return String(c.productVariables.ProductSoongDefinedSystemImage)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (c *config) EnforceSystemCertificate() bool {
|
func (c *config) EnforceSystemCertificate() bool {
|
||||||
return Bool(c.productVariables.EnforceSystemCertificate)
|
return Bool(c.productVariables.EnforceSystemCertificate)
|
||||||
}
|
}
|
||||||
|
@@ -58,7 +58,7 @@ type Module interface {
|
|||||||
|
|
||||||
base() *ModuleBase
|
base() *ModuleBase
|
||||||
Disable()
|
Disable()
|
||||||
Enabled(ctx ConfigAndErrorContext) bool
|
Enabled(ctx ConfigurableEvaluatorContext) bool
|
||||||
Target() Target
|
Target() Target
|
||||||
MultiTargets() []Target
|
MultiTargets() []Target
|
||||||
|
|
||||||
@@ -109,12 +109,12 @@ type Module interface {
|
|||||||
// Get information about the properties that can contain visibility rules.
|
// Get information about the properties that can contain visibility rules.
|
||||||
visibilityProperties() []visibilityProperty
|
visibilityProperties() []visibilityProperty
|
||||||
|
|
||||||
RequiredModuleNames(ctx ConfigAndErrorContext) []string
|
RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string
|
||||||
HostRequiredModuleNames() []string
|
HostRequiredModuleNames() []string
|
||||||
TargetRequiredModuleNames() []string
|
TargetRequiredModuleNames() []string
|
||||||
VintfFragmentModuleNames(ctx ConfigAndErrorContext) []string
|
VintfFragmentModuleNames(ctx ConfigurableEvaluatorContext) []string
|
||||||
|
|
||||||
ConfigurableEvaluator(ctx ConfigAndErrorContext) proptools.ConfigurableEvaluator
|
ConfigurableEvaluator(ctx ConfigurableEvaluatorContext) proptools.ConfigurableEvaluator
|
||||||
}
|
}
|
||||||
|
|
||||||
// Qualified id for a module
|
// Qualified id for a module
|
||||||
@@ -1339,7 +1339,7 @@ func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
|
|||||||
return partition
|
return partition
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ModuleBase) Enabled(ctx ConfigAndErrorContext) bool {
|
func (m *ModuleBase) Enabled(ctx ConfigurableEvaluatorContext) bool {
|
||||||
if m.commonProperties.ForcedDisabled {
|
if m.commonProperties.ForcedDisabled {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -1536,7 +1536,7 @@ func (m *ModuleBase) InRecovery() bool {
|
|||||||
return m.base().commonProperties.ImageVariation == RecoveryVariation
|
return m.base().commonProperties.ImageVariation == RecoveryVariation
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ModuleBase) RequiredModuleNames(ctx ConfigAndErrorContext) []string {
|
func (m *ModuleBase) RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string {
|
||||||
return m.base().commonProperties.Required.GetOrDefault(m.ConfigurableEvaluator(ctx), nil)
|
return m.base().commonProperties.Required.GetOrDefault(m.ConfigurableEvaluator(ctx), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1548,7 +1548,7 @@ func (m *ModuleBase) TargetRequiredModuleNames() []string {
|
|||||||
return m.base().commonProperties.Target_required
|
return m.base().commonProperties.Target_required
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ModuleBase) VintfFragmentModuleNames(ctx ConfigAndErrorContext) []string {
|
func (m *ModuleBase) VintfFragmentModuleNames(ctx ConfigurableEvaluatorContext) []string {
|
||||||
return m.base().commonProperties.Vintf_fragment_modules.GetOrDefault(m.ConfigurableEvaluator(ctx), nil)
|
return m.base().commonProperties.Vintf_fragment_modules.GetOrDefault(m.ConfigurableEvaluator(ctx), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2204,17 +2204,17 @@ func (m *ModuleBase) IsNativeBridgeSupported() bool {
|
|||||||
return proptools.Bool(m.commonProperties.Native_bridge_supported)
|
return proptools.Bool(m.commonProperties.Native_bridge_supported)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigAndErrorContext interface {
|
type ConfigurableEvaluatorContext interface {
|
||||||
Config() Config
|
Config() Config
|
||||||
OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{})
|
OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
type configurationEvalutor struct {
|
type configurationEvalutor struct {
|
||||||
ctx ConfigAndErrorContext
|
ctx ConfigurableEvaluatorContext
|
||||||
m Module
|
m Module
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ModuleBase) ConfigurableEvaluator(ctx ConfigAndErrorContext) proptools.ConfigurableEvaluator {
|
func (m *ModuleBase) ConfigurableEvaluator(ctx ConfigurableEvaluatorContext) proptools.ConfigurableEvaluator {
|
||||||
return configurationEvalutor{
|
return configurationEvalutor{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
m: m.module,
|
m: m.module,
|
||||||
|
@@ -85,7 +85,9 @@ type ModuleBuildParams BuildParams
|
|||||||
type ModuleContext interface {
|
type ModuleContext interface {
|
||||||
BaseModuleContext
|
BaseModuleContext
|
||||||
|
|
||||||
blueprintModuleContext() blueprint.ModuleContext
|
// BlueprintModuleContext returns the blueprint.ModuleContext that the ModuleContext wraps. It may only be
|
||||||
|
// used by the golang module types that need to call into the bootstrap module types.
|
||||||
|
BlueprintModuleContext() blueprint.ModuleContext
|
||||||
|
|
||||||
// Deprecated: use ModuleContext.Build instead.
|
// Deprecated: use ModuleContext.Build instead.
|
||||||
ModuleBuild(pctx PackageContext, params ModuleBuildParams)
|
ModuleBuild(pctx PackageContext, params ModuleBuildParams)
|
||||||
@@ -194,7 +196,7 @@ type ModuleContext interface {
|
|||||||
InstallInVendor() bool
|
InstallInVendor() bool
|
||||||
InstallForceOS() (*OsType, *ArchType)
|
InstallForceOS() (*OsType, *ArchType)
|
||||||
|
|
||||||
RequiredModuleNames(ctx ConfigAndErrorContext) []string
|
RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string
|
||||||
HostRequiredModuleNames() []string
|
HostRequiredModuleNames() []string
|
||||||
TargetRequiredModuleNames() []string
|
TargetRequiredModuleNames() []string
|
||||||
|
|
||||||
@@ -779,7 +781,7 @@ func (m *moduleContext) UncheckedModule() {
|
|||||||
m.uncheckedModule = true
|
m.uncheckedModule = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *moduleContext) blueprintModuleContext() blueprint.ModuleContext {
|
func (m *moduleContext) BlueprintModuleContext() blueprint.ModuleContext {
|
||||||
return m.bp
|
return m.bp
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -855,7 +857,7 @@ func (m *moduleContext) ExpandOptionalSource(srcFile *string, _ string) Optional
|
|||||||
return OptionalPath{}
|
return OptionalPath{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *moduleContext) RequiredModuleNames(ctx ConfigAndErrorContext) []string {
|
func (m *moduleContext) RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string {
|
||||||
return m.module.RequiredModuleNames(ctx)
|
return m.module.RequiredModuleNames(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -148,9 +148,9 @@ var preArch = []RegisterMutatorFunc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func registerArchMutator(ctx RegisterMutatorsContext) {
|
func registerArchMutator(ctx RegisterMutatorsContext) {
|
||||||
ctx.BottomUpBlueprint("os", osMutator).Parallel()
|
ctx.BottomUp("os", osMutator).Parallel()
|
||||||
ctx.Transition("image", &imageTransitionMutator{})
|
ctx.Transition("image", &imageTransitionMutator{})
|
||||||
ctx.BottomUpBlueprint("arch", archMutator).Parallel()
|
ctx.BottomUp("arch", archMutator).Parallel()
|
||||||
}
|
}
|
||||||
|
|
||||||
var preDeps = []RegisterMutatorFunc{
|
var preDeps = []RegisterMutatorFunc{
|
||||||
|
@@ -27,7 +27,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/bootstrap"
|
|
||||||
"github.com/google/blueprint/pathtools"
|
"github.com/google/blueprint/pathtools"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -94,6 +93,7 @@ type ModuleWithDepsPathContext interface {
|
|||||||
EarlyModulePathContext
|
EarlyModulePathContext
|
||||||
VisitDirectDepsBlueprint(visit func(blueprint.Module))
|
VisitDirectDepsBlueprint(visit func(blueprint.Module))
|
||||||
OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
|
OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
|
||||||
|
HasMutatorFinished(mutatorName string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ModuleMissingDepsPathContext is a subset of *ModuleContext methods required by
|
// ModuleMissingDepsPathContext is a subset of *ModuleContext methods required by
|
||||||
@@ -554,13 +554,6 @@ func (p OutputPaths) Strings() []string {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// PathForGoBinary returns the path to the installed location of a bootstrap_go_binary module.
|
|
||||||
func PathForGoBinary(ctx PathContext, goBinary bootstrap.GoBinaryTool) Path {
|
|
||||||
goBinaryInstallDir := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin")
|
|
||||||
rel := Rel(ctx, goBinaryInstallDir.String(), goBinary.InstallPath())
|
|
||||||
return goBinaryInstallDir.Join(ctx, rel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Expands Paths to a SourceFileProducer or OutputFileProducer module dependency referenced via ":name" or ":name{.tag}" syntax.
|
// Expands Paths to a SourceFileProducer or OutputFileProducer module dependency referenced via ":name" or ":name{.tag}" syntax.
|
||||||
// If the dependency is not found, a missingErrorDependency is returned.
|
// If the dependency is not found, a missingErrorDependency is returned.
|
||||||
// If the module dependency is not a SourceFileProducer or OutputFileProducer, appropriate errors will be returned.
|
// If the module dependency is not a SourceFileProducer or OutputFileProducer, appropriate errors will be returned.
|
||||||
@@ -572,10 +565,6 @@ func getPathsFromModuleDep(ctx ModuleWithDepsPathContext, path, moduleName, tag
|
|||||||
if aModule, ok := module.(Module); ok && !aModule.Enabled(ctx) {
|
if aModule, ok := module.(Module); ok && !aModule.Enabled(ctx) {
|
||||||
return nil, missingDependencyError{[]string{moduleName}}
|
return nil, missingDependencyError{[]string{moduleName}}
|
||||||
}
|
}
|
||||||
if goBinary, ok := module.(bootstrap.GoBinaryTool); ok && tag == "" {
|
|
||||||
goBinaryPath := PathForGoBinary(ctx, goBinary)
|
|
||||||
return Paths{goBinaryPath}, nil
|
|
||||||
}
|
|
||||||
outputFiles, err := outputFilesForModule(ctx, module, tag)
|
outputFiles, err := outputFilesForModule(ctx, module, tag)
|
||||||
if outputFiles != nil && err == nil {
|
if outputFiles != nil && err == nil {
|
||||||
return outputFiles, nil
|
return outputFiles, nil
|
||||||
|
@@ -813,8 +813,6 @@ type SdkMemberProperties interface {
|
|||||||
|
|
||||||
// SdkMemberContext provides access to information common to a specific member.
|
// SdkMemberContext provides access to information common to a specific member.
|
||||||
type SdkMemberContext interface {
|
type SdkMemberContext interface {
|
||||||
ConfigAndErrorContext
|
|
||||||
|
|
||||||
// SdkModuleContext returns the module context of the sdk common os variant which is creating the
|
// SdkModuleContext returns the module context of the sdk common os variant which is creating the
|
||||||
// snapshot.
|
// snapshot.
|
||||||
//
|
//
|
||||||
|
@@ -90,6 +90,10 @@ type SingletonContext interface {
|
|||||||
|
|
||||||
// OtherModulePropertyErrorf reports an error on the line number of the given property of the given module
|
// OtherModulePropertyErrorf reports an error on the line number of the given property of the given module
|
||||||
OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{})
|
OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{})
|
||||||
|
|
||||||
|
// HasMutatorFinished returns true if the given mutator has finished running.
|
||||||
|
// It will panic if given an invalid mutator name.
|
||||||
|
HasMutatorFinished(mutatorName string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type singletonAdaptor struct {
|
type singletonAdaptor struct {
|
||||||
@@ -286,3 +290,7 @@ func (s *singletonContextAdaptor) otherModuleProvider(module blueprint.Module, p
|
|||||||
func (s *singletonContextAdaptor) OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{}) {
|
func (s *singletonContextAdaptor) OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{}) {
|
||||||
s.blueprintSingletonContext().OtherModulePropertyErrorf(module, property, format, args...)
|
s.blueprintSingletonContext().OtherModulePropertyErrorf(module, property, format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *singletonContextAdaptor) HasMutatorFinished(mutatorName string) bool {
|
||||||
|
return s.blueprintSingletonContext().HasMutatorFinished(mutatorName)
|
||||||
|
}
|
||||||
|
@@ -1326,7 +1326,11 @@ func (ctx *panickingConfigAndErrorContext) Config() Config {
|
|||||||
return ctx.ctx.Config()
|
return ctx.ctx.Config()
|
||||||
}
|
}
|
||||||
|
|
||||||
func PanickingConfigAndErrorContext(ctx *TestContext) ConfigAndErrorContext {
|
func (ctx *panickingConfigAndErrorContext) HasMutatorFinished(mutatorName string) bool {
|
||||||
|
return ctx.ctx.HasMutatorFinished(mutatorName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PanickingConfigAndErrorContext(ctx *TestContext) ConfigurableEvaluatorContext {
|
||||||
return &panickingConfigAndErrorContext{
|
return &panickingConfigAndErrorContext{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
}
|
}
|
||||||
|
@@ -177,6 +177,41 @@ func setFromList[T comparable](l []T) map[T]bool {
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PrettyConcat returns the formatted concatenated string suitable for displaying user-facing
|
||||||
|
// messages.
|
||||||
|
func PrettyConcat(list []string, quote bool, lastSep string) string {
|
||||||
|
if len(list) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
quoteStr := func(v string) string {
|
||||||
|
if !quote {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%q", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(list) == 1 {
|
||||||
|
return quoteStr(list[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
var sb strings.Builder
|
||||||
|
for i, val := range list {
|
||||||
|
if i > 0 {
|
||||||
|
sb.WriteString(", ")
|
||||||
|
}
|
||||||
|
if i == len(list)-1 {
|
||||||
|
sb.WriteString(lastSep)
|
||||||
|
if lastSep != "" {
|
||||||
|
sb.WriteString(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.WriteString(quoteStr(val))
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
// ListSetDifference checks if the two lists contain the same elements. It returns
|
// ListSetDifference checks if the two lists contain the same elements. It returns
|
||||||
// a boolean which is true if there is a difference, and then returns lists of elements
|
// a boolean which is true if there is a difference, and then returns lists of elements
|
||||||
// that are in l1 but not l2, and l2 but not l1.
|
// that are in l1 but not l2, and l2 but not l1.
|
||||||
|
@@ -867,3 +867,51 @@ func TestHasIntersection(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var prettyConcatTestCases = []struct {
|
||||||
|
name string
|
||||||
|
list []string
|
||||||
|
quote bool
|
||||||
|
lastSeparator string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty",
|
||||||
|
list: []string{},
|
||||||
|
quote: false,
|
||||||
|
lastSeparator: "and",
|
||||||
|
expected: ``,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "single",
|
||||||
|
list: []string{"a"},
|
||||||
|
quote: true,
|
||||||
|
lastSeparator: "and",
|
||||||
|
expected: `"a"`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with separator",
|
||||||
|
list: []string{"a", "b", "c"},
|
||||||
|
quote: true,
|
||||||
|
lastSeparator: "or",
|
||||||
|
expected: `"a", "b", or "c"`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "without separator",
|
||||||
|
list: []string{"a", "b", "c"},
|
||||||
|
quote: false,
|
||||||
|
lastSeparator: "",
|
||||||
|
expected: `a, b, c`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPrettyConcat(t *testing.T) {
|
||||||
|
for _, testCase := range prettyConcatTestCases {
|
||||||
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
|
concatString := PrettyConcat(testCase.list, testCase.quote, testCase.lastSeparator)
|
||||||
|
if !reflect.DeepEqual(concatString, testCase.expected) {
|
||||||
|
t.Errorf("expected %#v, got %#v", testCase.expected, concatString)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -423,6 +423,9 @@ type ProductVariables struct {
|
|||||||
|
|
||||||
TargetFSConfigGen []string `json:",omitempty"`
|
TargetFSConfigGen []string `json:",omitempty"`
|
||||||
|
|
||||||
|
UseSoongSystemImage *bool `json:",omitempty"`
|
||||||
|
ProductSoongDefinedSystemImage *string `json:",omitempty"`
|
||||||
|
|
||||||
EnforceProductPartitionInterface *bool `json:",omitempty"`
|
EnforceProductPartitionInterface *bool `json:",omitempty"`
|
||||||
|
|
||||||
EnforceInterPartitionJavaSdkLibrary *bool `json:",omitempty"`
|
EnforceInterPartitionJavaSdkLibrary *bool `json:",omitempty"`
|
||||||
|
@@ -15,7 +15,6 @@ bootstrap_go_package {
|
|||||||
"soong-cc",
|
"soong-cc",
|
||||||
"soong-filesystem",
|
"soong-filesystem",
|
||||||
"soong-java",
|
"soong-java",
|
||||||
"soong-multitree",
|
|
||||||
"soong-provenance",
|
"soong-provenance",
|
||||||
"soong-python",
|
"soong-python",
|
||||||
"soong-rust",
|
"soong-rust",
|
||||||
|
75
apex/apex.go
75
apex/apex.go
@@ -32,7 +32,6 @@ import (
|
|||||||
prebuilt_etc "android/soong/etc"
|
prebuilt_etc "android/soong/etc"
|
||||||
"android/soong/filesystem"
|
"android/soong/filesystem"
|
||||||
"android/soong/java"
|
"android/soong/java"
|
||||||
"android/soong/multitree"
|
|
||||||
"android/soong/rust"
|
"android/soong/rust"
|
||||||
"android/soong/sh"
|
"android/soong/sh"
|
||||||
)
|
)
|
||||||
@@ -431,7 +430,6 @@ type apexBundle struct {
|
|||||||
android.ModuleBase
|
android.ModuleBase
|
||||||
android.DefaultableModuleBase
|
android.DefaultableModuleBase
|
||||||
android.OverridableModuleBase
|
android.OverridableModuleBase
|
||||||
multitree.ExportableModuleBase
|
|
||||||
|
|
||||||
// Properties
|
// Properties
|
||||||
properties apexBundleProperties
|
properties apexBundleProperties
|
||||||
@@ -1399,8 +1397,6 @@ func (a *apexBundle) DepIsInSameApex(_ android.BaseModuleContext, _ android.Modu
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ multitree.Exportable = (*apexBundle)(nil)
|
|
||||||
|
|
||||||
func (a *apexBundle) Exportable() bool {
|
func (a *apexBundle) Exportable() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -2528,7 +2524,6 @@ func newApexBundle() *apexBundle {
|
|||||||
android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
|
android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
|
||||||
android.InitDefaultableModule(module)
|
android.InitDefaultableModule(module)
|
||||||
android.InitOverridableModule(module, &module.overridableProperties.Overrides)
|
android.InitOverridableModule(module, &module.overridableProperties.Overrides)
|
||||||
multitree.InitExportableModule(module)
|
|
||||||
return module
|
return module
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2785,7 +2780,7 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if to.AvailableFor(apexName) || baselineApexAvailable(apexName, toName) {
|
if to.AvailableFor(apexName) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2845,74 +2840,6 @@ func (a *apexBundle) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeI
|
|||||||
dpInfo.Deps = append(dpInfo.Deps, a.properties.ResolvedSystemserverclasspathFragments...)
|
dpInfo.Deps = append(dpInfo.Deps, a.properties.ResolvedSystemserverclasspathFragments...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
apexAvailBaseline = makeApexAvailableBaseline()
|
|
||||||
inverseApexAvailBaseline = invertApexBaseline(apexAvailBaseline)
|
|
||||||
)
|
|
||||||
|
|
||||||
func baselineApexAvailable(apex, moduleName string) bool {
|
|
||||||
key := apex
|
|
||||||
moduleName = normalizeModuleName(moduleName)
|
|
||||||
|
|
||||||
if val, ok := apexAvailBaseline[key]; ok && android.InList(moduleName, val) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
key = android.AvailableToAnyApex
|
|
||||||
if val, ok := apexAvailBaseline[key]; ok && android.InList(moduleName, val) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func normalizeModuleName(moduleName string) string {
|
|
||||||
// Prebuilt modules (e.g. java_import, etc.) have "prebuilt_" prefix added by the build
|
|
||||||
// system. Trim the prefix for the check since they are confusing
|
|
||||||
moduleName = android.RemoveOptionalPrebuiltPrefix(moduleName)
|
|
||||||
if strings.HasPrefix(moduleName, "libclang_rt.") {
|
|
||||||
// This module has many arch variants that depend on the product being built.
|
|
||||||
// We don't want to list them all
|
|
||||||
moduleName = "libclang_rt"
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(moduleName, "androidx.") {
|
|
||||||
// TODO(b/156996905) Set apex_available/min_sdk_version for androidx support libraries
|
|
||||||
moduleName = "androidx"
|
|
||||||
}
|
|
||||||
return moduleName
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transform the map of apex -> modules to module -> apexes.
|
|
||||||
func invertApexBaseline(m map[string][]string) map[string][]string {
|
|
||||||
r := make(map[string][]string)
|
|
||||||
for apex, modules := range m {
|
|
||||||
for _, module := range modules {
|
|
||||||
r[module] = append(r[module], apex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve the baseline of apexes to which the supplied module belongs.
|
|
||||||
func BaselineApexAvailable(moduleName string) []string {
|
|
||||||
return inverseApexAvailBaseline[normalizeModuleName(moduleName)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a map from apex to modules, which overrides the apex_available setting for that
|
|
||||||
// particular module to make it available for the apex regardless of its setting.
|
|
||||||
// TODO(b/147364041): remove this
|
|
||||||
func makeApexAvailableBaseline() map[string][]string {
|
|
||||||
// The "Module separator"s below are employed to minimize merge conflicts.
|
|
||||||
m := make(map[string][]string)
|
|
||||||
//
|
|
||||||
// Module separator
|
|
||||||
//
|
|
||||||
m["com.android.runtime"] = []string{
|
|
||||||
"libz",
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
android.AddNeverAllowRules(createBcpPermittedPackagesRules(qBcpPackages())...)
|
android.AddNeverAllowRules(createBcpPermittedPackagesRules(qBcpPackages())...)
|
||||||
android.AddNeverAllowRules(createBcpPermittedPackagesRules(rBcpPackages())...)
|
android.AddNeverAllowRules(createBcpPermittedPackagesRules(rBcpPackages())...)
|
||||||
|
@@ -10273,208 +10273,6 @@ func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
|
|
||||||
bp := `
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["libbaz"],
|
|
||||||
binaries: ["binfoo"],
|
|
||||||
min_sdk_version: "29",
|
|
||||||
}
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
}
|
|
||||||
cc_binary {
|
|
||||||
name: "binfoo",
|
|
||||||
shared_libs: ["libbar", "libbaz", "libqux",],
|
|
||||||
apex_available: ["myapex"],
|
|
||||||
min_sdk_version: "29",
|
|
||||||
recovery_available: false,
|
|
||||||
}
|
|
||||||
cc_library {
|
|
||||||
name: "libbar",
|
|
||||||
srcs: ["libbar.cc"],
|
|
||||||
stubs: {
|
|
||||||
symbol_file: "libbar.map.txt",
|
|
||||||
versions: [
|
|
||||||
"29",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
cc_library {
|
|
||||||
name: "libbaz",
|
|
||||||
srcs: ["libbaz.cc"],
|
|
||||||
apex_available: ["myapex"],
|
|
||||||
min_sdk_version: "29",
|
|
||||||
stubs: {
|
|
||||||
symbol_file: "libbaz.map.txt",
|
|
||||||
versions: [
|
|
||||||
"29",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
cc_api_library {
|
|
||||||
name: "libbar",
|
|
||||||
src: "libbar_stub.so",
|
|
||||||
min_sdk_version: "29",
|
|
||||||
variants: ["apex.29"],
|
|
||||||
}
|
|
||||||
cc_api_variant {
|
|
||||||
name: "libbar",
|
|
||||||
variant: "apex",
|
|
||||||
version: "29",
|
|
||||||
src: "libbar_apex_29.so",
|
|
||||||
}
|
|
||||||
cc_api_library {
|
|
||||||
name: "libbaz",
|
|
||||||
src: "libbaz_stub.so",
|
|
||||||
min_sdk_version: "29",
|
|
||||||
variants: ["apex.29"],
|
|
||||||
}
|
|
||||||
cc_api_variant {
|
|
||||||
name: "libbaz",
|
|
||||||
variant: "apex",
|
|
||||||
version: "29",
|
|
||||||
src: "libbaz_apex_29.so",
|
|
||||||
}
|
|
||||||
cc_api_library {
|
|
||||||
name: "libqux",
|
|
||||||
src: "libqux_stub.so",
|
|
||||||
min_sdk_version: "29",
|
|
||||||
variants: ["apex.29"],
|
|
||||||
}
|
|
||||||
cc_api_variant {
|
|
||||||
name: "libqux",
|
|
||||||
variant: "apex",
|
|
||||||
version: "29",
|
|
||||||
src: "libqux_apex_29.so",
|
|
||||||
}
|
|
||||||
api_imports {
|
|
||||||
name: "api_imports",
|
|
||||||
apex_shared_libs: [
|
|
||||||
"libbar",
|
|
||||||
"libbaz",
|
|
||||||
"libqux",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
`
|
|
||||||
result := testApex(t, bp)
|
|
||||||
|
|
||||||
hasDep := func(m android.Module, wantDep android.Module) bool {
|
|
||||||
t.Helper()
|
|
||||||
var found bool
|
|
||||||
result.VisitDirectDeps(m, func(dep blueprint.Module) {
|
|
||||||
if dep == wantDep {
|
|
||||||
found = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return found
|
|
||||||
}
|
|
||||||
|
|
||||||
// Library defines stubs and cc_api_library should be used with cc_api_library
|
|
||||||
binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
|
|
||||||
libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
|
|
||||||
libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
|
|
||||||
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
|
|
||||||
|
|
||||||
binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
|
|
||||||
android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
|
|
||||||
|
|
||||||
// Library defined in the same APEX should be linked with original definition instead of cc_api_library
|
|
||||||
libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
|
|
||||||
libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
|
|
||||||
|
|
||||||
android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
|
|
||||||
|
|
||||||
// cc_api_library defined without original library should be linked with cc_api_library
|
|
||||||
libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
|
|
||||||
android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
|
|
||||||
bp := `
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["libbar"],
|
|
||||||
min_sdk_version: "29",
|
|
||||||
}
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
}
|
|
||||||
cc_binary {
|
|
||||||
name: "binfoo",
|
|
||||||
shared_libs: ["libbar"],
|
|
||||||
recovery_available: false,
|
|
||||||
}
|
|
||||||
cc_library {
|
|
||||||
name: "libbar",
|
|
||||||
srcs: ["libbar.cc"],
|
|
||||||
apex_available: ["myapex"],
|
|
||||||
min_sdk_version: "29",
|
|
||||||
stubs: {
|
|
||||||
symbol_file: "libbar.map.txt",
|
|
||||||
versions: [
|
|
||||||
"29",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
cc_api_library {
|
|
||||||
name: "libbar",
|
|
||||||
src: "libbar_stub.so",
|
|
||||||
variants: ["apex.29"],
|
|
||||||
}
|
|
||||||
cc_api_variant {
|
|
||||||
name: "libbar",
|
|
||||||
variant: "apex",
|
|
||||||
version: "29",
|
|
||||||
src: "libbar_apex_29.so",
|
|
||||||
}
|
|
||||||
api_imports {
|
|
||||||
name: "api_imports",
|
|
||||||
apex_shared_libs: [
|
|
||||||
"libbar",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
result := testApex(t, bp)
|
|
||||||
|
|
||||||
hasDep := func(m android.Module, wantDep android.Module) bool {
|
|
||||||
t.Helper()
|
|
||||||
var found bool
|
|
||||||
result.VisitDirectDeps(m, func(dep blueprint.Module) {
|
|
||||||
if dep == wantDep {
|
|
||||||
found = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return found
|
|
||||||
}
|
|
||||||
|
|
||||||
// Library defines stubs and cc_api_library should be used with cc_api_library
|
|
||||||
binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
|
|
||||||
libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
|
|
||||||
libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
|
|
||||||
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
|
|
||||||
android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
|
|
||||||
|
|
||||||
binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
|
|
||||||
android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
|
|
||||||
android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTrimmedApex(t *testing.T) {
|
func TestTrimmedApex(t *testing.T) {
|
||||||
bp := `
|
bp := `
|
||||||
apex {
|
apex {
|
||||||
@@ -10513,21 +10311,6 @@ func TestTrimmedApex(t *testing.T) {
|
|||||||
apex_available: ["myapex","mydcla"],
|
apex_available: ["myapex","mydcla"],
|
||||||
min_sdk_version: "29",
|
min_sdk_version: "29",
|
||||||
}
|
}
|
||||||
cc_api_library {
|
|
||||||
name: "libc",
|
|
||||||
src: "libc.so",
|
|
||||||
min_sdk_version: "29",
|
|
||||||
recovery_available: true,
|
|
||||||
vendor_available: true,
|
|
||||||
product_available: true,
|
|
||||||
}
|
|
||||||
api_imports {
|
|
||||||
name: "api_imports",
|
|
||||||
shared_libs: [
|
|
||||||
"libc",
|
|
||||||
],
|
|
||||||
header_libs: [],
|
|
||||||
}
|
|
||||||
`
|
`
|
||||||
ctx := testApex(t, bp)
|
ctx := testApex(t, bp)
|
||||||
module := ctx.ModuleForTests("myapex", "android_common_myapex")
|
module := ctx.ModuleForTests("myapex", "android_common_myapex")
|
||||||
|
@@ -40,6 +40,7 @@ kzip_targets=(
|
|||||||
merge_zips
|
merge_zips
|
||||||
xref_cxx
|
xref_cxx
|
||||||
xref_java
|
xref_java
|
||||||
|
xref_kotlin
|
||||||
# TODO: b/286390153 - reenable rust
|
# TODO: b/286390153 - reenable rust
|
||||||
# xref_rust
|
# xref_rust
|
||||||
)
|
)
|
||||||
|
@@ -16,7 +16,6 @@ bootstrap_go_package {
|
|||||||
"soong-etc",
|
"soong-etc",
|
||||||
"soong-fuzz",
|
"soong-fuzz",
|
||||||
"soong-genrule",
|
"soong-genrule",
|
||||||
"soong-multitree",
|
|
||||||
"soong-testing",
|
"soong-testing",
|
||||||
"soong-tradefed",
|
"soong-tradefed",
|
||||||
],
|
],
|
||||||
@@ -65,7 +64,6 @@ bootstrap_go_package {
|
|||||||
"library.go",
|
"library.go",
|
||||||
"library_headers.go",
|
"library_headers.go",
|
||||||
"library_sdk_member.go",
|
"library_sdk_member.go",
|
||||||
"library_stub.go",
|
|
||||||
"native_bridge_sdk_trait.go",
|
"native_bridge_sdk_trait.go",
|
||||||
"object.go",
|
"object.go",
|
||||||
"test.go",
|
"test.go",
|
||||||
|
@@ -21,7 +21,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
"android/soong/multitree"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -479,34 +478,6 @@ func (p *prebuiltBinaryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *a
|
|||||||
androidMkWritePrebuiltOptions(p.baseLinker, entries)
|
androidMkWritePrebuiltOptions(p.baseLinker, entries)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *apiLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
|
|
||||||
entries.Class = "SHARED_LIBRARIES"
|
|
||||||
entries.SubName += multitree.GetApiImportSuffix()
|
|
||||||
|
|
||||||
entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
|
|
||||||
a.libraryDecorator.androidMkWriteExportedFlags(entries)
|
|
||||||
src := *a.properties.Src
|
|
||||||
path, file := filepath.Split(src)
|
|
||||||
stem, suffix, ext := android.SplitFileExt(file)
|
|
||||||
entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
|
|
||||||
entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
|
|
||||||
entries.SetString("LOCAL_MODULE_STEM", stem)
|
|
||||||
entries.SetString("LOCAL_MODULE_PATH", path)
|
|
||||||
entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
|
|
||||||
entries.SetString("LOCAL_SOONG_TOC", a.toc().String())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *apiHeadersDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
|
|
||||||
entries.Class = "HEADER_LIBRARIES"
|
|
||||||
entries.SubName += multitree.GetApiImportSuffix()
|
|
||||||
|
|
||||||
entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
|
|
||||||
a.libraryDecorator.androidMkWriteExportedFlags(entries)
|
|
||||||
entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func androidMkWritePrebuiltOptions(linker *baseLinker, entries *android.AndroidMkEntries) {
|
func androidMkWritePrebuiltOptions(linker *baseLinker, entries *android.AndroidMkEntries) {
|
||||||
allow := linker.Properties.Allow_undefined_symbols
|
allow := linker.Properties.Allow_undefined_symbols
|
||||||
if allow != nil {
|
if allow != nil {
|
||||||
|
@@ -132,7 +132,7 @@ func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberCo
|
|||||||
|
|
||||||
if ccModule.linker != nil {
|
if ccModule.linker != nil {
|
||||||
specifiedDeps := specifiedDeps{}
|
specifiedDeps := specifiedDeps{}
|
||||||
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(ctx, ccModule, specifiedDeps)
|
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(ctx.SdkModuleContext(), ccModule, specifiedDeps)
|
||||||
|
|
||||||
p.SharedLibs = specifiedDeps.sharedLibs
|
p.SharedLibs = specifiedDeps.sharedLibs
|
||||||
p.SystemSharedLibs = specifiedDeps.systemSharedLibs
|
p.SystemSharedLibs = specifiedDeps.systemSharedLibs
|
||||||
|
123
cc/cc.go
123
cc/cc.go
@@ -34,7 +34,6 @@ import (
|
|||||||
"android/soong/cc/config"
|
"android/soong/cc/config"
|
||||||
"android/soong/fuzz"
|
"android/soong/fuzz"
|
||||||
"android/soong/genrule"
|
"android/soong/genrule"
|
||||||
"android/soong/multitree"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -613,7 +612,7 @@ type linker interface {
|
|||||||
coverageOutputFilePath() android.OptionalPath
|
coverageOutputFilePath() android.OptionalPath
|
||||||
|
|
||||||
// Get the deps that have been explicitly specified in the properties.
|
// Get the deps that have been explicitly specified in the properties.
|
||||||
linkerSpecifiedDeps(ctx android.ConfigAndErrorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
|
linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
|
||||||
|
|
||||||
moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
|
moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
|
||||||
}
|
}
|
||||||
@@ -970,7 +969,7 @@ func (c *Module) HiddenFromMake() bool {
|
|||||||
return c.Properties.HideFromMake
|
return c.Properties.HideFromMake
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Module) RequiredModuleNames(ctx android.ConfigAndErrorContext) []string {
|
func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
|
||||||
required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
|
required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
|
||||||
if c.ImageVariation().Variation == android.CoreVariation {
|
if c.ImageVariation().Variation == android.CoreVariation {
|
||||||
required = append(required, c.Properties.Target.Platform.Required...)
|
required = append(required, c.Properties.Target.Platform.Required...)
|
||||||
@@ -2361,24 +2360,6 @@ func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
|
|
||||||
apiImportInfo := multitree.ApiImportInfo{}
|
|
||||||
|
|
||||||
if c.Device() {
|
|
||||||
var apiImportModule []blueprint.Module
|
|
||||||
if actx.OtherModuleExists("api_imports") {
|
|
||||||
apiImportModule = actx.AddDependency(c, nil, "api_imports")
|
|
||||||
if len(apiImportModule) > 0 && apiImportModule[0] != nil {
|
|
||||||
apiInfo, _ := android.OtherModuleProvider(actx, apiImportModule[0], multitree.ApiImportsProvider)
|
|
||||||
apiImportInfo = apiInfo
|
|
||||||
android.SetProvider(actx, multitree.ApiImportsProvider, apiInfo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return apiImportInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
|
func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
|
||||||
if snapshot, ok := replaceMap[lib]; ok {
|
if snapshot, ok := replaceMap[lib]; ok {
|
||||||
return snapshot
|
return snapshot
|
||||||
@@ -2448,11 +2429,6 @@ func (c *Module) shouldUseApiSurface() bool {
|
|||||||
// NDK Variant
|
// NDK Variant
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.isImportedApiLibrary() {
|
|
||||||
// API Library should depend on API headers
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
@@ -2472,19 +2448,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
ctx.ctx = ctx
|
ctx.ctx = ctx
|
||||||
|
|
||||||
deps := c.deps(ctx)
|
deps := c.deps(ctx)
|
||||||
apiImportInfo := GetApiImports(c, actx)
|
|
||||||
|
|
||||||
apiNdkLibs := []string{}
|
apiNdkLibs := []string{}
|
||||||
apiLateNdkLibs := []string{}
|
apiLateNdkLibs := []string{}
|
||||||
|
|
||||||
if c.shouldUseApiSurface() {
|
|
||||||
deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
|
|
||||||
deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
|
|
||||||
deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
|
|
||||||
deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
|
|
||||||
deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
|
c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
|
||||||
|
|
||||||
variantNdkLibs := []string{}
|
variantNdkLibs := []string{}
|
||||||
@@ -2501,11 +2468,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
depTag.reexportFlags = true
|
depTag.reexportFlags = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check header lib replacement from API surface first, and then check again with VSDK
|
|
||||||
if c.shouldUseApiSurface() {
|
|
||||||
lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.isNDKStubLibrary() {
|
if c.isNDKStubLibrary() {
|
||||||
variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
|
variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
|
||||||
if variationExists {
|
if variationExists {
|
||||||
@@ -2515,7 +2477,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
// any variants.
|
// any variants.
|
||||||
actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
|
actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
|
||||||
}
|
}
|
||||||
} else if c.IsStubs() && !c.isImportedApiLibrary() {
|
} else if c.IsStubs() {
|
||||||
actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
|
actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
|
||||||
depTag, lib)
|
depTag, lib)
|
||||||
} else {
|
} else {
|
||||||
@@ -2591,24 +2553,14 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
name, version := StubsLibNameAndVersion(lib)
|
name, version := StubsLibNameAndVersion(lib)
|
||||||
if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
|
|
||||||
name = apiLibraryName
|
|
||||||
}
|
|
||||||
sharedLibNames = append(sharedLibNames, name)
|
sharedLibNames = append(sharedLibNames, name)
|
||||||
|
|
||||||
variations := []blueprint.Variation{
|
variations := []blueprint.Variation{
|
||||||
{Mutator: "link", Variation: "shared"},
|
{Mutator: "link", Variation: "shared"},
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
|
|
||||||
AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
|
AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
|
|
||||||
AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, lib := range deps.LateStaticLibs {
|
for _, lib := range deps.LateStaticLibs {
|
||||||
depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
|
||||||
actx.AddVariationDependencies([]blueprint.Variation{
|
actx.AddVariationDependencies([]blueprint.Variation{
|
||||||
@@ -2701,7 +2653,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
updateImportedLibraryDependency(ctx)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func BeginMutator(ctx android.BottomUpMutatorContext) {
|
func BeginMutator(ctx android.BottomUpMutatorContext) {
|
||||||
@@ -2730,10 +2681,6 @@ func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to Lin
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(b/244244438) : Remove this once all variants are implemented
|
|
||||||
if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if from.SdkVersion() == "" {
|
if from.SdkVersion() == "" {
|
||||||
// Platform code can link to anything
|
// Platform code can link to anything
|
||||||
return
|
return
|
||||||
@@ -2756,10 +2703,6 @@ func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to Lin
|
|||||||
// the NDK.
|
// the NDK.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if c.isImportedApiLibrary() {
|
|
||||||
// Imported library from the API surface is a stub library built against interface definition.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
|
if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
|
||||||
@@ -2935,47 +2878,6 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|||||||
|
|
||||||
skipModuleList := map[string]bool{}
|
skipModuleList := map[string]bool{}
|
||||||
|
|
||||||
var apiImportInfo multitree.ApiImportInfo
|
|
||||||
hasApiImportInfo := false
|
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
if dep.Name() == "api_imports" {
|
|
||||||
apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
|
|
||||||
hasApiImportInfo = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if hasApiImportInfo {
|
|
||||||
targetStubModuleList := map[string]string{}
|
|
||||||
targetOrigModuleList := map[string]string{}
|
|
||||||
|
|
||||||
// Search for dependency which both original module and API imported library with APEX stub exists
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
|
|
||||||
targetStubModuleList[apiLibrary] = depName
|
|
||||||
}
|
|
||||||
})
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if origLibrary, ok := targetStubModuleList[depName]; ok {
|
|
||||||
targetOrigModuleList[origLibrary] = depName
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Decide which library should be used between original and API imported library
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if apiLibrary, ok := targetOrigModuleList[depName]; ok {
|
|
||||||
if ShouldUseStubForApex(ctx, dep) {
|
|
||||||
skipModuleList[depName] = true
|
|
||||||
} else {
|
|
||||||
skipModuleList[apiLibrary] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
||||||
depName := ctx.OtherModuleName(dep)
|
depName := ctx.OtherModuleName(dep)
|
||||||
depTag := ctx.OtherModuleDependencyTag(dep)
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
||||||
@@ -3404,17 +3306,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
|
|||||||
// bootstrap modules, always link to non-stub variant
|
// bootstrap modules, always link to non-stub variant
|
||||||
isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
|
isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
|
||||||
|
|
||||||
isApexImportedApiLibrary := false
|
useStubs = isNotInPlatform && !bootstrap
|
||||||
|
|
||||||
if cc, ok := dep.(*Module); ok {
|
|
||||||
if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
|
|
||||||
if apiLibrary.hasApexStubs() {
|
|
||||||
isApexImportedApiLibrary = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
|
|
||||||
|
|
||||||
if useStubs {
|
if useStubs {
|
||||||
// Another exception: if this module is a test for an APEX, then
|
// Another exception: if this module is a test for an APEX, then
|
||||||
@@ -3439,7 +3331,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
|
|||||||
// only partially overlapping apex_available. For that test_for
|
// only partially overlapping apex_available. For that test_for
|
||||||
// modules would need to be split into APEX variants and resolved
|
// modules would need to be split into APEX variants and resolved
|
||||||
// separately for each APEX they have access to.
|
// separately for each APEX they have access to.
|
||||||
if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
|
if android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
|
||||||
useStubs = false
|
useStubs = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4023,11 +3915,6 @@ func (c *Module) IsSdkVariant() bool {
|
|||||||
return c.Properties.IsSdkVariant
|
return c.Properties.IsSdkVariant
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Module) isImportedApiLibrary() bool {
|
|
||||||
_, ok := c.linker.(*apiLibraryDecorator)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func kytheExtractAllFactory() android.Singleton {
|
func kytheExtractAllFactory() android.Singleton {
|
||||||
return &kytheExtractAllSingleton{}
|
return &kytheExtractAllSingleton{}
|
||||||
}
|
}
|
||||||
|
@@ -919,7 +919,7 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
|||||||
return deps
|
return deps
|
||||||
}
|
}
|
||||||
|
|
||||||
func (library *libraryDecorator) linkerSpecifiedDeps(ctx android.ConfigAndErrorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
func (library *libraryDecorator) linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
||||||
specifiedDeps = library.baseLinker.linkerSpecifiedDeps(ctx, module, specifiedDeps)
|
specifiedDeps = library.baseLinker.linkerSpecifiedDeps(ctx, module, specifiedDeps)
|
||||||
var properties StaticOrSharedProperties
|
var properties StaticOrSharedProperties
|
||||||
if library.static() {
|
if library.static() {
|
||||||
@@ -2350,9 +2350,8 @@ func (versionTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, varia
|
|||||||
if library := moduleLibraryInterface(ctx.Module()); library != nil && canBeVersionVariant(m) {
|
if library := moduleLibraryInterface(ctx.Module()); library != nil && canBeVersionVariant(m) {
|
||||||
isLLNDK := m.IsLlndk()
|
isLLNDK := m.IsLlndk()
|
||||||
isVendorPublicLibrary := m.IsVendorPublicLibrary()
|
isVendorPublicLibrary := m.IsVendorPublicLibrary()
|
||||||
isImportedApiLibrary := m.isImportedApiLibrary()
|
|
||||||
|
|
||||||
if variation != "" || isLLNDK || isVendorPublicLibrary || isImportedApiLibrary {
|
if variation != "" || isLLNDK || isVendorPublicLibrary {
|
||||||
// A stubs or LLNDK stubs variant.
|
// A stubs or LLNDK stubs variant.
|
||||||
if m.sanitize != nil {
|
if m.sanitize != nil {
|
||||||
m.sanitize.Properties.ForceDisable = true
|
m.sanitize.Properties.ForceDisable = true
|
||||||
|
@@ -543,7 +543,7 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(ctx android.SdkMemberConte
|
|||||||
p.ExportedFlags = exportedInfo.Flags
|
p.ExportedFlags = exportedInfo.Flags
|
||||||
if ccModule.linker != nil {
|
if ccModule.linker != nil {
|
||||||
specifiedDeps := specifiedDeps{}
|
specifiedDeps := specifiedDeps{}
|
||||||
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(ctx, ccModule, specifiedDeps)
|
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(ctx.SdkModuleContext(), ccModule, specifiedDeps)
|
||||||
|
|
||||||
if lib := ccModule.library; lib != nil {
|
if lib := ccModule.library; lib != nil {
|
||||||
if !lib.hasStubsVariants() {
|
if !lib.hasStubsVariants() {
|
||||||
|
@@ -1,512 +0,0 @@
|
|||||||
// Copyright 2021 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 cc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"android/soong/android"
|
|
||||||
"android/soong/multitree"
|
|
||||||
|
|
||||||
"github.com/google/blueprint/proptools"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ndkVariantRegex = regexp.MustCompile("ndk\\.([a-zA-Z0-9]+)")
|
|
||||||
stubVariantRegex = regexp.MustCompile("apex\\.([a-zA-Z0-9]+)")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RegisterLibraryStubBuildComponents(android.InitRegistrationContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterLibraryStubBuildComponents(ctx android.RegistrationContext) {
|
|
||||||
ctx.RegisterModuleType("cc_api_library", CcApiLibraryFactory)
|
|
||||||
ctx.RegisterModuleType("cc_api_headers", CcApiHeadersFactory)
|
|
||||||
ctx.RegisterModuleType("cc_api_variant", CcApiVariantFactory)
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateImportedLibraryDependency(ctx android.BottomUpMutatorContext) {
|
|
||||||
m, ok := ctx.Module().(*Module)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
apiLibrary, ok := m.linker.(*apiLibraryDecorator)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.InVendorOrProduct() && apiLibrary.hasLLNDKStubs() {
|
|
||||||
// Add LLNDK variant dependency
|
|
||||||
if inList("llndk", apiLibrary.properties.Variants) {
|
|
||||||
variantName := BuildApiVariantName(m.BaseModuleName(), "llndk", "")
|
|
||||||
ctx.AddDependency(m, nil, variantName)
|
|
||||||
}
|
|
||||||
} else if m.IsSdkVariant() {
|
|
||||||
// Add NDK variant dependencies
|
|
||||||
targetVariant := "ndk." + m.StubsVersion()
|
|
||||||
if inList(targetVariant, apiLibrary.properties.Variants) {
|
|
||||||
variantName := BuildApiVariantName(m.BaseModuleName(), targetVariant, "")
|
|
||||||
ctx.AddDependency(m, nil, variantName)
|
|
||||||
}
|
|
||||||
} else if m.IsStubs() {
|
|
||||||
targetVariant := "apex." + m.StubsVersion()
|
|
||||||
if inList(targetVariant, apiLibrary.properties.Variants) {
|
|
||||||
variantName := BuildApiVariantName(m.BaseModuleName(), targetVariant, "")
|
|
||||||
ctx.AddDependency(m, nil, variantName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 'cc_api_library' is a module type which is from the exported API surface
|
|
||||||
// with C shared library type. The module will replace original module, and
|
|
||||||
// offer a link to the module that generates shared library object from the
|
|
||||||
// map file.
|
|
||||||
type apiLibraryProperties struct {
|
|
||||||
Src *string `android:"arch_variant"`
|
|
||||||
Variants []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type apiLibraryDecorator struct {
|
|
||||||
*libraryDecorator
|
|
||||||
properties apiLibraryProperties
|
|
||||||
}
|
|
||||||
|
|
||||||
func CcApiLibraryFactory() android.Module {
|
|
||||||
module, decorator := NewLibrary(android.DeviceSupported)
|
|
||||||
apiLibraryDecorator := &apiLibraryDecorator{
|
|
||||||
libraryDecorator: decorator,
|
|
||||||
}
|
|
||||||
apiLibraryDecorator.BuildOnlyShared()
|
|
||||||
|
|
||||||
module.stl = nil
|
|
||||||
module.sanitize = nil
|
|
||||||
decorator.disableStripping()
|
|
||||||
|
|
||||||
module.compiler = nil
|
|
||||||
module.linker = apiLibraryDecorator
|
|
||||||
module.installer = nil
|
|
||||||
module.library = apiLibraryDecorator
|
|
||||||
module.AddProperties(&module.Properties, &apiLibraryDecorator.properties)
|
|
||||||
|
|
||||||
// Prevent default system libs (libc, libm, and libdl) from being linked
|
|
||||||
if apiLibraryDecorator.baseLinker.Properties.System_shared_libs == nil {
|
|
||||||
apiLibraryDecorator.baseLinker.Properties.System_shared_libs = []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
apiLibraryDecorator.baseLinker.Properties.No_libcrt = BoolPtr(true)
|
|
||||||
apiLibraryDecorator.baseLinker.Properties.Nocrt = BoolPtr(true)
|
|
||||||
|
|
||||||
module.Init()
|
|
||||||
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) Name(basename string) string {
|
|
||||||
return basename + multitree.GetApiImportSuffix()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export include dirs without checking for existence.
|
|
||||||
// The directories are not guaranteed to exist during Soong analysis.
|
|
||||||
func (d *apiLibraryDecorator) exportIncludes(ctx ModuleContext) {
|
|
||||||
exporterProps := d.flagExporter.Properties
|
|
||||||
for _, dir := range exporterProps.Export_include_dirs.GetOrDefault(ctx, nil) {
|
|
||||||
d.dirs = append(d.dirs, android.MaybeExistentPathForSource(ctx, ctx.ModuleDir(), dir))
|
|
||||||
}
|
|
||||||
// system headers
|
|
||||||
for _, dir := range exporterProps.Export_system_include_dirs {
|
|
||||||
d.systemDirs = append(d.systemDirs, android.MaybeExistentPathForSource(ctx, ctx.ModuleDir(), dir))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) linkerInit(ctx BaseModuleContext) {
|
|
||||||
d.baseLinker.linkerInit(ctx)
|
|
||||||
|
|
||||||
if d.hasNDKStubs() {
|
|
||||||
// Set SDK version of module as current
|
|
||||||
ctx.Module().(*Module).Properties.Sdk_version = StringPtr("current")
|
|
||||||
|
|
||||||
// Add NDK stub as NDK known libs
|
|
||||||
name := ctx.ModuleName()
|
|
||||||
|
|
||||||
ndkKnownLibsLock.Lock()
|
|
||||||
ndkKnownLibs := getNDKKnownLibs(ctx.Config())
|
|
||||||
if !inList(name, *ndkKnownLibs) {
|
|
||||||
*ndkKnownLibs = append(*ndkKnownLibs, name)
|
|
||||||
}
|
|
||||||
ndkKnownLibsLock.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps, objects Objects) android.Path {
|
|
||||||
m, _ := ctx.Module().(*Module)
|
|
||||||
|
|
||||||
var in android.Path
|
|
||||||
|
|
||||||
// src might not exist during the beginning of soong analysis in Multi-tree
|
|
||||||
if src := String(d.properties.Src); src != "" {
|
|
||||||
in = android.MaybeExistentPathForSource(ctx, ctx.ModuleDir(), src)
|
|
||||||
}
|
|
||||||
|
|
||||||
libName := m.BaseModuleName() + multitree.GetApiImportSuffix()
|
|
||||||
|
|
||||||
load_cc_variant := func(apiVariantModule string) {
|
|
||||||
var mod android.Module
|
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(depMod android.Module) {
|
|
||||||
if depMod.Name() == apiVariantModule {
|
|
||||||
mod = depMod
|
|
||||||
libName = apiVariantModule
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if mod != nil {
|
|
||||||
variantMod, ok := mod.(*CcApiVariant)
|
|
||||||
if ok {
|
|
||||||
in = variantMod.Src()
|
|
||||||
|
|
||||||
// Copy LLDNK properties to cc_api_library module
|
|
||||||
exportIncludeDirs := append(d.libraryDecorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil),
|
|
||||||
variantMod.exportProperties.Export_include_dirs...)
|
|
||||||
d.libraryDecorator.flagExporter.Properties.Export_include_dirs = proptools.NewConfigurable[[]string](
|
|
||||||
nil,
|
|
||||||
[]proptools.ConfigurableCase[[]string]{
|
|
||||||
proptools.NewConfigurableCase[[]string](nil, &exportIncludeDirs),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Export headers as system include dirs if specified. Mostly for libc
|
|
||||||
if Bool(variantMod.exportProperties.Export_headers_as_system) {
|
|
||||||
d.libraryDecorator.flagExporter.Properties.Export_system_include_dirs = append(
|
|
||||||
d.libraryDecorator.flagExporter.Properties.Export_system_include_dirs,
|
|
||||||
d.libraryDecorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil)...)
|
|
||||||
d.libraryDecorator.flagExporter.Properties.Export_include_dirs = proptools.NewConfigurable[[]string](nil, nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.InVendorOrProduct() && d.hasLLNDKStubs() {
|
|
||||||
// LLNDK variant
|
|
||||||
load_cc_variant(BuildApiVariantName(m.BaseModuleName(), "llndk", ""))
|
|
||||||
} else if m.IsSdkVariant() {
|
|
||||||
// NDK Variant
|
|
||||||
load_cc_variant(BuildApiVariantName(m.BaseModuleName(), "ndk", m.StubsVersion()))
|
|
||||||
} else if m.IsStubs() {
|
|
||||||
// APEX Variant
|
|
||||||
load_cc_variant(BuildApiVariantName(m.BaseModuleName(), "apex", m.StubsVersion()))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flags reexported from dependencies. (e.g. vndk_prebuilt_shared)
|
|
||||||
d.exportIncludes(ctx)
|
|
||||||
d.libraryDecorator.reexportDirs(deps.ReexportedDirs...)
|
|
||||||
d.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...)
|
|
||||||
d.libraryDecorator.reexportFlags(deps.ReexportedFlags...)
|
|
||||||
d.libraryDecorator.reexportDeps(deps.ReexportedDeps...)
|
|
||||||
d.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
|
|
||||||
|
|
||||||
if in == nil {
|
|
||||||
ctx.PropertyErrorf("src", "Unable to locate source property")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make the _compilation_ of rdeps have an order-only dep on cc_api_library.src (an .so file)
|
|
||||||
// The .so file itself has an order-only dependency on the headers contributed by this library.
|
|
||||||
// Creating this dependency ensures that the headers are assembled before compilation of rdeps begins.
|
|
||||||
d.libraryDecorator.reexportDeps(in)
|
|
||||||
d.libraryDecorator.flagExporter.setProvider(ctx)
|
|
||||||
|
|
||||||
d.unstrippedOutputFile = in
|
|
||||||
libName += flags.Toolchain.ShlibSuffix()
|
|
||||||
|
|
||||||
tocFile := android.PathForModuleOut(ctx, libName+".toc")
|
|
||||||
d.tocFile = android.OptionalPathForPath(tocFile)
|
|
||||||
TransformSharedObjectToToc(ctx, in, tocFile)
|
|
||||||
|
|
||||||
outputFile := android.PathForModuleOut(ctx, libName)
|
|
||||||
|
|
||||||
// TODO(b/270485584) This copies with a new name, just to avoid conflict with prebuilts.
|
|
||||||
// We can just use original input if there is any way to avoid name conflict without copy.
|
|
||||||
ctx.Build(pctx, android.BuildParams{
|
|
||||||
Rule: android.Cp,
|
|
||||||
Description: "API surface imported library",
|
|
||||||
Input: in,
|
|
||||||
Output: outputFile,
|
|
||||||
Args: map[string]string{
|
|
||||||
"cpFlags": "-L",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{
|
|
||||||
SharedLibrary: outputFile,
|
|
||||||
Target: ctx.Target(),
|
|
||||||
|
|
||||||
TableOfContents: d.tocFile,
|
|
||||||
})
|
|
||||||
|
|
||||||
d.shareStubs(ctx)
|
|
||||||
|
|
||||||
return outputFile
|
|
||||||
}
|
|
||||||
|
|
||||||
// Share additional information about stub libraries with provider
|
|
||||||
func (d *apiLibraryDecorator) shareStubs(ctx ModuleContext) {
|
|
||||||
stubs := ctx.GetDirectDepsWithTag(stubImplDepTag)
|
|
||||||
if len(stubs) > 0 {
|
|
||||||
var stubsInfo []SharedStubLibrary
|
|
||||||
for _, stub := range stubs {
|
|
||||||
stubInfo, _ := android.OtherModuleProvider(ctx, stub, SharedLibraryInfoProvider)
|
|
||||||
flagInfo, _ := android.OtherModuleProvider(ctx, stub, FlagExporterInfoProvider)
|
|
||||||
stubsInfo = append(stubsInfo, SharedStubLibrary{
|
|
||||||
Version: moduleLibraryInterface(stub).stubsVersion(),
|
|
||||||
SharedLibraryInfo: stubInfo,
|
|
||||||
FlagExporterInfo: flagInfo,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
android.SetProvider(ctx, SharedLibraryStubsProvider, SharedLibraryStubsInfo{
|
|
||||||
SharedStubLibraries: stubsInfo,
|
|
||||||
|
|
||||||
IsLLNDK: ctx.IsLlndk(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) availableFor(what string) bool {
|
|
||||||
// Stub from API surface should be available for any APEX.
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) hasApexStubs() bool {
|
|
||||||
for _, variant := range d.properties.Variants {
|
|
||||||
if strings.HasPrefix(variant, "apex") {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) hasStubsVariants() bool {
|
|
||||||
return d.hasApexStubs()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) stubsVersions(ctx android.BaseModuleContext) []string {
|
|
||||||
m, ok := ctx.Module().(*Module)
|
|
||||||
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(b/244244438) Create more version information for NDK and APEX variations
|
|
||||||
// NDK variants
|
|
||||||
if m.IsSdkVariant() {
|
|
||||||
// TODO(b/249193999) Do not check if module has NDK stubs once all NDK cc_api_library contains ndk variant of cc_api_variant.
|
|
||||||
if d.hasNDKStubs() {
|
|
||||||
return d.getNdkVersions()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.hasLLNDKStubs() && m.InVendorOrProduct() {
|
|
||||||
// LLNDK libraries only need a single stubs variant.
|
|
||||||
return []string{android.FutureApiLevel.String()}
|
|
||||||
}
|
|
||||||
|
|
||||||
stubsVersions := d.getStubVersions()
|
|
||||||
|
|
||||||
if len(stubsVersions) != 0 {
|
|
||||||
return stubsVersions
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.MinSdkVersion() == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
firstVersion, err := nativeApiLevelFromUser(ctx,
|
|
||||||
m.MinSdkVersion())
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return ndkLibraryVersions(ctx, firstVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) hasLLNDKStubs() bool {
|
|
||||||
return inList("llndk", d.properties.Variants)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) hasNDKStubs() bool {
|
|
||||||
for _, variant := range d.properties.Variants {
|
|
||||||
if ndkVariantRegex.MatchString(variant) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) getNdkVersions() []string {
|
|
||||||
ndkVersions := []string{}
|
|
||||||
|
|
||||||
for _, variant := range d.properties.Variants {
|
|
||||||
if match := ndkVariantRegex.FindStringSubmatch(variant); len(match) == 2 {
|
|
||||||
ndkVersions = append(ndkVersions, match[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ndkVersions
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiLibraryDecorator) getStubVersions() []string {
|
|
||||||
stubVersions := []string{}
|
|
||||||
|
|
||||||
for _, variant := range d.properties.Variants {
|
|
||||||
if match := stubVariantRegex.FindStringSubmatch(variant); len(match) == 2 {
|
|
||||||
stubVersions = append(stubVersions, match[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stubVersions
|
|
||||||
}
|
|
||||||
|
|
||||||
// 'cc_api_headers' is similar with 'cc_api_library', but which replaces
|
|
||||||
// header libraries. The module will replace any dependencies to existing
|
|
||||||
// original header libraries.
|
|
||||||
type apiHeadersDecorator struct {
|
|
||||||
*libraryDecorator
|
|
||||||
}
|
|
||||||
|
|
||||||
func CcApiHeadersFactory() android.Module {
|
|
||||||
module, decorator := NewLibrary(android.DeviceSupported)
|
|
||||||
apiHeadersDecorator := &apiHeadersDecorator{
|
|
||||||
libraryDecorator: decorator,
|
|
||||||
}
|
|
||||||
apiHeadersDecorator.HeaderOnly()
|
|
||||||
|
|
||||||
module.stl = nil
|
|
||||||
module.sanitize = nil
|
|
||||||
decorator.disableStripping()
|
|
||||||
|
|
||||||
module.compiler = nil
|
|
||||||
module.linker = apiHeadersDecorator
|
|
||||||
module.installer = nil
|
|
||||||
|
|
||||||
// Prevent default system libs (libc, libm, and libdl) from being linked
|
|
||||||
if apiHeadersDecorator.baseLinker.Properties.System_shared_libs == nil {
|
|
||||||
apiHeadersDecorator.baseLinker.Properties.System_shared_libs = []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
apiHeadersDecorator.baseLinker.Properties.No_libcrt = BoolPtr(true)
|
|
||||||
apiHeadersDecorator.baseLinker.Properties.Nocrt = BoolPtr(true)
|
|
||||||
|
|
||||||
module.Init()
|
|
||||||
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiHeadersDecorator) Name(basename string) string {
|
|
||||||
return basename + multitree.GetApiImportSuffix()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *apiHeadersDecorator) availableFor(what string) bool {
|
|
||||||
// Stub from API surface should be available for any APEX.
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
type ccApiexportProperties struct {
|
|
||||||
Src *string `android:"arch_variant"`
|
|
||||||
Variant *string
|
|
||||||
Version *string
|
|
||||||
}
|
|
||||||
|
|
||||||
type variantExporterProperties struct {
|
|
||||||
// Header directory to export
|
|
||||||
Export_include_dirs []string `android:"arch_variant"`
|
|
||||||
|
|
||||||
// Export all headers as system include
|
|
||||||
Export_headers_as_system *bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type CcApiVariant struct {
|
|
||||||
android.ModuleBase
|
|
||||||
|
|
||||||
properties ccApiexportProperties
|
|
||||||
exportProperties variantExporterProperties
|
|
||||||
|
|
||||||
src android.Path
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ android.Module = (*CcApiVariant)(nil)
|
|
||||||
var _ android.ImageInterface = (*CcApiVariant)(nil)
|
|
||||||
|
|
||||||
func CcApiVariantFactory() android.Module {
|
|
||||||
module := &CcApiVariant{}
|
|
||||||
|
|
||||||
module.AddProperties(&module.properties)
|
|
||||||
module.AddProperties(&module.exportProperties)
|
|
||||||
|
|
||||||
android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *CcApiVariant) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
||||||
// No need to build
|
|
||||||
|
|
||||||
if String(v.properties.Src) == "" {
|
|
||||||
ctx.PropertyErrorf("src", "src is a required property")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip the existence check of the stub prebuilt file.
|
|
||||||
// The file is not guaranteed to exist during Soong analysis.
|
|
||||||
// Build orchestrator will be responsible for creating a connected ninja graph.
|
|
||||||
v.src = android.MaybeExistentPathForSource(ctx, ctx.ModuleDir(), String(v.properties.Src))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *CcApiVariant) Name() string {
|
|
||||||
version := String(v.properties.Version)
|
|
||||||
return BuildApiVariantName(v.BaseModuleName(), *v.properties.Variant, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *CcApiVariant) Src() android.Path {
|
|
||||||
return v.src
|
|
||||||
}
|
|
||||||
|
|
||||||
func BuildApiVariantName(baseName string, variant string, version string) string {
|
|
||||||
names := []string{baseName, variant}
|
|
||||||
if version != "" {
|
|
||||||
names = append(names, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Join(names[:], ".") + multitree.GetApiImportSuffix()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implement ImageInterface to generate image variants
|
|
||||||
func (v *CcApiVariant) ImageMutatorBegin(ctx android.BaseModuleContext) {}
|
|
||||||
func (v *CcApiVariant) VendorVariantNeeded(ctx android.BaseModuleContext) bool {
|
|
||||||
return String(v.properties.Variant) == "llndk"
|
|
||||||
}
|
|
||||||
func (v *CcApiVariant) ProductVariantNeeded(ctx android.BaseModuleContext) bool {
|
|
||||||
return String(v.properties.Variant) == "llndk"
|
|
||||||
}
|
|
||||||
func (v *CcApiVariant) CoreVariantNeeded(ctx android.BaseModuleContext) bool {
|
|
||||||
return inList(String(v.properties.Variant), []string{"ndk", "apex"})
|
|
||||||
}
|
|
||||||
func (v *CcApiVariant) RamdiskVariantNeeded(ctx android.BaseModuleContext) bool { return false }
|
|
||||||
func (v *CcApiVariant) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { return false }
|
|
||||||
func (v *CcApiVariant) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { return false }
|
|
||||||
func (v *CcApiVariant) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return false }
|
|
||||||
func (v *CcApiVariant) ExtraImageVariations(ctx android.BaseModuleContext) []string { return nil }
|
|
||||||
func (v *CcApiVariant) SetImageVariation(ctx android.BaseModuleContext, variation string) {
|
|
||||||
}
|
|
@@ -645,7 +645,7 @@ func (linker *baseLinker) link(ctx ModuleContext,
|
|||||||
panic(fmt.Errorf("baseLinker doesn't know how to link"))
|
panic(fmt.Errorf("baseLinker doesn't know how to link"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (linker *baseLinker) linkerSpecifiedDeps(ctx android.ConfigAndErrorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
func (linker *baseLinker) linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
||||||
eval := module.ConfigurableEvaluator(ctx)
|
eval := module.ConfigurableEvaluator(ctx)
|
||||||
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, linker.Properties.Shared_libs.GetOrDefault(eval, nil)...)
|
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, linker.Properties.Shared_libs.GetOrDefault(eval, nil)...)
|
||||||
|
|
||||||
|
@@ -203,7 +203,7 @@ func (object *objectLinker) link(ctx ModuleContext,
|
|||||||
return outputFile
|
return outputFile
|
||||||
}
|
}
|
||||||
|
|
||||||
func (object *objectLinker) linkerSpecifiedDeps(ctx android.ConfigAndErrorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
func (object *objectLinker) linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps {
|
||||||
eval := module.ConfigurableEvaluator(ctx)
|
eval := module.ConfigurableEvaluator(ctx)
|
||||||
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, object.Properties.Shared_libs.GetOrDefault(eval, nil)...)
|
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, object.Properties.Shared_libs.GetOrDefault(eval, nil)...)
|
||||||
|
|
||||||
|
12
cc/sdk.go
12
cc/sdk.go
@@ -51,13 +51,6 @@ func (sdkTransitionMutator) Split(ctx android.BaseModuleContext) []string {
|
|||||||
return []string{""}
|
return []string{""}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case *CcApiVariant:
|
|
||||||
ccApiVariant, _ := ctx.Module().(*CcApiVariant)
|
|
||||||
if String(ccApiVariant.properties.Variant) == "ndk" {
|
|
||||||
return []string{"sdk"}
|
|
||||||
} else {
|
|
||||||
return []string{""}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return []string{""}
|
return []string{""}
|
||||||
@@ -84,11 +77,6 @@ func (sdkTransitionMutator) IncomingTransition(ctx android.IncomingTransitionCon
|
|||||||
return incomingVariation
|
return incomingVariation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case *CcApiVariant:
|
|
||||||
ccApiVariant, _ := ctx.Module().(*CcApiVariant)
|
|
||||||
if String(ccApiVariant.properties.Variant) == "ndk" {
|
|
||||||
return "sdk"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.IsAddingDependency() {
|
if ctx.IsAddingDependency() {
|
||||||
|
@@ -20,7 +20,6 @@ import (
|
|||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
"android/soong/genrule"
|
"android/soong/genrule"
|
||||||
"android/soong/multitree"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
|
func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
|
||||||
@@ -29,9 +28,6 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
|
|||||||
RegisterBinaryBuildComponents(ctx)
|
RegisterBinaryBuildComponents(ctx)
|
||||||
RegisterLibraryBuildComponents(ctx)
|
RegisterLibraryBuildComponents(ctx)
|
||||||
RegisterLibraryHeadersBuildComponents(ctx)
|
RegisterLibraryHeadersBuildComponents(ctx)
|
||||||
RegisterLibraryStubBuildComponents(ctx)
|
|
||||||
|
|
||||||
multitree.RegisterApiImportsModule(ctx)
|
|
||||||
|
|
||||||
ctx.RegisterModuleType("prebuilt_build_tool", android.NewPrebuiltBuildTool)
|
ctx.RegisterModuleType("prebuilt_build_tool", android.NewPrebuiltBuildTool)
|
||||||
ctx.RegisterModuleType("cc_benchmark", BenchmarkFactory)
|
ctx.RegisterModuleType("cc_benchmark", BenchmarkFactory)
|
||||||
|
1
docs/OWNERS
Normal file
1
docs/OWNERS
Normal file
@@ -0,0 +1 @@
|
|||||||
|
per-file map_files.md = danalbert@google.com
|
@@ -88,12 +88,17 @@ but is useful when developing APIs for an unknown future release.
|
|||||||
|
|
||||||
### introduced
|
### introduced
|
||||||
|
|
||||||
Indicates the version in which an API was first introduced. For example,
|
Indicates the version in which an API was first introduced in the NDK. For
|
||||||
`introduced=21` specifies that the API was first added (or first made public) in
|
example, `introduced=21` specifies that the API was first added (or first made
|
||||||
API level 21. This tag can be applied to either a version definition or an
|
public) in API level 21. This tag can be applied to either a version definition
|
||||||
individual symbol. If applied to a version, all symbols contained in the version
|
or an individual symbol. If applied to a version, all symbols contained in the
|
||||||
will have the tag applied. An `introduced` tag on a symbol overrides the value
|
version will have the tag applied. An `introduced` tag on a symbol overrides the
|
||||||
set for the version, if both are defined.
|
value set for the version, if both are defined.
|
||||||
|
|
||||||
|
The `introduced` tag should only be used with NDK APIs. Other API surface tags
|
||||||
|
(such as `apex`) will override `introduced`. APIs that are in the NDK should
|
||||||
|
never use tags like `apex`, and APIs that are not in the NDK should never use
|
||||||
|
`introduced`.
|
||||||
|
|
||||||
Note: The map file alone does not contain all the information needed to
|
Note: The map file alone does not contain all the information needed to
|
||||||
determine which API level an API was added in. The `first_version` property of
|
determine which API level an API was added in. The `first_version` property of
|
||||||
|
@@ -136,9 +136,6 @@ type filesystemProperties struct {
|
|||||||
// Install aconfig_flags.pb file for the modules installed in this partition.
|
// Install aconfig_flags.pb file for the modules installed in this partition.
|
||||||
Gen_aconfig_flags_pb *bool
|
Gen_aconfig_flags_pb *bool
|
||||||
|
|
||||||
// Update the Base_dir of the $PRODUCT_OUT directory with the packaging files.
|
|
||||||
Update_product_out *bool
|
|
||||||
|
|
||||||
Fsverity fsverityProperties
|
Fsverity fsverityProperties
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,7 +332,7 @@ func (f *filesystem) copyPackagingSpecs(ctx android.ModuleContext, builder *andr
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *filesystem) copyFilesToProductOut(ctx android.ModuleContext, builder *android.RuleBuilder, rebasedDir android.OutputPath) {
|
func (f *filesystem) copyFilesToProductOut(ctx android.ModuleContext, builder *android.RuleBuilder, rebasedDir android.OutputPath) {
|
||||||
if !proptools.Bool(f.properties.Update_product_out) {
|
if f.Name() != ctx.Config().SoongDefinedSystemImage() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
installPath := android.PathForModuleInPartitionInstall(ctx, f.partitionName())
|
installPath := android.PathForModuleInPartitionInstall(ctx, f.partitionName())
|
||||||
|
@@ -213,6 +213,7 @@ func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
ctx.InstallFile(v.installDir, v.installFileName(), v.output)
|
ctx.InstallFile(v.installDir, v.installFileName(), v.output)
|
||||||
|
|
||||||
ctx.SetOutputFiles([]android.Path{v.output}, "")
|
ctx.SetOutputFiles([]android.Path{v.output}, "")
|
||||||
|
android.SetProvider(ctx, android.AndroidMkInfoProvider, v.prepareAndroidMKProviderInfo())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the embedded shell command that prints the rollback index
|
// Returns the embedded shell command that prints the rollback index
|
||||||
@@ -265,20 +266,17 @@ func (v *vbmeta) extractPublicKeys(ctx android.ModuleContext) map[string]android
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ android.AndroidMkEntriesProvider = (*vbmeta)(nil)
|
func (v *vbmeta) prepareAndroidMKProviderInfo() *android.AndroidMkProviderInfo {
|
||||||
|
providerData := android.AndroidMkProviderInfo{
|
||||||
// Implements android.AndroidMkEntriesProvider
|
PrimaryInfo: android.AndroidMkInfo{
|
||||||
func (v *vbmeta) AndroidMkEntries() []android.AndroidMkEntries {
|
|
||||||
return []android.AndroidMkEntries{android.AndroidMkEntries{
|
|
||||||
Class: "ETC",
|
Class: "ETC",
|
||||||
OutputFile: android.OptionalPathForPath(v.output),
|
OutputFile: android.OptionalPathForPath(v.output),
|
||||||
ExtraEntries: []android.AndroidMkExtraEntriesFunc{
|
EntryMap: make(map[string][]string),
|
||||||
func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
|
|
||||||
entries.SetString("LOCAL_MODULE_PATH", v.installDir.String())
|
|
||||||
entries.SetString("LOCAL_INSTALLED_MODULE_STEM", v.installFileName())
|
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
}}
|
providerData.PrimaryInfo.SetString("LOCAL_MODULE_PATH", v.installDir.String())
|
||||||
|
providerData.PrimaryInfo.SetString("LOCAL_INSTALLED_MODULE_STEM", v.installFileName())
|
||||||
|
return &providerData
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Filesystem = (*vbmeta)(nil)
|
var _ Filesystem = (*vbmeta)(nil)
|
||||||
|
@@ -449,7 +449,7 @@ func IsValidFrameworkForModule(targetFramework Framework, lang Lang, moduleFrame
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsValid(ctx android.ConfigAndErrorContext, fuzzModule FuzzModule) bool {
|
func IsValid(ctx android.ConfigurableEvaluatorContext, fuzzModule FuzzModule) bool {
|
||||||
// Discard ramdisk + vendor_ramdisk + recovery modules, they're duplicates of
|
// Discard ramdisk + vendor_ramdisk + recovery modules, they're duplicates of
|
||||||
// fuzz targets we're going to package anyway.
|
// fuzz targets we're going to package anyway.
|
||||||
if !fuzzModule.Enabled(ctx) || fuzzModule.InRamdisk() || fuzzModule.InVendorRamdisk() || fuzzModule.InRecovery() {
|
if !fuzzModule.Enabled(ctx) || fuzzModule.InRamdisk() || fuzzModule.InVendorRamdisk() || fuzzModule.InRecovery() {
|
||||||
|
@@ -25,7 +25,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/bootstrap"
|
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
@@ -365,11 +364,6 @@ func (g *Module) generateCommonBuildActions(ctx android.ModuleContext) {
|
|||||||
tools = append(tools, path.Path())
|
tools = append(tools, path.Path())
|
||||||
addLocationLabel(tag.label, toolLocation{android.Paths{path.Path()}})
|
addLocationLabel(tag.label, toolLocation{android.Paths{path.Path()}})
|
||||||
}
|
}
|
||||||
case bootstrap.GoBinaryTool:
|
|
||||||
// A GoBinaryTool provides the install path to a tool, which will be copied.
|
|
||||||
p := android.PathForGoBinary(ctx, t)
|
|
||||||
tools = append(tools, p)
|
|
||||||
addLocationLabel(tag.label, toolLocation{android.Paths{p}})
|
|
||||||
default:
|
default:
|
||||||
ctx.ModuleErrorf("%q is not a host tool provider", tool)
|
ctx.ModuleErrorf("%q is not a host tool provider", tool)
|
||||||
return
|
return
|
||||||
|
22
golang/Android.bp
Normal file
22
golang/Android.bp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package {
|
||||||
|
default_applicable_licenses: ["Android-Apache-2.0"],
|
||||||
|
}
|
||||||
|
|
||||||
|
bootstrap_go_package {
|
||||||
|
name: "soong-golang",
|
||||||
|
pkgPath: "android/soong/golang",
|
||||||
|
deps: [
|
||||||
|
"blueprint",
|
||||||
|
"blueprint-pathtools",
|
||||||
|
"blueprint-bootstrap",
|
||||||
|
"soong",
|
||||||
|
"soong-android",
|
||||||
|
],
|
||||||
|
srcs: [
|
||||||
|
"golang.go",
|
||||||
|
],
|
||||||
|
testSrcs: [
|
||||||
|
"golang_test.go",
|
||||||
|
],
|
||||||
|
pluginFor: ["soong_build"],
|
||||||
|
}
|
122
golang/golang.go
Normal file
122
golang/golang.go
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
// Copyright 2024 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 golang wraps the blueprint blueprint_go_binary and bootstrap_go_binary module types in versions
|
||||||
|
// that implement android.Module that are used when building in Soong. This simplifies the code in Soong
|
||||||
|
// so it can always assume modules are an android.Module.
|
||||||
|
// The original blueprint blueprint_go_binary and bootstrap_go_binary module types are still used during
|
||||||
|
// bootstrapping, so the Android.bp entries for these module types must be compatible with both the
|
||||||
|
// original blueprint module types and these wrapped module types.
|
||||||
|
package golang
|
||||||
|
|
||||||
|
import (
|
||||||
|
"android/soong/android"
|
||||||
|
"github.com/google/blueprint"
|
||||||
|
"github.com/google/blueprint/bootstrap"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Wrap the blueprint Go module types with Soong ones that interoperate with the rest of the Soong modules.
|
||||||
|
bootstrap.GoModuleTypesAreWrapped()
|
||||||
|
RegisterGoModuleTypes(android.InitRegistrationContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterGoModuleTypes(ctx android.RegistrationContext) {
|
||||||
|
ctx.RegisterModuleType("bootstrap_go_package", goPackageModuleFactory)
|
||||||
|
ctx.RegisterModuleType("blueprint_go_binary", goBinaryModuleFactory)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A GoPackage is a module for building Go packages.
|
||||||
|
type GoPackage struct {
|
||||||
|
android.ModuleBase
|
||||||
|
bootstrap.GoPackage
|
||||||
|
}
|
||||||
|
|
||||||
|
func goPackageModuleFactory() android.Module {
|
||||||
|
module := &GoPackage{}
|
||||||
|
module.AddProperties(module.Properties()...)
|
||||||
|
android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoPackage) GenerateBuildActions(ctx blueprint.ModuleContext) {
|
||||||
|
// The embedded ModuleBase and bootstrap.GoPackage each implement GenerateBuildActions,
|
||||||
|
// the delegation has to be implemented manually to disambiguate. Call ModuleBase's
|
||||||
|
// GenerateBuildActions, which will call GenerateAndroidBuildActions, which will call
|
||||||
|
// bootstrap.GoPackage.GenerateBuildActions.
|
||||||
|
g.ModuleBase.GenerateBuildActions(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoPackage) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||||
|
g.GoPackage.GenerateBuildActions(ctx.BlueprintModuleContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// A GoBinary is a module for building executable binaries from Go sources.
|
||||||
|
type GoBinary struct {
|
||||||
|
android.ModuleBase
|
||||||
|
bootstrap.GoBinary
|
||||||
|
|
||||||
|
outputFile android.Path
|
||||||
|
}
|
||||||
|
|
||||||
|
func goBinaryModuleFactory() android.Module {
|
||||||
|
module := &GoBinary{}
|
||||||
|
module.AddProperties(module.Properties()...)
|
||||||
|
android.InitAndroidArchModule(module, android.HostSupportedNoCross, android.MultilibFirst)
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoBinary) GenerateBuildActions(ctx blueprint.ModuleContext) {
|
||||||
|
// The embedded ModuleBase and bootstrap.GoBinary each implement GenerateBuildActions,
|
||||||
|
// the delegation has to be implemented manually to disambiguate. Call ModuleBase's
|
||||||
|
// GenerateBuildActions, which will call GenerateAndroidBuildActions, which will call
|
||||||
|
// bootstrap.GoBinary.GenerateBuildActions.
|
||||||
|
g.ModuleBase.GenerateBuildActions(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||||
|
// Install the file in Soong instead of blueprint so that Soong knows about the install rules.
|
||||||
|
g.GoBinary.SetSkipInstall()
|
||||||
|
|
||||||
|
// Run the build actions from the wrapped blueprint bootstrap module.
|
||||||
|
g.GoBinary.GenerateBuildActions(ctx.BlueprintModuleContext())
|
||||||
|
|
||||||
|
// Translate the bootstrap module's string path into a Path
|
||||||
|
outputFile := android.PathForArbitraryOutput(ctx, android.Rel(ctx, ctx.Config().OutDir(), g.IntermediateFile())).WithoutRel()
|
||||||
|
g.outputFile = outputFile
|
||||||
|
|
||||||
|
installPath := ctx.InstallFile(android.PathForModuleInstall(ctx, "bin"), ctx.ModuleName(), outputFile)
|
||||||
|
|
||||||
|
if !ctx.Config().KatiEnabled() || g.ExportedToMake() {
|
||||||
|
// Modules in an unexported namespace have no install rule, only add modules in the exported namespaces
|
||||||
|
// to the blueprint_tools phony rules.
|
||||||
|
ctx.Phony("blueprint_tools", installPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.SetOutputFiles(android.Paths{outputFile}, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoBinary) HostToolPath() android.OptionalPath {
|
||||||
|
return android.OptionalPathForPath(g.outputFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GoBinary) AndroidMkEntries() []android.AndroidMkEntries {
|
||||||
|
return []android.AndroidMkEntries{
|
||||||
|
{
|
||||||
|
Class: "EXECUTABLES",
|
||||||
|
OutputFile: android.OptionalPathForPath(g.outputFile),
|
||||||
|
Include: "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
51
golang/golang_test.go
Normal file
51
golang/golang_test.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
// Copyright 2024 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 golang
|
||||||
|
|
||||||
|
import (
|
||||||
|
"android/soong/android"
|
||||||
|
"github.com/google/blueprint/bootstrap"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGolang(t *testing.T) {
|
||||||
|
bp := `
|
||||||
|
bootstrap_go_package {
|
||||||
|
name: "gopkg",
|
||||||
|
pkgPath: "test/pkg",
|
||||||
|
}
|
||||||
|
|
||||||
|
blueprint_go_binary {
|
||||||
|
name: "gobin",
|
||||||
|
deps: ["gopkg"],
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
result := android.GroupFixturePreparers(
|
||||||
|
android.PrepareForTestWithArchMutator,
|
||||||
|
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
|
||||||
|
RegisterGoModuleTypes(ctx)
|
||||||
|
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||||
|
ctx.BottomUpBlueprint("bootstrap_deps", bootstrap.BootstrapDeps)
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
).RunTestWithBp(t, bp)
|
||||||
|
|
||||||
|
bin := result.ModuleForTests("gobin", result.Config.BuildOSTarget.String())
|
||||||
|
|
||||||
|
expected := filepath.Join("out/soong/host", result.Config.PrebuiltOS(), "bin/go/gobin/obj/gobin")
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "output files", []string{expected}, bin.OutputFiles(result.TestContext, t, ""))
|
||||||
|
}
|
@@ -536,6 +536,7 @@ type Module struct {
|
|||||||
|
|
||||||
// list of the xref extraction files
|
// list of the xref extraction files
|
||||||
kytheFiles android.Paths
|
kytheFiles android.Paths
|
||||||
|
kytheKotlinFiles android.Paths
|
||||||
|
|
||||||
hideApexVariantFromMake bool
|
hideApexVariantFromMake bool
|
||||||
|
|
||||||
@@ -1370,7 +1371,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
|
|||||||
|
|
||||||
kotlinJar := android.PathForModuleOut(ctx, "kotlin", jarName)
|
kotlinJar := android.PathForModuleOut(ctx, "kotlin", jarName)
|
||||||
kotlinHeaderJar := android.PathForModuleOut(ctx, "kotlin_headers", jarName)
|
kotlinHeaderJar := android.PathForModuleOut(ctx, "kotlin_headers", jarName)
|
||||||
kotlinCompile(ctx, kotlinJar, kotlinHeaderJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags)
|
j.kotlinCompile(ctx, kotlinJar, kotlinHeaderJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags)
|
||||||
if ctx.Failed() {
|
if ctx.Failed() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ import (
|
|||||||
// isActiveModule returns true if the given module should be considered for boot
|
// isActiveModule returns true if the given module should be considered for boot
|
||||||
// jars, i.e. if it's enabled and the preferred one in case of source and
|
// jars, i.e. if it's enabled and the preferred one in case of source and
|
||||||
// prebuilt alternatives.
|
// prebuilt alternatives.
|
||||||
func isActiveModule(ctx android.ConfigAndErrorContext, module android.Module) bool {
|
func isActiveModule(ctx android.ConfigurableEvaluatorContext, module android.Module) bool {
|
||||||
if !module.Enabled(ctx) {
|
if !module.Enabled(ctx) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@@ -145,6 +145,7 @@ func init() {
|
|||||||
pctx.SourcePathVariable("JmodCmd", "${JavaToolchain}/jmod")
|
pctx.SourcePathVariable("JmodCmd", "${JavaToolchain}/jmod")
|
||||||
pctx.SourcePathVariable("JrtFsJar", "${JavaHome}/lib/jrt-fs.jar")
|
pctx.SourcePathVariable("JrtFsJar", "${JavaHome}/lib/jrt-fs.jar")
|
||||||
pctx.SourcePathVariable("JavaKytheExtractorJar", "prebuilts/build-tools/common/framework/javac_extractor.jar")
|
pctx.SourcePathVariable("JavaKytheExtractorJar", "prebuilts/build-tools/common/framework/javac_extractor.jar")
|
||||||
|
pctx.SourcePathVariable("KotlinKytheExtractor", "prebuilts/build-tools/${hostPrebuiltTag}/bin/kotlinc_extractor")
|
||||||
pctx.SourcePathVariable("Ziptime", "prebuilts/build-tools/${hostPrebuiltTag}/bin/ziptime")
|
pctx.SourcePathVariable("Ziptime", "prebuilts/build-tools/${hostPrebuiltTag}/bin/ziptime")
|
||||||
|
|
||||||
pctx.SourcePathVariable("ResourceProcessorBusyBox", "prebuilts/bazel/common/android_tools/android_tools/all_android_tools_deploy.jar")
|
pctx.SourcePathVariable("ResourceProcessorBusyBox", "prebuilts/bazel/common/android_tools/android_tools/all_android_tools_deploy.jar")
|
||||||
|
10
java/java.go
10
java/java.go
@@ -356,12 +356,17 @@ type UsesLibraryDependency interface {
|
|||||||
// TODO(jungjw): Move this to kythe.go once it's created.
|
// TODO(jungjw): Move this to kythe.go once it's created.
|
||||||
type xref interface {
|
type xref interface {
|
||||||
XrefJavaFiles() android.Paths
|
XrefJavaFiles() android.Paths
|
||||||
|
XrefKotlinFiles() android.Paths
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *Module) XrefJavaFiles() android.Paths {
|
func (j *Module) XrefJavaFiles() android.Paths {
|
||||||
return j.kytheFiles
|
return j.kytheFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *Module) XrefKotlinFiles() android.Paths {
|
||||||
|
return j.kytheKotlinFiles
|
||||||
|
}
|
||||||
|
|
||||||
func (d dependencyTag) PropagateAconfigValidation() bool {
|
func (d dependencyTag) PropagateAconfigValidation() bool {
|
||||||
return d.static
|
return d.static
|
||||||
}
|
}
|
||||||
@@ -3304,15 +3309,20 @@ type kytheExtractJavaSingleton struct {
|
|||||||
|
|
||||||
func (ks *kytheExtractJavaSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
func (ks *kytheExtractJavaSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
||||||
var xrefTargets android.Paths
|
var xrefTargets android.Paths
|
||||||
|
var xrefKotlinTargets android.Paths
|
||||||
ctx.VisitAllModules(func(module android.Module) {
|
ctx.VisitAllModules(func(module android.Module) {
|
||||||
if javaModule, ok := module.(xref); ok {
|
if javaModule, ok := module.(xref); ok {
|
||||||
xrefTargets = append(xrefTargets, javaModule.XrefJavaFiles()...)
|
xrefTargets = append(xrefTargets, javaModule.XrefJavaFiles()...)
|
||||||
|
xrefKotlinTargets = append(xrefKotlinTargets, javaModule.XrefKotlinFiles()...)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// TODO(asmundak): perhaps emit a rule to output a warning if there were no xrefTargets
|
// TODO(asmundak): perhaps emit a rule to output a warning if there were no xrefTargets
|
||||||
if len(xrefTargets) > 0 {
|
if len(xrefTargets) > 0 {
|
||||||
ctx.Phony("xref_java", xrefTargets...)
|
ctx.Phony("xref_java", xrefTargets...)
|
||||||
}
|
}
|
||||||
|
if len(xrefKotlinTargets) > 0 {
|
||||||
|
ctx.Phony("xref_kotlin", xrefKotlinTargets...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var Bool = proptools.Bool
|
var Bool = proptools.Bool
|
||||||
|
@@ -2674,7 +2674,7 @@ func TestDisableFromTextStubForCoverageBuild(t *testing.T) {
|
|||||||
android.AssertBoolEquals(t, "stub module expected to depend on from-source stub",
|
android.AssertBoolEquals(t, "stub module expected to depend on from-source stub",
|
||||||
true, CheckModuleHasDependency(t, result.TestContext,
|
true, CheckModuleHasDependency(t, result.TestContext,
|
||||||
apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
|
apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
|
||||||
apiScopePublic.sourceStubLibraryModuleName("foo")))
|
apiScopePublic.sourceStubsLibraryModuleName("foo")))
|
||||||
|
|
||||||
android.AssertBoolEquals(t, "stub module expected to not depend on from-text stub",
|
android.AssertBoolEquals(t, "stub module expected to not depend on from-text stub",
|
||||||
false, CheckModuleHasDependency(t, result.TestContext,
|
false, CheckModuleHasDependency(t, result.TestContext,
|
||||||
|
@@ -64,6 +64,29 @@ var kotlinc = pctx.AndroidRemoteStaticRule("kotlinc", android.RemoteRuleSupports
|
|||||||
"kotlincFlags", "classpath", "srcJars", "commonSrcFilesArg", "srcJarDir", "classesDir",
|
"kotlincFlags", "classpath", "srcJars", "commonSrcFilesArg", "srcJarDir", "classesDir",
|
||||||
"headerClassesDir", "headerJar", "kotlinJvmTarget", "kotlinBuildFile", "emptyDir", "name")
|
"headerClassesDir", "headerJar", "kotlinJvmTarget", "kotlinBuildFile", "emptyDir", "name")
|
||||||
|
|
||||||
|
var kotlinKytheExtract = pctx.AndroidStaticRule("kotlinKythe",
|
||||||
|
// TODO (b/265428637): To prevent kotlinc version skew between android builds and internal kotlin indexers (g3), consider embedding the kotlinc used by android into the kzip file.
|
||||||
|
// This has an impact on .kzip sizes, so defer that for now.
|
||||||
|
blueprint.RuleParams{
|
||||||
|
Command: `rm -rf "$srcJarDir" && mkdir -p "$srcJarDir" && ` +
|
||||||
|
`${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" -f "*.kt" $srcJars && ` +
|
||||||
|
`${config.KotlinKytheExtractor} -corpus ${kytheCorpus} --srcs @$out.rsp --srcs @"$srcJarDir/list" $commonSrcFilesList --cp @$classpath -o $out --kotlin_out $outJar ` +
|
||||||
|
// wrap the additional kotlin args.
|
||||||
|
// Skip Xbuild file, pass the cp explicitly.
|
||||||
|
// Skip header jars, those should not have an effect on kythe results.
|
||||||
|
` --args '${config.KotlincGlobalFlags} ` +
|
||||||
|
` ${config.KotlincSuppressJDK9Warnings} ${config.JavacHeapFlags} ` +
|
||||||
|
` $kotlincFlags -jvm-target $kotlinJvmTarget'`,
|
||||||
|
CommandDeps: []string{
|
||||||
|
"${config.KotlinKytheExtractor}",
|
||||||
|
"${config.ZipSyncCmd}",
|
||||||
|
},
|
||||||
|
Rspfile: "$out.rsp",
|
||||||
|
RspfileContent: "$in",
|
||||||
|
},
|
||||||
|
"classpath", "kotlincFlags", "commonSrcFilesList", "kotlinJvmTarget", "outJar", "srcJars", "srcJarDir",
|
||||||
|
)
|
||||||
|
|
||||||
func kotlinCommonSrcsList(ctx android.ModuleContext, commonSrcFiles android.Paths) android.OptionalPath {
|
func kotlinCommonSrcsList(ctx android.ModuleContext, commonSrcFiles android.Paths) android.OptionalPath {
|
||||||
if len(commonSrcFiles) > 0 {
|
if len(commonSrcFiles) > 0 {
|
||||||
// The list of common_srcs may be too long to put on the command line, but
|
// The list of common_srcs may be too long to put on the command line, but
|
||||||
@@ -81,7 +104,7 @@ func kotlinCommonSrcsList(ctx android.ModuleContext, commonSrcFiles android.Path
|
|||||||
}
|
}
|
||||||
|
|
||||||
// kotlinCompile takes .java and .kt sources and srcJars, and compiles the .kt sources into a classes jar in outputFile.
|
// kotlinCompile takes .java and .kt sources and srcJars, and compiles the .kt sources into a classes jar in outputFile.
|
||||||
func kotlinCompile(ctx android.ModuleContext, outputFile, headerOutputFile android.WritablePath,
|
func (j *Module) kotlinCompile(ctx android.ModuleContext, outputFile, headerOutputFile android.WritablePath,
|
||||||
srcFiles, commonSrcFiles, srcJars android.Paths,
|
srcFiles, commonSrcFiles, srcJars android.Paths,
|
||||||
flags javaBuilderFlags) {
|
flags javaBuilderFlags) {
|
||||||
|
|
||||||
@@ -127,6 +150,31 @@ func kotlinCompile(ctx android.ModuleContext, outputFile, headerOutputFile andro
|
|||||||
"name": kotlinName,
|
"name": kotlinName,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Emit kythe xref rule
|
||||||
|
if (ctx.Config().EmitXrefRules()) && ctx.Module() == ctx.PrimaryModule() {
|
||||||
|
extractionFile := outputFile.ReplaceExtension(ctx, "kzip")
|
||||||
|
args := map[string]string{
|
||||||
|
"classpath": classpathRspFile.String(),
|
||||||
|
"kotlincFlags": flags.kotlincFlags,
|
||||||
|
"kotlinJvmTarget": flags.javaVersion.StringForKotlinc(),
|
||||||
|
"outJar": outputFile.String(),
|
||||||
|
"srcJars": strings.Join(srcJars.Strings(), " "),
|
||||||
|
"srcJarDir": android.PathForModuleOut(ctx, "kotlinc", "srcJars.xref").String(),
|
||||||
|
}
|
||||||
|
if commonSrcsList.Valid() {
|
||||||
|
args["commonSrcFilesList"] = "--srcs @" + commonSrcsList.String()
|
||||||
|
}
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: kotlinKytheExtract,
|
||||||
|
Description: "kotlinKythe",
|
||||||
|
Output: extractionFile,
|
||||||
|
Inputs: srcFiles,
|
||||||
|
Implicits: deps,
|
||||||
|
Args: args,
|
||||||
|
})
|
||||||
|
j.kytheKotlinFiles = append(j.kytheKotlinFiles, extractionFile)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var kaptStubs = pctx.AndroidRemoteStaticRule("kaptStubs", android.RemoteRuleSupports{Goma: true},
|
var kaptStubs = pctx.AndroidRemoteStaticRule("kaptStubs", android.RemoteRuleSupports{Goma: true},
|
||||||
|
@@ -248,7 +248,7 @@ func (scope *apiScope) apiLibraryModuleName(baseName string) string {
|
|||||||
return scope.stubsLibraryModuleName(baseName) + ".from-text"
|
return scope.stubsLibraryModuleName(baseName) + ".from-text"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (scope *apiScope) sourceStubLibraryModuleName(baseName string) string {
|
func (scope *apiScope) sourceStubsLibraryModuleName(baseName string) string {
|
||||||
return scope.stubsLibraryModuleName(baseName) + ".from-source"
|
return scope.stubsLibraryModuleName(baseName) + ".from-source"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -830,16 +830,6 @@ func (paths *scopePaths) extractLatestRemovedApiPath(ctx android.ModuleContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
type commonToSdkLibraryAndImportProperties struct {
|
type commonToSdkLibraryAndImportProperties struct {
|
||||||
// The naming scheme to use for the components that this module creates.
|
|
||||||
//
|
|
||||||
// If not specified then it defaults to "default".
|
|
||||||
//
|
|
||||||
// This is a temporary mechanism to simplify conversion from separate modules for each
|
|
||||||
// component that follow a different naming pattern to the default one.
|
|
||||||
//
|
|
||||||
// TODO(b/155480189) - Remove once naming inconsistencies have been resolved.
|
|
||||||
Naming_scheme *string
|
|
||||||
|
|
||||||
// Specifies whether this module can be used as an Android shared library; defaults
|
// Specifies whether this module can be used as an Android shared library; defaults
|
||||||
// to true.
|
// to true.
|
||||||
//
|
//
|
||||||
@@ -915,8 +905,6 @@ type commonToSdkLibraryAndImport struct {
|
|||||||
|
|
||||||
scopePaths map[*apiScope]*scopePaths
|
scopePaths map[*apiScope]*scopePaths
|
||||||
|
|
||||||
namingScheme sdkLibraryComponentNamingScheme
|
|
||||||
|
|
||||||
commonSdkLibraryProperties commonToSdkLibraryAndImportProperties
|
commonSdkLibraryProperties commonToSdkLibraryAndImportProperties
|
||||||
|
|
||||||
// Paths to commonSdkLibraryProperties.Doctag_files
|
// Paths to commonSdkLibraryProperties.Doctag_files
|
||||||
@@ -944,15 +932,6 @@ func (c *commonToSdkLibraryAndImport) initCommon(module commonSdkLibraryAndImpor
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android.DefaultableHookContext) bool {
|
func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android.DefaultableHookContext) bool {
|
||||||
schemeProperty := proptools.StringDefault(c.commonSdkLibraryProperties.Naming_scheme, "default")
|
|
||||||
switch schemeProperty {
|
|
||||||
case "default":
|
|
||||||
c.namingScheme = &defaultNamingScheme{}
|
|
||||||
default:
|
|
||||||
ctx.PropertyErrorf("naming_scheme", "expected 'default' but was %q", schemeProperty)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
namePtr := proptools.StringPtr(c.module.RootLibraryName())
|
namePtr := proptools.StringPtr(c.module.RootLibraryName())
|
||||||
c.sdkLibraryComponentProperties.SdkLibraryName = namePtr
|
c.sdkLibraryComponentProperties.SdkLibraryName = namePtr
|
||||||
|
|
||||||
@@ -995,41 +974,41 @@ func (c *commonToSdkLibraryAndImport) xmlPermissionsModuleName() string {
|
|||||||
// Name of the java_library module that compiles the stubs source.
|
// Name of the java_library module that compiles the stubs source.
|
||||||
func (c *commonToSdkLibraryAndImport) stubsLibraryModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) stubsLibraryModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.stubsLibraryModuleName(apiScope, baseName)
|
return apiScope.stubsLibraryModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name of the java_library module that compiles the exportable stubs source.
|
// Name of the java_library module that compiles the exportable stubs source.
|
||||||
func (c *commonToSdkLibraryAndImport) exportableStubsLibraryModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) exportableStubsLibraryModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.exportableStubsLibraryModuleName(apiScope, baseName)
|
return apiScope.exportableStubsLibraryModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name of the droidstubs module that generates the stubs source and may also
|
// Name of the droidstubs module that generates the stubs source and may also
|
||||||
// generate/check the API.
|
// generate/check the API.
|
||||||
func (c *commonToSdkLibraryAndImport) stubsSourceModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) stubsSourceModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.stubsSourceModuleName(apiScope, baseName)
|
return apiScope.stubsSourceModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name of the java_api_library module that generates the from-text stubs source
|
// Name of the java_api_library module that generates the from-text stubs source
|
||||||
// and compiles to a jar file.
|
// and compiles to a jar file.
|
||||||
func (c *commonToSdkLibraryAndImport) apiLibraryModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) apiLibraryModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.apiLibraryModuleName(apiScope, baseName)
|
return apiScope.apiLibraryModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name of the java_library module that compiles the stubs
|
// Name of the java_library module that compiles the stubs
|
||||||
// generated from source Java files.
|
// generated from source Java files.
|
||||||
func (c *commonToSdkLibraryAndImport) sourceStubsLibraryModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) sourceStubsLibraryModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.sourceStubsLibraryModuleName(apiScope, baseName)
|
return apiScope.sourceStubsLibraryModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name of the java_library module that compiles the exportable stubs
|
// Name of the java_library module that compiles the exportable stubs
|
||||||
// generated from source Java files.
|
// generated from source Java files.
|
||||||
func (c *commonToSdkLibraryAndImport) exportableSourceStubsLibraryModuleName(apiScope *apiScope) string {
|
func (c *commonToSdkLibraryAndImport) exportableSourceStubsLibraryModuleName(apiScope *apiScope) string {
|
||||||
baseName := c.module.RootLibraryName()
|
baseName := c.module.RootLibraryName()
|
||||||
return c.namingScheme.exportableSourceStubsLibraryModuleName(apiScope, baseName)
|
return apiScope.exportableSourceStubsLibraryModuleName(baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The component names for different outputs of the java_sdk_library.
|
// The component names for different outputs of the java_sdk_library.
|
||||||
@@ -2395,50 +2374,6 @@ func (module *SdkLibrary) defaultsToStubs() bool {
|
|||||||
return proptools.Bool(module.sdkLibraryProperties.Default_to_stubs)
|
return proptools.Bool(module.sdkLibraryProperties.Default_to_stubs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defines how to name the individual component modules the sdk library creates.
|
|
||||||
type sdkLibraryComponentNamingScheme interface {
|
|
||||||
stubsLibraryModuleName(scope *apiScope, baseName string) string
|
|
||||||
|
|
||||||
stubsSourceModuleName(scope *apiScope, baseName string) string
|
|
||||||
|
|
||||||
apiLibraryModuleName(scope *apiScope, baseName string) string
|
|
||||||
|
|
||||||
sourceStubsLibraryModuleName(scope *apiScope, baseName string) string
|
|
||||||
|
|
||||||
exportableStubsLibraryModuleName(scope *apiScope, baseName string) string
|
|
||||||
|
|
||||||
exportableSourceStubsLibraryModuleName(scope *apiScope, baseName string) string
|
|
||||||
}
|
|
||||||
|
|
||||||
type defaultNamingScheme struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) stubsLibraryModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.stubsLibraryModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) stubsSourceModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.stubsSourceModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) apiLibraryModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.apiLibraryModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) sourceStubsLibraryModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.sourceStubLibraryModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) exportableStubsLibraryModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.exportableStubsLibraryModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *defaultNamingScheme) exportableSourceStubsLibraryModuleName(scope *apiScope, baseName string) string {
|
|
||||||
return scope.exportableSourceStubsLibraryModuleName(baseName)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ sdkLibraryComponentNamingScheme = (*defaultNamingScheme)(nil)
|
|
||||||
|
|
||||||
func moduleStubLinkType(j *Module) (stub bool, ret sdkLinkType) {
|
func moduleStubLinkType(j *Module) (stub bool, ret sdkLinkType) {
|
||||||
kind := android.ToSdkKind(proptools.String(j.properties.Stub_contributing_api))
|
kind := android.ToSdkKind(proptools.String(j.properties.Stub_contributing_api))
|
||||||
switch kind {
|
switch kind {
|
||||||
@@ -3510,7 +3445,6 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Naming_scheme = sdk.commonSdkLibraryProperties.Naming_scheme
|
|
||||||
s.Shared_library = proptools.BoolPtr(sdk.sharedLibrary())
|
s.Shared_library = proptools.BoolPtr(sdk.sharedLibrary())
|
||||||
s.Compile_dex = sdk.dexProperties.Compile_dex
|
s.Compile_dex = sdk.dexProperties.Compile_dex
|
||||||
s.Doctag_paths = sdk.doctagPaths
|
s.Doctag_paths = sdk.doctagPaths
|
||||||
|
@@ -422,7 +422,7 @@ func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
|
|||||||
for _, expectation := range expectations {
|
for _, expectation := range expectations {
|
||||||
verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
|
verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
|
||||||
|
|
||||||
stubName := apiScopePublic.sourceStubLibraryModuleName("sdklib")
|
stubName := apiScopePublic.sourceStubsLibraryModuleName("sdklib")
|
||||||
verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
|
verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
package {
|
|
||||||
default_applicable_licenses: ["Android-Apache-2.0"],
|
|
||||||
}
|
|
||||||
|
|
||||||
bootstrap_go_package {
|
|
||||||
name: "soong-multitree",
|
|
||||||
pkgPath: "android/soong/multitree",
|
|
||||||
deps: [
|
|
||||||
"blueprint",
|
|
||||||
"soong-android",
|
|
||||||
],
|
|
||||||
srcs: [
|
|
||||||
"api_imports.go",
|
|
||||||
"api_surface.go",
|
|
||||||
"export.go",
|
|
||||||
"metadata.go",
|
|
||||||
"import.go",
|
|
||||||
],
|
|
||||||
pluginFor: ["soong_build"],
|
|
||||||
}
|
|
@@ -1,102 +0,0 @@
|
|||||||
// Copyright 2022 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 multitree
|
|
||||||
|
|
||||||
import (
|
|
||||||
"android/soong/android"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
apiImportNameSuffix = ".apiimport"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RegisterApiImportsModule(android.InitRegistrationContext)
|
|
||||||
android.RegisterMakeVarsProvider(pctx, makeVarsProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterApiImportsModule(ctx android.RegistrationContext) {
|
|
||||||
ctx.RegisterModuleType("api_imports", apiImportsFactory)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApiImports struct {
|
|
||||||
android.ModuleBase
|
|
||||||
properties apiImportsProperties
|
|
||||||
}
|
|
||||||
|
|
||||||
type apiImportsProperties struct {
|
|
||||||
Shared_libs []string // List of C shared libraries from API surfaces
|
|
||||||
Header_libs []string // List of C header libraries from API surfaces
|
|
||||||
Apex_shared_libs []string // List of C shared libraries with APEX stubs
|
|
||||||
}
|
|
||||||
|
|
||||||
// 'api_imports' is a module which describes modules available from API surfaces.
|
|
||||||
// This module is required to get the list of all imported API modules, because
|
|
||||||
// it is discouraged to loop and fetch all modules from its type information. The
|
|
||||||
// only module with name 'api_imports' will be used from the build.
|
|
||||||
func apiImportsFactory() android.Module {
|
|
||||||
module := &ApiImports{}
|
|
||||||
module.AddProperties(&module.properties)
|
|
||||||
android.InitAndroidModule(module)
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
func (imports *ApiImports) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
||||||
// ApiImport module does not generate any build actions
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApiImportInfo struct {
|
|
||||||
SharedLibs, HeaderLibs, ApexSharedLibs map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
var ApiImportsProvider = blueprint.NewMutatorProvider[ApiImportInfo]("deps")
|
|
||||||
|
|
||||||
// Store module lists into ApiImportInfo and share it over mutator provider.
|
|
||||||
func (imports *ApiImports) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
||||||
generateNameMapWithSuffix := func(names []string) map[string]string {
|
|
||||||
moduleNameMap := make(map[string]string)
|
|
||||||
for _, name := range names {
|
|
||||||
moduleNameMap[name] = name + apiImportNameSuffix
|
|
||||||
}
|
|
||||||
|
|
||||||
return moduleNameMap
|
|
||||||
}
|
|
||||||
|
|
||||||
sharedLibs := generateNameMapWithSuffix(imports.properties.Shared_libs)
|
|
||||||
headerLibs := generateNameMapWithSuffix(imports.properties.Header_libs)
|
|
||||||
apexSharedLibs := generateNameMapWithSuffix(imports.properties.Apex_shared_libs)
|
|
||||||
|
|
||||||
android.SetProvider(ctx, ApiImportsProvider, ApiImportInfo{
|
|
||||||
SharedLibs: sharedLibs,
|
|
||||||
HeaderLibs: headerLibs,
|
|
||||||
ApexSharedLibs: apexSharedLibs,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetApiImportSuffix() string {
|
|
||||||
return apiImportNameSuffix
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeVarsProvider(ctx android.MakeVarsContext) {
|
|
||||||
ctx.VisitAllModules(func(m android.Module) {
|
|
||||||
if i, ok := m.(*ApiImports); ok {
|
|
||||||
ctx.Strict("API_IMPORTED_SHARED_LIBRARIES", strings.Join(i.properties.Shared_libs, " "))
|
|
||||||
ctx.Strict("API_IMPORTED_HEADER_LIBRARIES", strings.Join(i.properties.Header_libs, " "))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
@@ -1,109 +0,0 @@
|
|||||||
// Copyright 2021 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 multitree
|
|
||||||
|
|
||||||
import (
|
|
||||||
"android/soong/android"
|
|
||||||
"github.com/google/blueprint"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
pctx = android.NewPackageContext("android/soong/multitree")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RegisterApiSurfaceBuildComponents(android.InitRegistrationContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
var PrepareForTestWithApiSurface = android.FixtureRegisterWithContext(RegisterApiSurfaceBuildComponents)
|
|
||||||
|
|
||||||
func RegisterApiSurfaceBuildComponents(ctx android.RegistrationContext) {
|
|
||||||
ctx.RegisterModuleType("api_surface", ApiSurfaceFactory)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApiSurface struct {
|
|
||||||
android.ModuleBase
|
|
||||||
ExportableModuleBase
|
|
||||||
properties apiSurfaceProperties
|
|
||||||
|
|
||||||
taggedOutputs map[string]android.Paths
|
|
||||||
}
|
|
||||||
|
|
||||||
type apiSurfaceProperties struct {
|
|
||||||
Contributions []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func ApiSurfaceFactory() android.Module {
|
|
||||||
module := &ApiSurface{}
|
|
||||||
module.AddProperties(&module.properties)
|
|
||||||
android.InitAndroidModule(module)
|
|
||||||
InitExportableModule(module)
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
func (surface *ApiSurface) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
||||||
if surface.properties.Contributions != nil {
|
|
||||||
ctx.AddVariationDependencies(nil, nil, surface.properties.Contributions...)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func (surface *ApiSurface) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
||||||
contributionFiles := make(map[string]android.Paths)
|
|
||||||
var allOutputs android.Paths
|
|
||||||
ctx.WalkDeps(func(child, parent android.Module) bool {
|
|
||||||
if contribution, ok := child.(ApiContribution); ok {
|
|
||||||
copied := contribution.CopyFilesWithTag(ctx)
|
|
||||||
for tag, files := range copied {
|
|
||||||
contributionFiles[child.Name()+"#"+tag] = files
|
|
||||||
}
|
|
||||||
for _, paths := range copied {
|
|
||||||
allOutputs = append(allOutputs, paths...)
|
|
||||||
}
|
|
||||||
return false // no transitive dependencies
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
|
|
||||||
// phony target
|
|
||||||
ctx.Build(pctx, android.BuildParams{
|
|
||||||
Rule: blueprint.Phony,
|
|
||||||
Output: android.PathForPhony(ctx, ctx.ModuleName()),
|
|
||||||
Inputs: allOutputs,
|
|
||||||
})
|
|
||||||
|
|
||||||
surface.taggedOutputs = contributionFiles
|
|
||||||
|
|
||||||
ctx.SetOutputFiles(allOutputs, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (surface *ApiSurface) TaggedOutputs() map[string]android.Paths {
|
|
||||||
return surface.taggedOutputs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (surface *ApiSurface) Exportable() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ Exportable = (*ApiSurface)(nil)
|
|
||||||
|
|
||||||
type ApiContribution interface {
|
|
||||||
// copy files necessaryt to construct an API surface
|
|
||||||
// For C, it will be map.txt and .h files
|
|
||||||
// For Java, it will be api.txt
|
|
||||||
CopyFilesWithTag(ctx android.ModuleContext) map[string]android.Paths // output paths
|
|
||||||
|
|
||||||
// Generate Android.bp in out/ to use the exported .txt files
|
|
||||||
// GenerateBuildFiles(ctx ModuleContext) Paths //output paths
|
|
||||||
}
|
|
@@ -1,66 +0,0 @@
|
|||||||
// Copyright 2022 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 multitree
|
|
||||||
|
|
||||||
import (
|
|
||||||
"android/soong/android"
|
|
||||||
|
|
||||||
"github.com/google/blueprint/proptools"
|
|
||||||
)
|
|
||||||
|
|
||||||
type moduleExportProperty struct {
|
|
||||||
// True if the module is exported to the other components in a multi-tree.
|
|
||||||
// Any components in the multi-tree can import this module to use.
|
|
||||||
Export *bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExportableModuleBase struct {
|
|
||||||
properties moduleExportProperty
|
|
||||||
}
|
|
||||||
|
|
||||||
type Exportable interface {
|
|
||||||
// Properties for the exporable module.
|
|
||||||
exportableModuleProps() *moduleExportProperty
|
|
||||||
|
|
||||||
// Check if this module can be exported.
|
|
||||||
// If this returns false, the module will not be exported regardless of the 'export' value.
|
|
||||||
Exportable() bool
|
|
||||||
|
|
||||||
// Returns 'true' if this module has 'export: true'
|
|
||||||
// This module will not be exported if it returns 'false' to 'Exportable()' interface even if
|
|
||||||
// it has 'export: true'.
|
|
||||||
IsExported() bool
|
|
||||||
|
|
||||||
// Map from tags to outputs.
|
|
||||||
// Each module can tag their outputs for convenience.
|
|
||||||
TaggedOutputs() map[string]android.Paths
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExportableModule interface {
|
|
||||||
android.Module
|
|
||||||
Exportable
|
|
||||||
}
|
|
||||||
|
|
||||||
func InitExportableModule(module ExportableModule) {
|
|
||||||
module.AddProperties(module.exportableModuleProps())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *ExportableModuleBase) exportableModuleProps() *moduleExportProperty {
|
|
||||||
return &m.properties
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *ExportableModuleBase) IsExported() bool {
|
|
||||||
return proptools.Bool(m.properties.Export)
|
|
||||||
}
|
|
@@ -1,96 +0,0 @@
|
|||||||
// Copyright 2022 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 multitree
|
|
||||||
|
|
||||||
import (
|
|
||||||
"android/soong/android"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
nameSuffix = ".imported"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MultitreeImportedModuleInterface interface {
|
|
||||||
GetMultitreeImportedModuleName() string
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
android.RegisterModuleType("imported_filegroup", importedFileGroupFactory)
|
|
||||||
|
|
||||||
android.PreArchMutators(RegisterMultitreePreArchMutators)
|
|
||||||
}
|
|
||||||
|
|
||||||
type importedFileGroupProperties struct {
|
|
||||||
// Imported modules from the other components in a multi-tree
|
|
||||||
Imported []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type importedFileGroup struct {
|
|
||||||
android.ModuleBase
|
|
||||||
|
|
||||||
properties importedFileGroupProperties
|
|
||||||
srcs android.Paths
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ifg *importedFileGroup) Name() string {
|
|
||||||
return ifg.BaseModuleName() + nameSuffix
|
|
||||||
}
|
|
||||||
|
|
||||||
func importedFileGroupFactory() android.Module {
|
|
||||||
module := &importedFileGroup{}
|
|
||||||
module.AddProperties(&module.properties)
|
|
||||||
|
|
||||||
android.InitAndroidModule(module)
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ MultitreeImportedModuleInterface = (*importedFileGroup)(nil)
|
|
||||||
|
|
||||||
func (ifg *importedFileGroup) GetMultitreeImportedModuleName() string {
|
|
||||||
// The base module name of the imported filegroup is used as the imported module name
|
|
||||||
return ifg.BaseModuleName()
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ android.SourceFileProducer = (*importedFileGroup)(nil)
|
|
||||||
|
|
||||||
func (ifg *importedFileGroup) Srcs() android.Paths {
|
|
||||||
return ifg.srcs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ifg *importedFileGroup) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
||||||
// srcs from this module must not be used. Adding a dot path to avoid the empty
|
|
||||||
// source failure. Still soong returns error when a module wants to build against
|
|
||||||
// this source, which is intended.
|
|
||||||
ifg.srcs = android.PathsForModuleSrc(ctx, []string{"."})
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterMultitreePreArchMutators(ctx android.RegisterMutatorsContext) {
|
|
||||||
ctx.BottomUp("multitree_imported_rename", MultitreeImportedRenameMutator).Parallel()
|
|
||||||
}
|
|
||||||
|
|
||||||
func MultitreeImportedRenameMutator(ctx android.BottomUpMutatorContext) {
|
|
||||||
if m, ok := ctx.Module().(MultitreeImportedModuleInterface); ok {
|
|
||||||
name := m.GetMultitreeImportedModuleName()
|
|
||||||
if !ctx.OtherModuleExists(name) {
|
|
||||||
// Provide an empty filegroup not to break the build while updating the metadata.
|
|
||||||
// In other cases, soong will report an error to guide users to run 'm update-meta'
|
|
||||||
// first.
|
|
||||||
if !ctx.Config().TargetMultitreeUpdateMeta() {
|
|
||||||
ctx.ModuleErrorf("\"%s\" filegroup must be imported.\nRun 'm update-meta' first to import the filegroup.", name)
|
|
||||||
}
|
|
||||||
ctx.Rename(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,74 +0,0 @@
|
|||||||
// Copyright 2022 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 multitree
|
|
||||||
|
|
||||||
import (
|
|
||||||
"android/soong/android"
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
android.RegisterParallelSingletonType("update-meta", UpdateMetaSingleton)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateMetaSingleton() android.Singleton {
|
|
||||||
return &updateMetaSingleton{}
|
|
||||||
}
|
|
||||||
|
|
||||||
type jsonImported struct {
|
|
||||||
FileGroups map[string][]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type metadataJsonFlags struct {
|
|
||||||
Imported jsonImported `json:",omitempty"`
|
|
||||||
Exported map[string][]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type updateMetaSingleton struct {
|
|
||||||
importedModules []string
|
|
||||||
generatedMetadataFile android.OutputPath
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *updateMetaSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|
||||||
metadata := metadataJsonFlags{
|
|
||||||
Imported: jsonImported{
|
|
||||||
FileGroups: make(map[string][]string),
|
|
||||||
},
|
|
||||||
Exported: make(map[string][]string),
|
|
||||||
}
|
|
||||||
ctx.VisitAllModules(func(module android.Module) {
|
|
||||||
if ifg, ok := module.(*importedFileGroup); ok {
|
|
||||||
metadata.Imported.FileGroups[ifg.BaseModuleName()] = ifg.properties.Imported
|
|
||||||
}
|
|
||||||
if e, ok := module.(ExportableModule); ok {
|
|
||||||
if e.IsExported() && e.Exportable() {
|
|
||||||
for tag, files := range e.TaggedOutputs() {
|
|
||||||
// TODO(b/219846705): refactor this to a dictionary
|
|
||||||
metadata.Exported[e.Name()+":"+tag] = append(metadata.Exported[e.Name()+":"+tag], files.Strings()...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
jsonStr, err := json.Marshal(metadata)
|
|
||||||
if err != nil {
|
|
||||||
ctx.Errorf(err.Error())
|
|
||||||
}
|
|
||||||
s.generatedMetadataFile = android.PathForOutput(ctx, "multitree", "metadata.json")
|
|
||||||
android.WriteFileRule(ctx, s.generatedMetadataFile, string(jsonStr))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *updateMetaSingleton) MakeVars(ctx android.MakeVarsContext) {
|
|
||||||
ctx.Strict("MULTITREE_METADATA", s.generatedMetadataFile.String())
|
|
||||||
}
|
|
@@ -24,7 +24,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
pctx = android.NewPackageContext("android/soong/rust/config")
|
pctx = android.NewPackageContext("android/soong/rust/config")
|
||||||
|
|
||||||
RustDefaultVersion = "1.80.1"
|
RustDefaultVersion = "1.81.0"
|
||||||
RustDefaultBase = "prebuilts/rust/"
|
RustDefaultBase = "prebuilts/rust/"
|
||||||
DefaultEdition = "2021"
|
DefaultEdition = "2021"
|
||||||
Stdlibs = []string{
|
Stdlibs = []string{
|
||||||
|
57
rust/rust.go
57
rust/rust.go
@@ -29,7 +29,6 @@ import (
|
|||||||
"android/soong/cc"
|
"android/soong/cc"
|
||||||
cc_config "android/soong/cc/config"
|
cc_config "android/soong/cc/config"
|
||||||
"android/soong/fuzz"
|
"android/soong/fuzz"
|
||||||
"android/soong/multitree"
|
|
||||||
"android/soong/rust/config"
|
"android/soong/rust/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1218,47 +1217,6 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|||||||
|
|
||||||
skipModuleList := map[string]bool{}
|
skipModuleList := map[string]bool{}
|
||||||
|
|
||||||
var apiImportInfo multitree.ApiImportInfo
|
|
||||||
hasApiImportInfo := false
|
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
if dep.Name() == "api_imports" {
|
|
||||||
apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
|
|
||||||
hasApiImportInfo = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if hasApiImportInfo {
|
|
||||||
targetStubModuleList := map[string]string{}
|
|
||||||
targetOrigModuleList := map[string]string{}
|
|
||||||
|
|
||||||
// Search for dependency which both original module and API imported library with APEX stub exists
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
|
|
||||||
targetStubModuleList[apiLibrary] = depName
|
|
||||||
}
|
|
||||||
})
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if origLibrary, ok := targetStubModuleList[depName]; ok {
|
|
||||||
targetOrigModuleList[origLibrary] = depName
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Decide which library should be used between original and API imported library
|
|
||||||
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
depName := ctx.OtherModuleName(dep)
|
|
||||||
if apiLibrary, ok := targetOrigModuleList[depName]; ok {
|
|
||||||
if cc.ShouldUseStubForApex(ctx, dep) {
|
|
||||||
skipModuleList[depName] = true
|
|
||||||
} else {
|
|
||||||
skipModuleList[apiLibrary] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var transitiveAndroidMkSharedLibs []*android.DepSet[string]
|
var transitiveAndroidMkSharedLibs []*android.DepSet[string]
|
||||||
var directAndroidMkSharedLibs []string
|
var directAndroidMkSharedLibs []string
|
||||||
|
|
||||||
@@ -1609,13 +1567,6 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
deps := mod.deps(ctx)
|
deps := mod.deps(ctx)
|
||||||
var commonDepVariations []blueprint.Variation
|
var commonDepVariations []blueprint.Variation
|
||||||
|
|
||||||
apiImportInfo := cc.GetApiImports(mod, actx)
|
|
||||||
if mod.usePublicApi() || mod.useVendorApi() {
|
|
||||||
for idx, lib := range deps.SharedLibs {
|
|
||||||
deps.SharedLibs[idx] = cc.GetReplaceModuleName(lib, apiImportInfo.SharedLibs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ctx.Os() == android.Android {
|
if ctx.Os() == android.Android {
|
||||||
deps.SharedLibs, _ = cc.FilterNdkLibs(mod, ctx.Config(), deps.SharedLibs)
|
deps.SharedLibs, _ = cc.FilterNdkLibs(mod, ctx.Config(), deps.SharedLibs)
|
||||||
}
|
}
|
||||||
@@ -1708,17 +1659,9 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
variations := []blueprint.Variation{
|
variations := []blueprint.Variation{
|
||||||
{Mutator: "link", Variation: "shared"},
|
{Mutator: "link", Variation: "shared"},
|
||||||
}
|
}
|
||||||
// For core variant, add a dep on the implementation (if it exists) and its .apiimport (if it exists)
|
|
||||||
// GenerateAndroidBuildActions will pick the correct impl/stub based on the api_domain boundary
|
|
||||||
if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
|
|
||||||
cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, name, version, false)
|
cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, name, version, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
|
|
||||||
cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, apiLibraryName, version, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, lib := range deps.WholeStaticLibs {
|
for _, lib := range deps.WholeStaticLibs {
|
||||||
depTag := cc.StaticDepTag(true)
|
depTag := cc.StaticDepTag(true)
|
||||||
|
|
||||||
|
@@ -1703,61 +1703,6 @@ java_sdk_library_import {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSnapshotWithJavaSdkLibrary_NamingScheme(t *testing.T) {
|
|
||||||
result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, `
|
|
||||||
sdk {
|
|
||||||
name: "mysdk",
|
|
||||||
java_sdk_libs: ["myjavalib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
java_sdk_library {
|
|
||||||
name: "myjavalib",
|
|
||||||
apex_available: ["//apex_available:anyapex"],
|
|
||||||
srcs: ["Test.java"],
|
|
||||||
sdk_version: "current",
|
|
||||||
naming_scheme: "default",
|
|
||||||
public: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
CheckSnapshot(t, result, "mysdk", "",
|
|
||||||
checkAndroidBpContents(`
|
|
||||||
// This is auto-generated. DO NOT EDIT.
|
|
||||||
|
|
||||||
apex_contributions_defaults {
|
|
||||||
name: "mysdk.contributions",
|
|
||||||
contents: ["prebuilt_myjavalib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
java_sdk_library_import {
|
|
||||||
name: "myjavalib",
|
|
||||||
prefer: false,
|
|
||||||
visibility: ["//visibility:public"],
|
|
||||||
apex_available: ["//apex_available:anyapex"],
|
|
||||||
naming_scheme: "default",
|
|
||||||
shared_library: true,
|
|
||||||
public: {
|
|
||||||
jars: ["sdk_library/public/myjavalib-stubs.jar"],
|
|
||||||
stub_srcs: ["sdk_library/public/myjavalib_stub_sources"],
|
|
||||||
current_api: "sdk_library/public/myjavalib.txt",
|
|
||||||
removed_api: "sdk_library/public/myjavalib-removed.txt",
|
|
||||||
sdk_version: "current",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`),
|
|
||||||
checkAllCopyRules(`
|
|
||||||
.intermediates/myjavalib.stubs.exportable/android_common/combined/myjavalib.stubs.exportable.jar -> sdk_library/public/myjavalib-stubs.jar
|
|
||||||
.intermediates/myjavalib.stubs.source/android_common/exportable/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt
|
|
||||||
.intermediates/myjavalib.stubs.source/android_common/exportable/myjavalib.stubs.source_removed.txt -> sdk_library/public/myjavalib-removed.txt
|
|
||||||
`),
|
|
||||||
checkMergeZips(
|
|
||||||
".intermediates/mysdk/common_os/tmp/sdk_library/public/myjavalib_stub_sources.zip",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSnapshotWithJavaSdkLibrary_DoctagFiles(t *testing.T) {
|
func TestSnapshotWithJavaSdkLibrary_DoctagFiles(t *testing.T) {
|
||||||
result := android.GroupFixturePreparers(
|
result := android.GroupFixturePreparers(
|
||||||
prepareForSdkTestWithJavaSdkLibrary,
|
prepareForSdkTestWithJavaSdkLibrary,
|
||||||
|
16
sdk/sdk.go
16
sdk/sdk.go
@@ -84,20 +84,6 @@ type sdkProperties struct {
|
|||||||
|
|
||||||
// True if this is a module_exports (or module_exports_snapshot) module type.
|
// True if this is a module_exports (or module_exports_snapshot) module type.
|
||||||
Module_exports bool `blueprint:"mutated"`
|
Module_exports bool `blueprint:"mutated"`
|
||||||
|
|
||||||
// The additional visibility to add to the prebuilt modules to allow them to
|
|
||||||
// reference each other.
|
|
||||||
//
|
|
||||||
// This can only be used to widen the visibility of the members:
|
|
||||||
//
|
|
||||||
// * Specifying //visibility:public here will make all members visible and
|
|
||||||
// essentially ignore their own visibility.
|
|
||||||
// * Specifying //visibility:private here is an error.
|
|
||||||
// * Specifying any other rule here will add it to the members visibility and
|
|
||||||
// be output to the member prebuilt in the snapshot. Duplicates will be
|
|
||||||
// dropped. Adding a rule to members that have //visibility:private will
|
|
||||||
// cause the //visibility:private to be discarded.
|
|
||||||
Prebuilt_visibility []string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sdk defines an SDK which is a logical group of modules (e.g. native libs, headers, java libs, etc.)
|
// sdk defines an SDK which is a logical group of modules (e.g. native libs, headers, java libs, etc.)
|
||||||
@@ -130,8 +116,6 @@ func newSdkModule(moduleExports bool) *sdk {
|
|||||||
|
|
||||||
s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties, &traitsWrapper)
|
s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties, &traitsWrapper)
|
||||||
|
|
||||||
// Make sure that the prebuilt visibility property is verified for errors.
|
|
||||||
android.AddVisibilityProperty(s, "prebuilt_visibility", &s.properties.Prebuilt_visibility)
|
|
||||||
android.InitCommonOSAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon)
|
android.InitCommonOSAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon)
|
||||||
android.InitDefaultableModule(s)
|
android.InitDefaultableModule(s)
|
||||||
android.AddLoadHook(s, func(ctx android.LoadHookContext) {
|
android.AddLoadHook(s, func(ctx android.LoadHookContext) {
|
||||||
|
@@ -53,9 +53,6 @@ func TestSnapshotVisibility(t *testing.T) {
|
|||||||
// generated sdk_snapshot.
|
// generated sdk_snapshot.
|
||||||
":__subpackages__",
|
":__subpackages__",
|
||||||
],
|
],
|
||||||
prebuilt_visibility: [
|
|
||||||
"//prebuilts/mysdk",
|
|
||||||
],
|
|
||||||
java_header_libs: [
|
java_header_libs: [
|
||||||
"myjavalib",
|
"myjavalib",
|
||||||
"mypublicjavalib",
|
"mypublicjavalib",
|
||||||
@@ -162,18 +159,6 @@ java_import {
|
|||||||
`))
|
`))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrebuiltVisibilityProperty_IsValidated(t *testing.T) {
|
|
||||||
testSdkError(t, `prebuilt_visibility: cannot mix "//visibility:private" with any other visibility rules`, `
|
|
||||||
sdk {
|
|
||||||
name: "mysdk",
|
|
||||||
prebuilt_visibility: [
|
|
||||||
"//foo",
|
|
||||||
"//visibility:private",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSdkInstall(t *testing.T) {
|
func TestSdkInstall(t *testing.T) {
|
||||||
sdk := `
|
sdk := `
|
||||||
sdk {
|
sdk {
|
||||||
|
@@ -22,7 +22,6 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/apex"
|
|
||||||
"android/soong/cc"
|
"android/soong/cc"
|
||||||
"android/soong/java"
|
"android/soong/java"
|
||||||
|
|
||||||
@@ -1137,9 +1136,6 @@ func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType
|
|||||||
apexAvailable = []string{android.AvailableToPlatform}
|
apexAvailable = []string{android.AvailableToPlatform}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add in any baseline apex available settings.
|
|
||||||
apexAvailable = append(apexAvailable, apex.BaselineApexAvailable(member.Name())...)
|
|
||||||
|
|
||||||
// Remove duplicates and sort.
|
// Remove duplicates and sort.
|
||||||
apexAvailable = android.FirstUniqueStrings(apexAvailable)
|
apexAvailable = android.FirstUniqueStrings(apexAvailable)
|
||||||
sort.Strings(apexAvailable)
|
sort.Strings(apexAvailable)
|
||||||
@@ -1993,14 +1989,6 @@ func (m *memberContext) IsTargetBuildBeforeTiramisu() bool {
|
|||||||
return m.builder.targetBuildRelease.EarlierThan(buildReleaseT)
|
return m.builder.targetBuildRelease.EarlierThan(buildReleaseT)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *memberContext) Config() android.Config {
|
|
||||||
return m.sdkMemberContext.Config()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *memberContext) OtherModulePropertyErrorf(module android.Module, property string, fmt string, args ...interface{}) {
|
|
||||||
m.sdkMemberContext.OtherModulePropertyErrorf(module, property, fmt, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ android.SdkMemberContext = (*memberContext)(nil)
|
var _ android.SdkMemberContext = (*memberContext)(nil)
|
||||||
|
|
||||||
func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) {
|
func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) {
|
||||||
|
@@ -25,6 +25,8 @@ var androidmk_denylist []string = []string{
|
|||||||
"dalvik/",
|
"dalvik/",
|
||||||
"developers/",
|
"developers/",
|
||||||
"development/",
|
"development/",
|
||||||
|
"device/common/",
|
||||||
|
"device/google_car/",
|
||||||
"device/sample/",
|
"device/sample/",
|
||||||
"frameworks/",
|
"frameworks/",
|
||||||
// Do not block other directories in kernel/, see b/319658303.
|
// Do not block other directories in kernel/, see b/319658303.
|
||||||
@@ -41,6 +43,15 @@ var androidmk_denylist []string = []string{
|
|||||||
"trusty/",
|
"trusty/",
|
||||||
// Add back toolchain/ once defensive Android.mk files are removed
|
// Add back toolchain/ once defensive Android.mk files are removed
|
||||||
//"toolchain/",
|
//"toolchain/",
|
||||||
|
"vendor/google_contexthub/",
|
||||||
|
"vendor/google_data/",
|
||||||
|
"vendor/google_elmyra/",
|
||||||
|
"vendor/google_mhl/",
|
||||||
|
"vendor/google_pdk/",
|
||||||
|
"vendor/google_testing/",
|
||||||
|
"vendor/partner_testing/",
|
||||||
|
"vendor/partner_tools/",
|
||||||
|
"vendor/pdk/",
|
||||||
}
|
}
|
||||||
|
|
||||||
func blockAndroidMks(ctx Context, androidMks []string) {
|
func blockAndroidMks(ctx Context, androidMks []string) {
|
||||||
|
@@ -1375,10 +1375,12 @@ func (c *configImpl) shouldCleanupRBELogsDir() bool {
|
|||||||
// Perform a log directory cleanup only when the log directory
|
// Perform a log directory cleanup only when the log directory
|
||||||
// is auto created by the build rather than user-specified.
|
// is auto created by the build rather than user-specified.
|
||||||
for _, f := range []string{"RBE_proxy_log_dir", "FLAG_output_dir"} {
|
for _, f := range []string{"RBE_proxy_log_dir", "FLAG_output_dir"} {
|
||||||
if _, ok := c.environ.Get(f); ok {
|
if v, ok := c.environ.Get(f); ok {
|
||||||
|
if v != c.rbeTmpDir() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user