Merge changes Iba57c949,Ief43ff51,Ib1809a4d,I2ab64f36 am: b08a091502
am: 3f57de54b2
am: a088bff723
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1480605 Change-Id: If742998ff050c42cc670f274e4c560128db3dcbc
This commit is contained in:
@@ -32,6 +32,7 @@ bootstrap_go_package {
|
|||||||
"mutator.go",
|
"mutator.go",
|
||||||
"namespace.go",
|
"namespace.go",
|
||||||
"neverallow.go",
|
"neverallow.go",
|
||||||
|
"ninja_deps.go",
|
||||||
"notices.go",
|
"notices.go",
|
||||||
"onceper.go",
|
"onceper.go",
|
||||||
"override_module.go",
|
"override_module.go",
|
||||||
@@ -74,6 +75,7 @@ bootstrap_go_package {
|
|||||||
"mutator_test.go",
|
"mutator_test.go",
|
||||||
"namespace_test.go",
|
"namespace_test.go",
|
||||||
"neverallow_test.go",
|
"neverallow_test.go",
|
||||||
|
"ninja_deps_test.go",
|
||||||
"onceper_test.go",
|
"onceper_test.go",
|
||||||
"package_test.go",
|
"package_test.go",
|
||||||
"path_properties_test.go",
|
"path_properties_test.go",
|
||||||
|
@@ -126,6 +126,8 @@ type config struct {
|
|||||||
// in tests when a path doesn't exist.
|
// in tests when a path doesn't exist.
|
||||||
testAllowNonExistentPaths bool
|
testAllowNonExistentPaths bool
|
||||||
|
|
||||||
|
ninjaFileDepsSet sync.Map
|
||||||
|
|
||||||
OncePer
|
OncePer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -139,15 +139,24 @@ type SingletonMakeVarsProvider interface {
|
|||||||
MakeVars(ctx MakeVarsContext)
|
MakeVars(ctx MakeVarsContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// registerSingletonMakeVarsProvider adds a singleton that implements SingletonMakeVarsProvider to the list of
|
var singletonMakeVarsProvidersKey = NewOnceKey("singletonMakeVarsProvidersKey")
|
||||||
// MakeVarsProviders to run.
|
|
||||||
func registerSingletonMakeVarsProvider(singleton SingletonMakeVarsProvider) {
|
// registerSingletonMakeVarsProvider adds a singleton that implements SingletonMakeVarsProvider to
|
||||||
singletonMakeVarsProviders = append(singletonMakeVarsProviders,
|
// the list of MakeVarsProviders to run.
|
||||||
makeVarsProvider{pctx, SingletonmakeVarsProviderAdapter(singleton)})
|
func registerSingletonMakeVarsProvider(config Config, singleton SingletonMakeVarsProvider) {
|
||||||
|
// Singletons are registered on the Context and may be different between different Contexts,
|
||||||
|
// for example when running multiple tests. Store the SingletonMakeVarsProviders in the
|
||||||
|
// Config so they are attached to the Context.
|
||||||
|
singletonMakeVarsProviders := config.Once(singletonMakeVarsProvidersKey, func() interface{} {
|
||||||
|
return &[]makeVarsProvider{}
|
||||||
|
}).(*[]makeVarsProvider)
|
||||||
|
|
||||||
|
*singletonMakeVarsProviders = append(*singletonMakeVarsProviders,
|
||||||
|
makeVarsProvider{pctx, singletonMakeVarsProviderAdapter(singleton)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// SingletonmakeVarsProviderAdapter converts a SingletonMakeVarsProvider to a MakeVarsProvider.
|
// singletonMakeVarsProviderAdapter converts a SingletonMakeVarsProvider to a MakeVarsProvider.
|
||||||
func SingletonmakeVarsProviderAdapter(singleton SingletonMakeVarsProvider) MakeVarsProvider {
|
func singletonMakeVarsProviderAdapter(singleton SingletonMakeVarsProvider) MakeVarsProvider {
|
||||||
return func(ctx MakeVarsContext) { singleton.MakeVars(ctx) }
|
return func(ctx MakeVarsContext) { singleton.MakeVars(ctx) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,9 +184,6 @@ type makeVarsProvider struct {
|
|||||||
// Collection of makevars providers that are registered in init() methods.
|
// Collection of makevars providers that are registered in init() methods.
|
||||||
var makeVarsInitProviders []makeVarsProvider
|
var makeVarsInitProviders []makeVarsProvider
|
||||||
|
|
||||||
// Collection of singleton makevars providers that are not registered as part of init() methods.
|
|
||||||
var singletonMakeVarsProviders []makeVarsProvider
|
|
||||||
|
|
||||||
type makeVarsContext struct {
|
type makeVarsContext struct {
|
||||||
SingletonContext
|
SingletonContext
|
||||||
config Config
|
config Config
|
||||||
@@ -224,7 +230,11 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) {
|
|||||||
var vars []makeVarsVariable
|
var vars []makeVarsVariable
|
||||||
var dists []dist
|
var dists []dist
|
||||||
var phonies []phony
|
var phonies []phony
|
||||||
for _, provider := range append(makeVarsInitProviders) {
|
|
||||||
|
providers := append([]makeVarsProvider(nil), makeVarsInitProviders...)
|
||||||
|
providers = append(providers, *ctx.Config().Get(singletonMakeVarsProvidersKey).(*[]makeVarsProvider)...)
|
||||||
|
|
||||||
|
for _, provider := range providers {
|
||||||
mctx := &makeVarsContext{
|
mctx := &makeVarsContext{
|
||||||
SingletonContext: ctx,
|
SingletonContext: ctx,
|
||||||
pctx: provider.pctx,
|
pctx: provider.pctx,
|
||||||
@@ -237,25 +247,6 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) {
|
|||||||
dists = append(dists, mctx.dists...)
|
dists = append(dists, mctx.dists...)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, provider := range append(singletonMakeVarsProviders) {
|
|
||||||
mctx := &makeVarsContext{
|
|
||||||
SingletonContext: ctx,
|
|
||||||
pctx: provider.pctx,
|
|
||||||
}
|
|
||||||
|
|
||||||
provider.call(mctx)
|
|
||||||
|
|
||||||
vars = append(vars, mctx.vars...)
|
|
||||||
phonies = append(phonies, mctx.phonies...)
|
|
||||||
dists = append(dists, mctx.dists...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear singleton makevars providers after use. Since these are in-memory
|
|
||||||
// singletons, this ensures state is reset if the build tree is processed
|
|
||||||
// multiple times.
|
|
||||||
// TODO(cparsons): Clean up makeVarsProviders to be part of the context.
|
|
||||||
singletonMakeVarsProviders = nil
|
|
||||||
|
|
||||||
ctx.VisitAllModules(func(m Module) {
|
ctx.VisitAllModules(func(m Module) {
|
||||||
if provider, ok := m.(ModuleMakeVarsProvider); ok && m.Enabled() {
|
if provider, ok := m.(ModuleMakeVarsProvider); ok && m.Enabled() {
|
||||||
mctx := &makeVarsContext{
|
mctx := &makeVarsContext{
|
||||||
|
43
android/ninja_deps.go
Normal file
43
android/ninja_deps.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2020 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 android
|
||||||
|
|
||||||
|
import "sort"
|
||||||
|
|
||||||
|
func (c *config) addNinjaFileDeps(deps ...string) {
|
||||||
|
for _, dep := range deps {
|
||||||
|
c.ninjaFileDepsSet.Store(dep, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) ninjaFileDeps() []string {
|
||||||
|
var deps []string
|
||||||
|
c.ninjaFileDepsSet.Range(func(key, value interface{}) bool {
|
||||||
|
deps = append(deps, key.(string))
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
sort.Strings(deps)
|
||||||
|
return deps
|
||||||
|
}
|
||||||
|
|
||||||
|
func ninjaDepsSingletonFactory() Singleton {
|
||||||
|
return &ninjaDepsSingleton{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ninjaDepsSingleton struct{}
|
||||||
|
|
||||||
|
func (ninjaDepsSingleton) GenerateBuildActions(ctx SingletonContext) {
|
||||||
|
ctx.AddNinjaFileDeps(ctx.Config().ninjaFileDeps()...)
|
||||||
|
}
|
75
android/ninja_deps_test.go
Normal file
75
android/ninja_deps_test.go
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
// Copyright 2020 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 android
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// This variable uses ExistentPathForSource on a PackageVarContext, which is a PathContext
|
||||||
|
// that is not a PathGlobContext. That requires the deps to be stored in the Config.
|
||||||
|
pctx.VariableFunc("test_ninja_deps_variable", func(ctx PackageVarContext) string {
|
||||||
|
// Using ExistentPathForSource to look for a file that does not exist in a directory that
|
||||||
|
// does exist (test_ninja_deps) from a PackageVarContext adds a dependency from build.ninja
|
||||||
|
// to the directory.
|
||||||
|
if ExistentPathForSource(ctx, "test_ninja_deps/does_not_exist").Valid() {
|
||||||
|
return "true"
|
||||||
|
} else {
|
||||||
|
return "false"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testNinjaDepsSingletonFactory() Singleton {
|
||||||
|
return testNinjaDepsSingleton{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type testNinjaDepsSingleton struct{}
|
||||||
|
|
||||||
|
func (testNinjaDepsSingleton) GenerateBuildActions(ctx SingletonContext) {
|
||||||
|
// Reference the test_ninja_deps_variable in a build statement so Blueprint is forced to
|
||||||
|
// evaluate it.
|
||||||
|
ctx.Build(pctx, BuildParams{
|
||||||
|
Rule: Cp,
|
||||||
|
Input: PathForTesting("foo"),
|
||||||
|
Output: PathForOutput(ctx, "test_ninja_deps_out"),
|
||||||
|
Args: map[string]string{
|
||||||
|
"cpFlags": "${test_ninja_deps_variable}",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNinjaDeps(t *testing.T) {
|
||||||
|
fs := map[string][]byte{
|
||||||
|
"test_ninja_deps/exists": nil,
|
||||||
|
}
|
||||||
|
config := TestConfig(buildDir, nil, "", fs)
|
||||||
|
|
||||||
|
ctx := NewTestContext(config)
|
||||||
|
ctx.RegisterSingletonType("test_ninja_deps_singleton", testNinjaDepsSingletonFactory)
|
||||||
|
ctx.RegisterSingletonType("ninja_deps_singleton", ninjaDepsSingletonFactory)
|
||||||
|
ctx.Register()
|
||||||
|
|
||||||
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||||
|
FailIfErrored(t, errs)
|
||||||
|
ninjaDeps, errs := ctx.PrepareBuildActions(config)
|
||||||
|
FailIfErrored(t, errs)
|
||||||
|
|
||||||
|
// Verify that the ninja file has a dependency on the test_ninja_deps directory.
|
||||||
|
if g, w := ninjaDeps, "test_ninja_deps"; !InList(w, g) {
|
||||||
|
t.Errorf("expected %q in %q", w, g)
|
||||||
|
}
|
||||||
|
}
|
@@ -56,7 +56,7 @@ func (e *configErrorWrapper) Errorf(format string, args ...interface{}) {
|
|||||||
e.errors = append(e.errors, fmt.Errorf(format, args...))
|
e.errors = append(e.errors, fmt.Errorf(format, args...))
|
||||||
}
|
}
|
||||||
func (e *configErrorWrapper) AddNinjaFileDeps(deps ...string) {
|
func (e *configErrorWrapper) AddNinjaFileDeps(deps ...string) {
|
||||||
e.pctx.AddNinjaFileDeps(deps...)
|
e.config.addNinjaFileDeps(deps...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type PackageVarContext interface {
|
type PackageVarContext interface {
|
||||||
|
@@ -29,7 +29,7 @@ var moduleTypes []moduleType
|
|||||||
|
|
||||||
type singleton struct {
|
type singleton struct {
|
||||||
name string
|
name string
|
||||||
factory blueprint.SingletonFactory
|
factory SingletonFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
var singletons []singleton
|
var singletons []singleton
|
||||||
@@ -57,11 +57,11 @@ type SingletonFactory func() Singleton
|
|||||||
|
|
||||||
// SingletonFactoryAdaptor wraps a SingletonFactory into a blueprint.SingletonFactory by converting
|
// SingletonFactoryAdaptor wraps a SingletonFactory into a blueprint.SingletonFactory by converting
|
||||||
// a Singleton into a blueprint.Singleton
|
// a Singleton into a blueprint.Singleton
|
||||||
func SingletonFactoryAdaptor(factory SingletonFactory) blueprint.SingletonFactory {
|
func SingletonFactoryAdaptor(ctx *Context, factory SingletonFactory) blueprint.SingletonFactory {
|
||||||
return func() blueprint.Singleton {
|
return func() blueprint.Singleton {
|
||||||
singleton := factory()
|
singleton := factory()
|
||||||
if makevars, ok := singleton.(SingletonMakeVarsProvider); ok {
|
if makevars, ok := singleton.(SingletonMakeVarsProvider); ok {
|
||||||
registerSingletonMakeVarsProvider(makevars)
|
registerSingletonMakeVarsProvider(ctx.config, makevars)
|
||||||
}
|
}
|
||||||
return &singletonAdaptor{Singleton: singleton}
|
return &singletonAdaptor{Singleton: singleton}
|
||||||
}
|
}
|
||||||
@@ -72,11 +72,11 @@ func RegisterModuleType(name string, factory ModuleFactory) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RegisterSingletonType(name string, factory SingletonFactory) {
|
func RegisterSingletonType(name string, factory SingletonFactory) {
|
||||||
singletons = append(singletons, singleton{name, SingletonFactoryAdaptor(factory)})
|
singletons = append(singletons, singleton{name, factory})
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterPreSingletonType(name string, factory SingletonFactory) {
|
func RegisterPreSingletonType(name string, factory SingletonFactory) {
|
||||||
preSingletons = append(preSingletons, singleton{name, SingletonFactoryAdaptor(factory)})
|
preSingletons = append(preSingletons, singleton{name, factory})
|
||||||
}
|
}
|
||||||
|
|
||||||
type Context struct {
|
type Context struct {
|
||||||
@@ -92,7 +92,7 @@ func NewContext(config Config) *Context {
|
|||||||
|
|
||||||
func (ctx *Context) Register() {
|
func (ctx *Context) Register() {
|
||||||
for _, t := range preSingletons {
|
for _, t := range preSingletons {
|
||||||
ctx.RegisterPreSingletonType(t.name, t.factory)
|
ctx.RegisterPreSingletonType(t.name, SingletonFactoryAdaptor(ctx, t.factory))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, t := range moduleTypes {
|
for _, t := range moduleTypes {
|
||||||
@@ -100,21 +100,23 @@ func (ctx *Context) Register() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, t := range singletons {
|
for _, t := range singletons {
|
||||||
ctx.RegisterSingletonType(t.name, t.factory)
|
ctx.RegisterSingletonType(t.name, SingletonFactoryAdaptor(ctx, t.factory))
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMutators(ctx.Context, preArch, preDeps, postDeps, finalDeps)
|
registerMutators(ctx.Context, preArch, preDeps, postDeps, finalDeps)
|
||||||
|
|
||||||
ctx.RegisterSingletonType("bazeldeps", SingletonFactoryAdaptor(BazelSingleton))
|
ctx.RegisterSingletonType("bazeldeps", SingletonFactoryAdaptor(ctx, BazelSingleton))
|
||||||
|
|
||||||
// Register phony just before makevars so it can write out its phony rules as Make rules
|
// Register phony just before makevars so it can write out its phony rules as Make rules
|
||||||
ctx.RegisterSingletonType("phony", SingletonFactoryAdaptor(phonySingletonFactory))
|
ctx.RegisterSingletonType("phony", SingletonFactoryAdaptor(ctx, phonySingletonFactory))
|
||||||
|
|
||||||
// Register makevars after other singletons so they can export values through makevars
|
// Register makevars after other singletons so they can export values through makevars
|
||||||
ctx.RegisterSingletonType("makevars", SingletonFactoryAdaptor(makeVarsSingletonFunc))
|
ctx.RegisterSingletonType("makevars", SingletonFactoryAdaptor(ctx, makeVarsSingletonFunc))
|
||||||
|
|
||||||
// Register env last so that it can track all used environment variables
|
// Register env and ninjadeps last so that they can track all used environment variables and
|
||||||
ctx.RegisterSingletonType("env", SingletonFactoryAdaptor(EnvSingleton))
|
// Ninja file dependencies stored in the config.
|
||||||
|
ctx.RegisterSingletonType("env", SingletonFactoryAdaptor(ctx, EnvSingleton))
|
||||||
|
ctx.RegisterSingletonType("ninjadeps", SingletonFactoryAdaptor(ctx, ninjaDepsSingletonFactory))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ModuleTypeFactories() map[string]ModuleFactory {
|
func ModuleTypeFactories() map[string]ModuleFactory {
|
||||||
|
@@ -104,7 +104,7 @@ func (ctx *TestContext) RegisterModuleType(name string, factory ModuleFactory) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *TestContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
func (ctx *TestContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
||||||
ctx.Context.RegisterSingletonType(name, SingletonFactoryAdaptor(factory))
|
ctx.Context.RegisterSingletonType(name, SingletonFactoryAdaptor(ctx.Context, factory))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *TestContext) ModuleForTests(name, variant string) TestingModule {
|
func (ctx *TestContext) ModuleForTests(name, variant string) TestingModule {
|
||||||
|
14
cc/cc.go
14
cc/cc.go
@@ -88,7 +88,7 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {
|
|||||||
ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
|
ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
|
||||||
})
|
})
|
||||||
|
|
||||||
android.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
|
ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Deps struct {
|
type Deps struct {
|
||||||
@@ -369,7 +369,7 @@ type ModuleContextIntf interface {
|
|||||||
useSdk() bool
|
useSdk() bool
|
||||||
sdkVersion() string
|
sdkVersion() string
|
||||||
useVndk() bool
|
useVndk() bool
|
||||||
isNdk() bool
|
isNdk(config android.Config) bool
|
||||||
isLlndk(config android.Config) bool
|
isLlndk(config android.Config) bool
|
||||||
isLlndkPublic(config android.Config) bool
|
isLlndkPublic(config android.Config) bool
|
||||||
isVndkPrivate(config android.Config) bool
|
isVndkPrivate(config android.Config) bool
|
||||||
@@ -939,8 +939,8 @@ func (c *Module) isCoverageVariant() bool {
|
|||||||
return c.coverage.Properties.IsCoverageVariant
|
return c.coverage.Properties.IsCoverageVariant
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Module) IsNdk() bool {
|
func (c *Module) IsNdk(config android.Config) bool {
|
||||||
return inList(c.BaseModuleName(), ndkKnownLibs)
|
return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Module) isLlndk(config android.Config) bool {
|
func (c *Module) isLlndk(config android.Config) bool {
|
||||||
@@ -1145,8 +1145,8 @@ func (ctx *moduleContextImpl) useVndk() bool {
|
|||||||
return ctx.mod.UseVndk()
|
return ctx.mod.UseVndk()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *moduleContextImpl) isNdk() bool {
|
func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
|
||||||
return ctx.mod.IsNdk()
|
return ctx.mod.IsNdk(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
|
func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
|
||||||
@@ -1766,7 +1766,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
for _, entry := range list {
|
for _, entry := range list {
|
||||||
// strip #version suffix out
|
// strip #version suffix out
|
||||||
name, _ := StubsLibNameAndVersion(entry)
|
name, _ := StubsLibNameAndVersion(entry)
|
||||||
if ctx.useSdk() && inList(name, ndkKnownLibs) {
|
if ctx.useSdk() && inList(name, *getNDKKnownLibs(ctx.Config())) {
|
||||||
variantLibs = append(variantLibs, name+ndkLibrarySuffix)
|
variantLibs = append(variantLibs, name+ndkLibrarySuffix)
|
||||||
} else if ctx.useVndk() {
|
} else if ctx.useVndk() {
|
||||||
nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
|
nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
|
||||||
|
@@ -567,7 +567,7 @@ func (library *libraryDecorator) classifySourceAbiDump(ctx ModuleContext) string
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
// Return NDK if the library is both NDK and LLNDK.
|
// Return NDK if the library is both NDK and LLNDK.
|
||||||
if ctx.isNdk() {
|
if ctx.isNdk(ctx.Config()) {
|
||||||
return "NDK"
|
return "NDK"
|
||||||
}
|
}
|
||||||
if ctx.isLlndkPublic(ctx.Config()) {
|
if ctx.isLlndkPublic(ctx.Config()) {
|
||||||
@@ -1099,7 +1099,7 @@ func (library *libraryDecorator) coverageOutputFilePath() android.OptionalPath {
|
|||||||
|
|
||||||
func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path {
|
func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path {
|
||||||
// The logic must be consistent with classifySourceAbiDump.
|
// The logic must be consistent with classifySourceAbiDump.
|
||||||
isNdk := ctx.isNdk()
|
isNdk := ctx.isNdk(ctx.Config())
|
||||||
isLlndkOrVndk := ctx.isLlndkPublic(ctx.Config()) || (ctx.useVndk() && ctx.isVndk())
|
isLlndkOrVndk := ctx.isLlndkPublic(ctx.Config()) || (ctx.useVndk() && ctx.isVndk())
|
||||||
|
|
||||||
refAbiDumpTextFile := android.PathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isLlndkOrVndk, false)
|
refAbiDumpTextFile := android.PathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isLlndkOrVndk, false)
|
||||||
@@ -1153,7 +1153,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec
|
|||||||
library.sAbiDiff = SourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
|
library.sAbiDiff = SourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
|
||||||
refAbiDumpFile, fileName, exportedHeaderFlags,
|
refAbiDumpFile, fileName, exportedHeaderFlags,
|
||||||
Bool(library.Properties.Header_abi_checker.Check_all_apis),
|
Bool(library.Properties.Header_abi_checker.Check_all_apis),
|
||||||
ctx.isLlndk(ctx.Config()), ctx.isNdk(), ctx.isVndkExt())
|
ctx.isLlndk(ctx.Config()), ctx.isNdk(ctx.Config()), ctx.isVndkExt())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -171,6 +171,7 @@ func makeVarsProvider(ctx android.MakeVarsContext) {
|
|||||||
ctx.StrictRaw("SRC_HEADERS", strings.Join(includes, " "))
|
ctx.StrictRaw("SRC_HEADERS", strings.Join(includes, " "))
|
||||||
ctx.StrictRaw("SRC_SYSTEM_HEADERS", strings.Join(systemIncludes, " "))
|
ctx.StrictRaw("SRC_SYSTEM_HEADERS", strings.Join(systemIncludes, " "))
|
||||||
|
|
||||||
|
ndkKnownLibs := *getNDKKnownLibs(ctx.Config())
|
||||||
sort.Strings(ndkKnownLibs)
|
sort.Strings(ndkKnownLibs)
|
||||||
ctx.Strict("NDK_KNOWN_LIBS", strings.Join(ndkKnownLibs, " "))
|
ctx.Strict("NDK_KNOWN_LIBS", strings.Join(ndkKnownLibs, " "))
|
||||||
|
|
||||||
|
@@ -45,8 +45,7 @@ var (
|
|||||||
|
|
||||||
ndkLibrarySuffix = ".ndk"
|
ndkLibrarySuffix = ".ndk"
|
||||||
|
|
||||||
// Added as a variation dependency via depsMutator.
|
ndkKnownLibsKey = android.NewOnceKey("ndkKnownLibsKey")
|
||||||
ndkKnownLibs = []string{}
|
|
||||||
// protects ndkKnownLibs writes during parallel BeginMutator.
|
// protects ndkKnownLibs writes during parallel BeginMutator.
|
||||||
ndkKnownLibsLock sync.Mutex
|
ndkKnownLibsLock sync.Mutex
|
||||||
)
|
)
|
||||||
@@ -158,6 +157,12 @@ func (this *stubDecorator) initializeProperties(ctx BaseModuleContext) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getNDKKnownLibs(config android.Config) *[]string {
|
||||||
|
return config.Once(ndkKnownLibsKey, func() interface{} {
|
||||||
|
return &[]string{}
|
||||||
|
}).(*[]string)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *stubDecorator) compilerInit(ctx BaseModuleContext) {
|
func (c *stubDecorator) compilerInit(ctx BaseModuleContext) {
|
||||||
c.baseCompiler.compilerInit(ctx)
|
c.baseCompiler.compilerInit(ctx)
|
||||||
|
|
||||||
@@ -168,12 +173,13 @@ func (c *stubDecorator) compilerInit(ctx BaseModuleContext) {
|
|||||||
|
|
||||||
ndkKnownLibsLock.Lock()
|
ndkKnownLibsLock.Lock()
|
||||||
defer ndkKnownLibsLock.Unlock()
|
defer ndkKnownLibsLock.Unlock()
|
||||||
for _, lib := range ndkKnownLibs {
|
ndkKnownLibs := getNDKKnownLibs(ctx.Config())
|
||||||
|
for _, lib := range *ndkKnownLibs {
|
||||||
if lib == name {
|
if lib == name {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ndkKnownLibs = append(ndkKnownLibs, name)
|
*ndkKnownLibs = append(*ndkKnownLibs, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func addStubLibraryCompilerFlags(flags Flags) Flags {
|
func addStubLibraryCompilerFlags(flags Flags) Flags {
|
||||||
|
@@ -890,7 +890,7 @@ func collectAppDeps(ctx android.ModuleContext, app appDepsInterface,
|
|||||||
|
|
||||||
if IsJniDepTag(tag) || cc.IsSharedDepTag(tag) {
|
if IsJniDepTag(tag) || cc.IsSharedDepTag(tag) {
|
||||||
if dep, ok := module.(*cc.Module); ok {
|
if dep, ok := module.(*cc.Module); ok {
|
||||||
if dep.IsNdk() || dep.IsStubs() {
|
if dep.IsNdk(ctx.Config()) || dep.IsStubs() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -92,8 +92,8 @@ func testContext(config android.Config) *android.TestContext {
|
|||||||
|
|
||||||
ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators)
|
ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators)
|
||||||
ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
|
ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
|
||||||
ctx.RegisterPreSingletonType("overlay", android.SingletonFactoryAdaptor(OverlaySingletonFactory))
|
ctx.RegisterPreSingletonType("overlay", android.SingletonFactoryAdaptor(ctx.Context, OverlaySingletonFactory))
|
||||||
ctx.RegisterPreSingletonType("sdk_versions", android.SingletonFactoryAdaptor(sdkPreSingletonFactory))
|
ctx.RegisterPreSingletonType("sdk_versions", android.SingletonFactoryAdaptor(ctx.Context, sdkPreSingletonFactory))
|
||||||
|
|
||||||
android.RegisterPrebuiltMutators(ctx)
|
android.RegisterPrebuiltMutators(ctx)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user