Merge "Make apex.overrides overridable by override_apex."
diff --git a/Android.bp b/Android.bp
index d469f41..7576102 100644
--- a/Android.bp
+++ b/Android.bp
@@ -298,6 +298,7 @@
"java/sdk.go",
"java/sdk_library.go",
"java/support_libraries.go",
+ "java/sysprop.go",
"java/system_modules.go",
"java/testing.go",
"java/tradefed.go",
diff --git a/android/androidmk_test.go b/android/androidmk_test.go
index 940e324..71f8020 100644
--- a/android/androidmk_test.go
+++ b/android/androidmk_test.go
@@ -43,14 +43,6 @@
}
func TestAndroidMkSingleton_PassesUpdatedAndroidMkDataToCustomCallback(t *testing.T) {
- config := TestConfig(buildDir, nil)
- config.inMake = true // Enable androidmk Singleton
-
- ctx := NewTestContext()
- ctx.RegisterSingletonType("androidmk", AndroidMkSingleton)
- ctx.RegisterModuleType("custom", customModuleFactory)
- ctx.Register()
-
bp := `
custom {
name: "foo",
@@ -60,9 +52,13 @@
}
`
- ctx.MockFileSystem(map[string][]byte{
- "Android.bp": []byte(bp),
- })
+ config := TestConfig(buildDir, nil, bp, nil)
+ config.inMake = true // Enable androidmk Singleton
+
+ ctx := NewTestContext()
+ ctx.RegisterSingletonType("androidmk", AndroidMkSingleton)
+ ctx.RegisterModuleType("custom", customModuleFactory)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
diff --git a/android/apex.go b/android/apex.go
index 77000da..1b0412b 100644
--- a/android/apex.go
+++ b/android/apex.go
@@ -228,6 +228,14 @@
apexNames[apexName] = apexNames[apexName] || directDep
}
+// TODO(b/146393795): remove this when b/146393795 is fixed
+func ClearApexDependency() {
+ m := apexNamesMap()
+ for k := range m {
+ delete(m, k)
+ }
+}
+
// Tests whether a module named moduleName is directly depended on by an APEX
// named apexName.
func DirectlyInApex(apexName string, moduleName string) bool {
diff --git a/android/arch.go b/android/arch.go
index 0519e76..b5b8a8f 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -822,9 +822,12 @@
os := base.commonProperties.CompileOS
osTargets := mctx.Config().Targets[os]
-
+ image := base.commonProperties.ImageVariation
// Filter NativeBridge targets unless they are explicitly supported
- if os == Android && !Bool(base.commonProperties.Native_bridge_supported) {
+ // Skip creating native bridge variants for vendor modules
+ if os == Android &&
+ !(Bool(base.commonProperties.Native_bridge_supported) && image == CoreVariation) {
+
var targets []Target
for _, t := range osTargets {
if !t.NativeBridge {
@@ -859,6 +862,12 @@
}
}
+ if image == RecoveryVariation {
+ primaryArch := mctx.Config().DevicePrimaryArchType()
+ targets = filterToArch(targets, primaryArch)
+ multiTargets = filterToArch(multiTargets, primaryArch)
+ }
+
if len(targets) == 0 {
base.commonProperties.Enabled = boolPtr(false)
return
@@ -907,6 +916,16 @@
}
}
+func filterToArch(targets []Target, arch ArchType) []Target {
+ for i := 0; i < len(targets); i++ {
+ if targets[i].Arch.ArchType != arch {
+ targets = append(targets[:i], targets[i+1:]...)
+ i--
+ }
+ }
+ return targets
+}
+
// createArchType takes a reflect.Type that is either a struct or a pointer to a struct, and returns a list of
// reflect.Type that contains the arch-variant properties inside structs for each architecture, os, target, multilib,
// etc.
@@ -1583,6 +1602,15 @@
}
}
+func getAmlAbisConfig() []archConfig {
+ return []archConfig{
+ {"arm", "armv7-a", "", []string{"armeabi-v7a"}},
+ {"arm64", "armv8-a", "", []string{"arm64-v8a"}},
+ {"x86", "", "", []string{"x86"}},
+ {"x86_64", "", "", []string{"x86_64"}},
+ }
+}
+
func decodeArchSettings(os OsType, archConfigs []archConfig) ([]Target, error) {
var ret []Target
diff --git a/android/arch_test.go b/android/arch_test.go
index b41e1ab..98b0534 100644
--- a/android/arch_test.go
+++ b/android/arch_test.go
@@ -289,10 +289,6 @@
}
`
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
-
testCases := []struct {
name string
config func(Config)
@@ -337,11 +333,11 @@
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
+ config := TestArchConfig(buildDir, nil, bp, nil)
+
ctx := NewTestArchContext()
ctx.RegisterModuleType("module", archTestModuleFactory)
- ctx.MockFileSystem(mockFS)
- ctx.Register()
- config := TestArchConfig(buildDir, nil)
+ ctx.Register(config)
if tt.config != nil {
tt.config(config)
}
diff --git a/android/config.go b/android/config.go
index e1db55d..291d36f 100644
--- a/android/config.go
+++ b/android/config.go
@@ -25,7 +25,9 @@
"strings"
"sync"
+ "github.com/google/blueprint"
"github.com/google/blueprint/bootstrap"
+ "github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
)
@@ -115,6 +117,9 @@
stopBefore bootstrap.StopBefore
+ fs pathtools.FileSystem
+ mockBpList string
+
OncePer
}
@@ -200,7 +205,7 @@
}
// TestConfig returns a Config object suitable for using for tests
-func TestConfig(buildDir string, env map[string]string) Config {
+func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
envCopy := make(map[string]string)
for k, v := range env {
envCopy[k] = v
@@ -231,6 +236,8 @@
}
config.TestProductVariables = &config.productVariables
+ config.mockFileSystem(bp, fs)
+
if err := config.fromEnv(); err != nil {
panic(err)
}
@@ -238,8 +245,8 @@
return Config{config}
}
-func TestArchConfigNativeBridge(buildDir string, env map[string]string) Config {
- testConfig := TestArchConfig(buildDir, env)
+func TestArchConfigNativeBridge(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
+ testConfig := TestArchConfig(buildDir, env, bp, fs)
config := testConfig.config
config.Targets[Android] = []Target{
@@ -252,8 +259,8 @@
return testConfig
}
-func TestArchConfigFuchsia(buildDir string, env map[string]string) Config {
- testConfig := TestConfig(buildDir, env)
+func TestArchConfigFuchsia(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
+ testConfig := TestConfig(buildDir, env, bp, fs)
config := testConfig.config
config.Targets = map[OsType][]Target{
@@ -269,8 +276,8 @@
}
// TestConfig returns a Config object suitable for using for tests that need to run the arch mutator
-func TestArchConfig(buildDir string, env map[string]string) Config {
- testConfig := TestConfig(buildDir, env)
+func TestArchConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
+ testConfig := TestConfig(buildDir, env, bp, fs)
config := testConfig.config
config.Targets = map[OsType][]Target{
@@ -312,6 +319,8 @@
srcDir: srcDir,
buildDir: buildDir,
multilibConflicts: make(map[ArchType]bool),
+
+ fs: pathtools.OsFs,
}
config.deviceConfig = &deviceConfig{
@@ -355,6 +364,8 @@
archConfig = getMegaDeviceConfig()
} else if config.NdkAbis() {
archConfig = getNdkAbisConfig()
+ } else if config.AmlAbis() {
+ archConfig = getAmlAbisConfig()
}
if archConfig != nil {
@@ -387,6 +398,36 @@
return Config{config}, nil
}
+// mockFileSystem replaces all reads with accesses to the provided map of
+// filenames to contents stored as a byte slice.
+func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
+ mockFS := map[string][]byte{}
+
+ if _, exists := mockFS["Android.bp"]; !exists {
+ mockFS["Android.bp"] = []byte(bp)
+ }
+
+ for k, v := range fs {
+ mockFS[k] = v
+ }
+
+ // no module list file specified; find every file named Blueprints or Android.bp
+ pathsToParse := []string{}
+ for candidate := range mockFS {
+ base := filepath.Base(candidate)
+ if base == "Blueprints" || base == "Android.bp" {
+ pathsToParse = append(pathsToParse, candidate)
+ }
+ }
+ if len(pathsToParse) < 1 {
+ panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
+ }
+ mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
+
+ c.fs = pathtools.MockFs(mockFS)
+ c.mockBpList = blueprint.MockModuleListFile
+}
+
func (c *config) fromEnv() error {
switch c.Getenv("EXPERIMENTAL_JAVA_LANGUAGE_LEVEL_9") {
case "", "true":
@@ -1083,6 +1124,10 @@
return Bool(c.productVariables.Ndk_abis)
}
+func (c *config) AmlAbis() bool {
+ return Bool(c.productVariables.Aml_abis)
+}
+
func (c *config) ExcludeDraftNdkApis() bool {
return Bool(c.productVariables.Exclude_draft_ndk_apis)
}
diff --git a/android/csuite_config_test.go b/android/csuite_config_test.go
index 5f86bbb..bf1a19a 100644
--- a/android/csuite_config_test.go
+++ b/android/csuite_config_test.go
@@ -19,15 +19,11 @@
)
func testCSuiteConfig(test *testing.T, bpFileContents string) *TestContext {
- config := TestArchConfig(buildDir, nil)
+ config := TestArchConfig(buildDir, nil, bpFileContents, nil)
ctx := NewTestArchContext()
ctx.RegisterModuleType("csuite_config", CSuiteConfigFactory)
- ctx.Register()
- mockFiles := map[string][]byte{
- "Android.bp": []byte(bpFileContents),
- }
- ctx.MockFileSystem(mockFiles)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(test, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/android/defaults_test.go b/android/defaults_test.go
index 80980f7..ba607ef 100644
--- a/android/defaults_test.go
+++ b/android/defaults_test.go
@@ -58,19 +58,6 @@
}
func TestDefaultsAllowMissingDependencies(t *testing.T) {
- config := TestConfig(buildDir, nil)
- config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
-
- ctx := NewTestContext()
- ctx.SetAllowMissingDependencies(true)
-
- ctx.RegisterModuleType("test", defaultsTestModuleFactory)
- ctx.RegisterModuleType("defaults", defaultsTestDefaultsFactory)
-
- ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
-
- ctx.Register()
-
bp := `
defaults {
name: "defaults",
@@ -91,9 +78,18 @@
}
`
- ctx.MockFileSystem(map[string][]byte{
- "Android.bp": []byte(bp),
- })
+ config := TestConfig(buildDir, nil, bp, nil)
+ config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
+
+ ctx := NewTestContext()
+ ctx.SetAllowMissingDependencies(true)
+
+ ctx.RegisterModuleType("test", defaultsTestModuleFactory)
+ ctx.RegisterModuleType("defaults", defaultsTestDefaultsFactory)
+
+ ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
+
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
diff --git a/android/module.go b/android/module.go
index b858564..a14e575 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1005,6 +1005,7 @@
func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
return baseModuleContext{
BaseModuleContext: ctx,
+ os: m.commonProperties.CompileOS,
target: m.commonProperties.CompileTarget,
targetPrimary: m.commonProperties.CompilePrimary,
multiTargets: m.commonProperties.CompileMultiTargets,
@@ -1117,6 +1118,7 @@
type baseModuleContext struct {
blueprint.BaseModuleContext
+ os OsType
target Target
multiTargets []Target
targetPrimary bool
@@ -1460,27 +1462,27 @@
}
func (b *baseModuleContext) Os() OsType {
- return b.target.Os
+ return b.os
}
func (b *baseModuleContext) Host() bool {
- return b.target.Os.Class == Host || b.target.Os.Class == HostCross
+ return b.os.Class == Host || b.os.Class == HostCross
}
func (b *baseModuleContext) Device() bool {
- return b.target.Os.Class == Device
+ return b.os.Class == Device
}
func (b *baseModuleContext) Darwin() bool {
- return b.target.Os == Darwin
+ return b.os == Darwin
}
func (b *baseModuleContext) Fuchsia() bool {
- return b.target.Os == Fuchsia
+ return b.os == Fuchsia
}
func (b *baseModuleContext) Windows() bool {
- return b.target.Os == Windows
+ return b.os == Windows
}
func (b *baseModuleContext) Debug() bool {
@@ -1801,6 +1803,49 @@
OutputFiles(tag string) (Paths, error)
}
+// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
+// module produced zero paths, it reports errors to the ctx and returns nil.
+func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
+ paths, err := outputFilesForModule(ctx, module, tag)
+ if err != nil {
+ reportPathError(ctx, err)
+ return nil
+ }
+ return paths
+}
+
+// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
+// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
+func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
+ paths, err := outputFilesForModule(ctx, module, tag)
+ if err != nil {
+ reportPathError(ctx, err)
+ return nil
+ }
+ if len(paths) > 1 {
+ reportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
+ pathContextName(ctx, module))
+ return nil
+ }
+ return paths[0]
+}
+
+func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
+ if outputFileProducer, ok := module.(OutputFileProducer); ok {
+ paths, err := outputFileProducer.OutputFiles(tag)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get output file from module %q: %s",
+ pathContextName(ctx, module), err.Error())
+ }
+ if len(paths) == 0 {
+ return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
+ }
+ return paths, nil
+ } else {
+ return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
+ }
+}
+
type HostToolProvider interface {
HostToolPath() OptionalPath
}
diff --git a/android/module_test.go b/android/module_test.go
index fef1766..6e648d7 100644
--- a/android/module_test.go
+++ b/android/module_test.go
@@ -178,15 +178,9 @@
}
`
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
+ config := TestConfig(buildDir, nil, bp, nil)
- ctx.MockFileSystem(mockFS)
-
- ctx.Register()
-
- config := TestConfig(buildDir, nil)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
diff --git a/android/mutator.go b/android/mutator.go
index e9ccd7f..c2bae44 100644
--- a/android/mutator.go
+++ b/android/mutator.go
@@ -87,9 +87,9 @@
func registerArchMutator(ctx RegisterMutatorsContext) {
ctx.BottomUp("os", osMutator).Parallel()
+ ctx.BottomUp("image", imageMutator).Parallel()
ctx.BottomUp("arch", archMutator).Parallel()
ctx.TopDown("arch_hooks", archHookMutator).Parallel()
- ctx.BottomUp("image", imageMutator).Parallel()
}
var preDeps = []RegisterMutatorFunc{
diff --git a/android/mutator_test.go b/android/mutator_test.go
index 2350fdb..d179f9d 100644
--- a/android/mutator_test.go
+++ b/android/mutator_test.go
@@ -56,7 +56,15 @@
}
func TestMutatorAddMissingDependencies(t *testing.T) {
- config := TestConfig(buildDir, nil)
+ bp := `
+ test {
+ name: "foo",
+ deps_missing_deps: ["regular_missing_dep"],
+ mutator_missing_deps: ["added_missing_dep"],
+ }
+ `
+
+ config := TestConfig(buildDir, nil, bp, nil)
config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
ctx := NewTestContext()
@@ -67,21 +75,7 @@
ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator)
})
- bp := `
- test {
- name: "foo",
- deps_missing_deps: ["regular_missing_dep"],
- mutator_missing_deps: ["added_missing_dep"],
- }
- `
-
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
-
- ctx.MockFileSystem(mockFS)
-
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
@@ -139,15 +133,9 @@
}
`
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
+ config := TestConfig(buildDir, nil, bp, nil)
- ctx.MockFileSystem(mockFS)
-
- ctx.Register()
-
- config := TestConfig(buildDir, nil)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
diff --git a/android/namespace_test.go b/android/namespace_test.go
index 90058e3..66c0d89 100644
--- a/android/namespace_test.go
+++ b/android/namespace_test.go
@@ -633,10 +633,9 @@
}
func setupTestFromFiles(bps map[string][]byte) (ctx *TestContext, errs []error) {
- config := TestConfig(buildDir, nil)
+ config := TestConfig(buildDir, nil, "", bps)
ctx = NewTestContext()
- ctx.MockFileSystem(bps)
ctx.RegisterModuleType("test_module", newTestModule)
ctx.RegisterModuleType("soong_namespace", NamespaceFactory)
ctx.Context.RegisterModuleType("blueprint_test_module", newBlueprintTestModule)
@@ -644,7 +643,7 @@
ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) {
ctx.BottomUp("rename", renameMutator)
})
- ctx.Register()
+ ctx.Register(config)
_, errs = ctx.ParseBlueprintsFiles("Android.bp")
if len(errs) > 0 {
diff --git a/android/neverallow_test.go b/android/neverallow_test.go
index bd94e37..6f07a4a 100644
--- a/android/neverallow_test.go
+++ b/android/neverallow_test.go
@@ -44,11 +44,11 @@
NeverAllow().InDirectDeps("not_allowed_in_direct_deps"),
},
fs: map[string][]byte{
- "top/Blueprints": []byte(`
+ "top/Android.bp": []byte(`
cc_library {
name: "not_allowed_in_direct_deps",
}`),
- "other/Blueprints": []byte(`
+ "other/Android.bp": []byte(`
cc_library {
name: "libother",
static_libs: ["not_allowed_in_direct_deps"],
@@ -65,7 +65,7 @@
{
name: "include_dir not allowed to reference art",
fs: map[string][]byte{
- "other/Blueprints": []byte(`
+ "other/Android.bp": []byte(`
cc_library {
name: "libother",
include_dirs: ["art/libdexfile/include"],
@@ -78,7 +78,7 @@
{
name: "include_dir can reference another location",
fs: map[string][]byte{
- "other/Blueprints": []byte(`
+ "other/Android.bp": []byte(`
cc_library {
name: "libother",
include_dirs: ["another/include"],
@@ -89,7 +89,7 @@
{
name: "no vndk.enabled under vendor directory",
fs: map[string][]byte{
- "vendor/Blueprints": []byte(`
+ "vendor/Android.bp": []byte(`
cc_library {
name: "libvndk",
vendor_available: true,
@@ -105,7 +105,7 @@
{
name: "no vndk.enabled under device directory",
fs: map[string][]byte{
- "device/Blueprints": []byte(`
+ "device/Android.bp": []byte(`
cc_library {
name: "libvndk",
vendor_available: true,
@@ -121,7 +121,7 @@
{
name: "vndk-ext under vendor or device directory",
fs: map[string][]byte{
- "device/Blueprints": []byte(`
+ "device/Android.bp": []byte(`
cc_library {
name: "libvndk1_ext",
vendor: true,
@@ -129,7 +129,7 @@
enabled: true,
},
}`),
- "vendor/Blueprints": []byte(`
+ "vendor/Android.bp": []byte(`
cc_library {
name: "libvndk2_ext",
vendor: true,
@@ -143,7 +143,7 @@
{
name: "no enforce_vintf_manifest.cflags",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
cc_library {
name: "libexample",
product_variables: {
@@ -161,7 +161,7 @@
{
name: "no treble_linker_namespaces.cflags",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
cc_library {
name: "libexample",
product_variables: {
@@ -178,7 +178,7 @@
{
name: "libc_bionic_ndk treble_linker_namespaces.cflags",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
cc_library {
name: "libc_bionic_ndk",
product_variables: {
@@ -192,7 +192,7 @@
{
name: "dependency on updatable-media",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
java_library {
name: "needs_updatable_media",
libs: ["updatable-media"],
@@ -205,7 +205,7 @@
{
name: "java_device_for_host",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
java_device_for_host {
name: "device_for_host",
libs: ["core-libart"],
@@ -219,7 +219,7 @@
{
name: "sdk_version: \"none\" inside core libraries",
fs: map[string][]byte{
- "libcore/Blueprints": []byte(`
+ "libcore/Android.bp": []byte(`
java_library {
name: "inside_core_libraries",
sdk_version: "none",
@@ -229,7 +229,7 @@
{
name: "sdk_version: \"none\" outside core libraries",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
java_library {
name: "outside_core_libraries",
sdk_version: "none",
@@ -242,7 +242,7 @@
{
name: "sdk_version: \"current\"",
fs: map[string][]byte{
- "Blueprints": []byte(`
+ "Android.bp": []byte(`
java_library {
name: "outside_core_libraries",
sdk_version: "current",
@@ -254,31 +254,29 @@
func TestNeverallow(t *testing.T) {
for _, test := range neverallowTests {
// Create a test per config to allow for test specific config, e.g. test rules.
- config := TestConfig(buildDir, nil)
+ config := TestConfig(buildDir, nil, "", test.fs)
t.Run(test.name, func(t *testing.T) {
// If the test has its own rules then use them instead of the default ones.
if test.rules != nil {
setTestNeverallowRules(config, test.rules)
}
- _, errs := testNeverallow(config, test.fs)
+ _, errs := testNeverallow(config)
CheckErrorsAgainstExpectations(t, errs, test.expectedErrors)
})
}
}
-func testNeverallow(config Config, fs map[string][]byte) (*TestContext, []error) {
+func testNeverallow(config Config) (*TestContext, []error) {
ctx := NewTestContext()
ctx.RegisterModuleType("cc_library", newMockCcLibraryModule)
ctx.RegisterModuleType("java_library", newMockJavaLibraryModule)
ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule)
ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule)
ctx.PostDepsMutators(registerNeverallowMutator)
- ctx.Register()
+ ctx.Register(config)
- ctx.MockFileSystem(fs)
-
- _, errs := ctx.ParseBlueprintsFiles("Blueprints")
+ _, errs := ctx.ParseBlueprintsFiles("Android.bp")
if len(errs) > 0 {
return ctx, errs
}
diff --git a/android/package_test.go b/android/package_test.go
index 8071c51..bc66928 100644
--- a/android/package_test.go
+++ b/android/package_test.go
@@ -84,14 +84,12 @@
func testPackage(fs map[string][]byte) (*TestContext, []error) {
// Create a new config per test as visibility information is stored in the config.
- config := TestArchConfig(buildDir, nil)
+ config := TestArchConfig(buildDir, nil, "", fs)
ctx := NewTestArchContext()
ctx.RegisterModuleType("package", PackageFactory)
ctx.PreArchMutators(RegisterPackageRenamer)
- ctx.Register()
-
- ctx.MockFileSystem(fs)
+ ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles(".")
if len(errs) > 0 {
diff --git a/android/path_properties_test.go b/android/path_properties_test.go
index c859bc5..f367b82 100644
--- a/android/path_properties_test.go
+++ b/android/path_properties_test.go
@@ -97,12 +97,6 @@
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- config := TestArchConfig(buildDir, nil)
- ctx := NewTestArchContext()
-
- ctx.RegisterModuleType("test", pathDepsMutatorTestModuleFactory)
- ctx.RegisterModuleType("filegroup", FileGroupFactory)
-
bp := test.bp + `
filegroup {
name: "a",
@@ -121,13 +115,13 @@
}
`
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
+ config := TestArchConfig(buildDir, nil, bp, nil)
+ ctx := NewTestArchContext()
- ctx.MockFileSystem(mockFS)
+ ctx.RegisterModuleType("test", pathDepsMutatorTestModuleFactory)
+ ctx.RegisterModuleType("filegroup", FileGroupFactory)
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/android/paths.go b/android/paths.go
index 85c861d..024432e 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -89,6 +89,15 @@
}
}
+func pathContextName(ctx PathContext, module blueprint.Module) string {
+ if x, ok := ctx.(interface{ ModuleName(blueprint.Module) string }); ok {
+ return x.ModuleName(module)
+ } else if x, ok := ctx.(interface{ OtherModuleName(blueprint.Module) string }); ok {
+ return x.OtherModuleName(module)
+ }
+ return "unknown"
+}
+
type Path interface {
// Returns the path in string form
String() string
@@ -1304,12 +1313,6 @@
return p.path
}
-type testWritablePath struct {
- testPath
-}
-
-func (p testPath) writablePath() {}
-
// PathForTesting returns a Path constructed from joining the elements of paths with '/'. It should only be used from
// within tests.
func PathForTesting(paths ...string) Path {
@@ -1330,42 +1333,19 @@
return p
}
-// WritablePathForTesting returns a Path constructed from joining the elements of paths with '/'. It should only be
-// used from within tests.
-func WritablePathForTesting(paths ...string) WritablePath {
- p, err := validateSafePath(paths...)
- if err != nil {
- panic(err)
- }
- return testWritablePath{testPath{basePath{path: p, rel: p}}}
-}
-
-// WritablePathsForTesting returns a Path constructed from each element in strs. It should only be used from within
-// tests.
-func WritablePathsForTesting(strs ...string) WritablePaths {
- p := make(WritablePaths, len(strs))
- for i, s := range strs {
- p[i] = WritablePathForTesting(s)
- }
-
- return p
-}
-
type testPathContext struct {
config Config
- fs pathtools.FileSystem
}
-func (x *testPathContext) Fs() pathtools.FileSystem { return x.fs }
+func (x *testPathContext) Fs() pathtools.FileSystem { return x.config.fs }
func (x *testPathContext) Config() Config { return x.config }
func (x *testPathContext) AddNinjaFileDeps(...string) {}
// PathContextForTesting returns a PathContext that can be used in tests, for example to create an OutputPath with
// PathForOutput.
-func PathContextForTesting(config Config, fs map[string][]byte) PathContext {
+func PathContextForTesting(config Config) PathContext {
return &testPathContext{
config: config,
- fs: pathtools.MockFs(fs),
}
}
diff --git a/android/paths_test.go b/android/paths_test.go
index 1d8afa9..5ff5f99 100644
--- a/android/paths_test.go
+++ b/android/paths_test.go
@@ -241,8 +241,12 @@
return false
}
+func pathTestConfig(buildDir string) Config {
+ return TestConfig(buildDir, nil, "", nil)
+}
+
func TestPathForModuleInstall(t *testing.T) {
- testConfig := TestConfig("", nil)
+ testConfig := pathTestConfig("")
hostTarget := Target{Os: Linux}
deviceTarget := Target{Os: Android}
@@ -257,6 +261,7 @@
name: "host binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: hostTarget.Os,
target: hostTarget,
},
},
@@ -268,6 +273,7 @@
name: "system binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
},
@@ -278,6 +284,7 @@
name: "vendor binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: socSpecificModule,
},
@@ -289,6 +296,7 @@
name: "odm binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: deviceSpecificModule,
},
@@ -300,6 +308,7 @@
name: "product binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: productSpecificModule,
},
@@ -311,6 +320,7 @@
name: "system_ext binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: systemExtSpecificModule,
},
@@ -322,6 +332,7 @@
name: "root binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inRoot: true,
@@ -333,6 +344,7 @@
name: "recovery binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inRecovery: true,
@@ -344,6 +356,7 @@
name: "recovery root binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inRecovery: true,
@@ -357,6 +370,7 @@
name: "system native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inData: true,
@@ -368,6 +382,7 @@
name: "vendor native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: socSpecificModule,
},
@@ -380,6 +395,7 @@
name: "odm native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: deviceSpecificModule,
},
@@ -392,6 +408,7 @@
name: "product native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: productSpecificModule,
},
@@ -405,6 +422,7 @@
name: "system_ext native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: systemExtSpecificModule,
},
@@ -418,6 +436,7 @@
name: "sanitized system binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inSanitizerDir: true,
@@ -429,6 +448,7 @@
name: "sanitized vendor binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: socSpecificModule,
},
@@ -441,6 +461,7 @@
name: "sanitized odm binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: deviceSpecificModule,
},
@@ -453,6 +474,7 @@
name: "sanitized product binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: productSpecificModule,
},
@@ -466,6 +488,7 @@
name: "sanitized system_ext binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: systemExtSpecificModule,
},
@@ -479,6 +502,7 @@
name: "sanitized system native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
},
inData: true,
@@ -491,6 +515,7 @@
name: "sanitized vendor native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: socSpecificModule,
},
@@ -504,6 +529,7 @@
name: "sanitized odm native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: deviceSpecificModule,
},
@@ -517,6 +543,7 @@
name: "sanitized product native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: productSpecificModule,
},
@@ -530,6 +557,7 @@
name: "sanitized system_ext native test binary",
ctx: &moduleInstallPathContextImpl{
baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
target: deviceTarget,
kind: systemExtSpecificModule,
},
@@ -555,18 +583,19 @@
}
func TestDirectorySortedPaths(t *testing.T) {
- config := TestConfig("out", nil)
-
- ctx := PathContextForTesting(config, map[string][]byte{
- "a.txt": nil,
- "a/txt": nil,
- "a/b/c": nil,
- "a/b/d": nil,
- "b": nil,
- "b/b.txt": nil,
- "a/a.txt": nil,
+ config := TestConfig("out", nil, "", map[string][]byte{
+ "Android.bp": nil,
+ "a.txt": nil,
+ "a/txt": nil,
+ "a/b/c": nil,
+ "a/b/d": nil,
+ "b": nil,
+ "b/b.txt": nil,
+ "a/a.txt": nil,
})
+ ctx := PathContextForTesting(config)
+
makePaths := func() Paths {
return Paths{
PathForSource(ctx, "a.txt"),
@@ -730,7 +759,7 @@
t.Run(f.name, func(t *testing.T) {
for _, test := range testCases {
t.Run(test.name, func(t *testing.T) {
- testConfig := TestConfig(test.buildDir, nil)
+ testConfig := pathTestConfig(test.buildDir)
ctx := &configErrorWrapper{config: testConfig}
_, err := f.f(ctx, test.src)
if len(ctx.errors) > 0 {
@@ -862,7 +891,6 @@
func testPathForModuleSrc(t *testing.T, buildDir string, tests []pathForModuleSrcTestCase) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- config := TestConfig(buildDir, nil)
ctx := NewTestContext()
ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory)
@@ -896,9 +924,9 @@
"foo/src_special/$": nil,
}
- ctx.MockFileSystem(mockFS)
+ config := TestConfig(buildDir, nil, "", mockFS)
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"fg/Android.bp", "foo/Android.bp", "ofp/Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
@@ -1073,14 +1101,6 @@
}
func TestPathsForModuleSrc_AllowMissingDependencies(t *testing.T) {
- config := TestConfig(buildDir, nil)
- config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
-
- ctx := NewTestContext()
- ctx.SetAllowMissingDependencies(true)
-
- ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory)
-
bp := `
test {
name: "foo",
@@ -1097,13 +1117,16 @@
}
`
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
+ config := TestConfig(buildDir, nil, bp, nil)
+ config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
- ctx.MockFileSystem(mockFS)
+ ctx := NewTestContext()
+ ctx.SetAllowMissingDependencies(true)
- ctx.Register()
+ ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory)
+
+ ctx.Register(config)
+
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
@@ -1136,7 +1159,7 @@
func ExampleOutputPath_ReplaceExtension() {
ctx := &configErrorWrapper{
- config: TestConfig("out", nil),
+ config: TestConfig("out", nil, "", nil),
}
p := PathForOutput(ctx, "system/framework").Join(ctx, "boot.art")
p2 := p.ReplaceExtension(ctx, "oat")
@@ -1150,7 +1173,7 @@
func ExampleOutputPath_FileInSameDir() {
ctx := &configErrorWrapper{
- config: TestConfig("out", nil),
+ config: TestConfig("out", nil, "", nil),
}
p := PathForOutput(ctx, "system/framework").Join(ctx, "boot.art")
p2 := p.InSameDir(ctx, "oat", "arm", "boot.vdex")
diff --git a/android/prebuilt.go b/android/prebuilt.go
index 0ee1201..2c99f1f 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -25,6 +25,11 @@
// This file implements common functionality for handling modules that may exist as prebuilts,
// source, or both.
+func RegisterPrebuiltMutators(ctx RegistrationContext) {
+ ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators)
+ ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators)
+}
+
type prebuiltDependencyTag struct {
blueprint.BaseDependencyTag
}
diff --git a/android/prebuilt_etc_test.go b/android/prebuilt_etc_test.go
index 3c466a1..6e751e7 100644
--- a/android/prebuilt_etc_test.go
+++ b/android/prebuilt_etc_test.go
@@ -21,7 +21,14 @@
)
func testPrebuiltEtc(t *testing.T, bp string) (*TestContext, Config) {
- config := TestArchConfig(buildDir, nil)
+ fs := map[string][]byte{
+ "foo.conf": nil,
+ "bar.conf": nil,
+ "baz.conf": nil,
+ }
+
+ config := TestArchConfig(buildDir, nil, bp, fs)
+
ctx := NewTestArchContext()
ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory)
ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory)
@@ -29,14 +36,7 @@
ctx.RegisterModuleType("prebuilt_usr_share_host", PrebuiltUserShareHostFactory)
ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory)
ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory)
- ctx.Register()
- mockFiles := map[string][]byte{
- "Android.bp": []byte(bp),
- "foo.conf": nil,
- "bar.conf": nil,
- "baz.conf": nil,
- }
- ctx.MockFileSystem(mockFiles)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go
index 81fb278..8648b93 100644
--- a/android/prebuilt_test.go
+++ b/android/prebuilt_test.go
@@ -125,29 +125,29 @@
}
func TestPrebuilts(t *testing.T) {
- config := TestConfig(buildDir, nil)
+ fs := map[string][]byte{
+ "prebuilt_file": nil,
+ "source_file": nil,
+ }
for _, test := range prebuiltsTests {
t.Run(test.name, func(t *testing.T) {
+ bp := `
+ source {
+ name: "foo",
+ deps: [":bar"],
+ }
+ ` + test.modules
+ config := TestConfig(buildDir, nil, bp, fs)
+
ctx := NewTestContext()
- ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators)
- ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators)
+ RegisterPrebuiltMutators(ctx)
ctx.RegisterModuleType("filegroup", FileGroupFactory)
ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
ctx.RegisterModuleType("source", newSourceModule)
- ctx.Register()
- ctx.MockFileSystem(map[string][]byte{
- "prebuilt_file": nil,
- "source_file": nil,
- "Blueprints": []byte(`
- source {
- name: "foo",
- deps: [":bar"],
- }
- ` + test.modules),
- })
+ ctx.Register(config)
- _, errs := ctx.ParseBlueprintsFiles("Blueprints")
+ _, errs := ctx.ParseBlueprintsFiles("Android.bp")
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
FailIfErrored(t, errs)
diff --git a/android/register.go b/android/register.go
index d79982a..b5defec 100644
--- a/android/register.go
+++ b/android/register.go
@@ -15,6 +15,8 @@
package android
import (
+ "fmt"
+
"github.com/google/blueprint"
)
@@ -114,3 +116,72 @@
}
return ret
}
+
+// Interface for registering build components.
+//
+// Provided to allow registration of build components to be shared between the runtime
+// and test environments.
+type RegistrationContext interface {
+ RegisterModuleType(name string, factory ModuleFactory)
+ RegisterSingletonType(name string, factory SingletonFactory)
+ PreArchMutators(f RegisterMutatorFunc)
+ PreDepsMutators(f RegisterMutatorFunc)
+ PostDepsMutators(f RegisterMutatorFunc)
+}
+
+// Used to register build components from an init() method, e.g.
+//
+// init() {
+// RegisterBuildComponents(android.InitRegistrationContext)
+// }
+//
+// func RegisterBuildComponents(ctx android.RegistrationContext) {
+// ctx.RegisterModuleType(...)
+// ...
+// }
+//
+// Extracting the actual registration into a separate RegisterBuildComponents(ctx) function
+// allows it to be used to initialize test context, e.g.
+//
+// ctx := android.NewTestContext()
+// RegisterBuildComponents(ctx)
+var InitRegistrationContext RegistrationContext = &initRegistrationContext{
+ moduleTypes: make(map[string]ModuleFactory),
+ singletonTypes: make(map[string]SingletonFactory),
+}
+
+// Make sure the TestContext implements RegistrationContext.
+var _ RegistrationContext = (*TestContext)(nil)
+
+type initRegistrationContext struct {
+ moduleTypes map[string]ModuleFactory
+ singletonTypes map[string]SingletonFactory
+}
+
+func (ctx *initRegistrationContext) RegisterModuleType(name string, factory ModuleFactory) {
+ if _, present := ctx.moduleTypes[name]; present {
+ panic(fmt.Sprintf("module type %q is already registered", name))
+ }
+ ctx.moduleTypes[name] = factory
+ RegisterModuleType(name, factory)
+}
+
+func (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) {
+ if _, present := ctx.singletonTypes[name]; present {
+ panic(fmt.Sprintf("singleton type %q is already registered", name))
+ }
+ ctx.singletonTypes[name] = factory
+ RegisterSingletonType(name, factory)
+}
+
+func (ctx *initRegistrationContext) PreArchMutators(f RegisterMutatorFunc) {
+ PreArchMutators(f)
+}
+
+func (ctx *initRegistrationContext) PreDepsMutators(f RegisterMutatorFunc) {
+ PreDepsMutators(f)
+}
+
+func (ctx *initRegistrationContext) PostDepsMutators(f RegisterMutatorFunc) {
+ PostDepsMutators(f)
+}
diff --git a/android/rule_builder_test.go b/android/rule_builder_test.go
index 52c32df..acf8127 100644
--- a/android/rule_builder_test.go
+++ b/android/rule_builder_test.go
@@ -27,19 +27,18 @@
)
func pathContext() PathContext {
- return PathContextForTesting(TestConfig("out", nil),
- map[string][]byte{
- "ld": nil,
- "a.o": nil,
- "b.o": nil,
- "cp": nil,
- "a": nil,
- "b": nil,
- "ls": nil,
- "turbine": nil,
- "java": nil,
- "javac": nil,
- })
+ return PathContextForTesting(TestConfig("out", nil, "", map[string][]byte{
+ "ld": nil,
+ "a.o": nil,
+ "b.o": nil,
+ "cp": nil,
+ "a": nil,
+ "b": nil,
+ "ls": nil,
+ "turbine": nil,
+ "java": nil,
+ "javac": nil,
+ }))
}
func ExampleRuleBuilder() {
@@ -276,7 +275,7 @@
"input3": nil,
}
- ctx := PathContextForTesting(TestConfig("out", nil), fs)
+ ctx := PathContextForTesting(TestConfig("out", nil, "", fs))
addCommands := func(rule *RuleBuilder) {
cmd := rule.Command().
@@ -445,6 +444,11 @@
}
func TestRuleBuilder_Build(t *testing.T) {
+ fs := map[string][]byte{
+ "bar": nil,
+ "cp": nil,
+ }
+
bp := `
rule_builder_test {
name: "foo",
@@ -458,16 +462,11 @@
}
`
- config := TestConfig(buildDir, nil)
+ config := TestConfig(buildDir, nil, bp, fs)
ctx := NewTestContext()
- ctx.MockFileSystem(map[string][]byte{
- "Android.bp": []byte(bp),
- "bar": nil,
- "cp": nil,
- })
ctx.RegisterModuleType("rule_builder_test", testRuleBuilderFactory)
ctx.RegisterSingletonType("rule_builder_test", testRuleBuilderSingletonFactory)
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
diff --git a/android/sh_binary.go b/android/sh_binary.go
index 3293d4f..7d9dc67 100644
--- a/android/sh_binary.go
+++ b/android/sh_binary.go
@@ -16,6 +16,7 @@
import (
"fmt"
+ "path/filepath"
"strings"
)
@@ -74,8 +75,11 @@
sourceFilePath Path
outputFilePath OutputPath
+ installedFile InstallPath
}
+var _ HostToolProvider = (*ShBinary)(nil)
+
type ShTest struct {
ShBinary
@@ -84,16 +88,16 @@
data Paths
}
+func (s *ShBinary) HostToolPath() OptionalPath {
+ return OptionalPathForPath(s.installedFile)
+}
+
func (s *ShBinary) DepsMutator(ctx BottomUpMutatorContext) {
if s.properties.Src == nil {
ctx.PropertyErrorf("src", "missing prebuilt source file")
}
}
-func (s *ShBinary) SourceFilePath(ctx ModuleContext) Path {
- return PathForModuleSrc(ctx, String(s.properties.Src))
-}
-
func (s *ShBinary) OutputFile() OutputPath {
return s.outputFilePath
}
@@ -110,7 +114,7 @@
return s.properties.Symlinks
}
-func (s *ShBinary) GenerateAndroidBuildActions(ctx ModuleContext) {
+func (s *ShBinary) generateAndroidBuildActions(ctx ModuleContext) {
s.sourceFilePath = PathForModuleSrc(ctx, String(s.properties.Src))
filename := String(s.properties.Filename)
filename_from_src := Bool(s.properties.Filename_from_src)
@@ -135,6 +139,12 @@
})
}
+func (s *ShBinary) GenerateAndroidBuildActions(ctx ModuleContext) {
+ s.generateAndroidBuildActions(ctx)
+ installDir := PathForModuleInstall(ctx, "bin", String(s.properties.Sub_dir))
+ s.installedFile = ctx.InstallExecutable(installDir, s.outputFilePath.Base(), s.outputFilePath)
+}
+
func (s *ShBinary) AndroidMkEntries() []AndroidMkEntries {
return []AndroidMkEntries{AndroidMkEntries{
Class: "EXECUTABLES",
@@ -158,11 +168,26 @@
}
func (s *ShTest) GenerateAndroidBuildActions(ctx ModuleContext) {
- s.ShBinary.GenerateAndroidBuildActions(ctx)
+ s.ShBinary.generateAndroidBuildActions(ctx)
+ testDir := "nativetest"
+ if ctx.Target().Arch.ArchType.Multilib == "lib64" {
+ testDir = "nativetest64"
+ }
+ if ctx.Target().NativeBridge == NativeBridgeEnabled {
+ testDir = filepath.Join(testDir, ctx.Target().NativeBridgeRelativePath)
+ } else if !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) {
+ testDir = filepath.Join(testDir, ctx.Arch().ArchType.String())
+ }
+ installDir := PathForModuleInstall(ctx, testDir, String(s.properties.Sub_dir))
+ s.installedFile = ctx.InstallExecutable(installDir, s.outputFilePath.Base(), s.outputFilePath)
s.data = PathsForModuleSrc(ctx, s.testProperties.Data)
}
+func (s *ShTest) InstallInData() bool {
+ return true
+}
+
func (s *ShTest) AndroidMkEntries() []AndroidMkEntries {
return []AndroidMkEntries{AndroidMkEntries{
Class: "NATIVE_TESTS",
diff --git a/android/sh_binary_test.go b/android/sh_binary_test.go
index 8488fe4..137e773 100644
--- a/android/sh_binary_test.go
+++ b/android/sh_binary_test.go
@@ -6,19 +6,18 @@
)
func testShBinary(t *testing.T, bp string) (*TestContext, Config) {
- config := TestArchConfig(buildDir, nil)
-
- ctx := NewTestArchContext()
- ctx.RegisterModuleType("sh_test", ShTestFactory)
- ctx.RegisterModuleType("sh_test_host", ShTestHostFactory)
- ctx.Register()
- mockFiles := map[string][]byte{
- "Android.bp": []byte(bp),
+ fs := map[string][]byte{
"test.sh": nil,
"testdata/data1": nil,
"testdata/sub/data2": nil,
}
- ctx.MockFileSystem(mockFiles)
+
+ config := TestArchConfig(buildDir, nil, bp, fs)
+
+ ctx := NewTestArchContext()
+ ctx.RegisterModuleType("sh_test", ShTestFactory)
+ ctx.RegisterModuleType("sh_test_host", ShTestHostFactory)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/android/testing.go b/android/testing.go
index 26f1e4d..aaf98f5 100644
--- a/android/testing.go
+++ b/android/testing.go
@@ -16,7 +16,6 @@
import (
"fmt"
- "path/filepath"
"regexp"
"strings"
"testing"
@@ -68,7 +67,11 @@
ctx.postDeps = append(ctx.postDeps, f)
}
-func (ctx *TestContext) Register() {
+func (ctx *TestContext) Register(config Config) {
+ ctx.SetFs(config.fs)
+ if config.mockBpList != "" {
+ ctx.SetModuleListFile(config.mockBpList)
+ }
registerMutators(ctx.Context.Context, ctx.preArch, ctx.preDeps, ctx.postDeps)
ctx.RegisterSingletonType("env", EnvSingleton)
@@ -132,25 +135,6 @@
"\nall singletons: %v", name, allSingletonNames))
}
-// MockFileSystem causes the Context to replace all reads with accesses to the provided map of
-// filenames to contents stored as a byte slice.
-func (ctx *TestContext) MockFileSystem(files map[string][]byte) {
- // no module list file specified; find every file named Blueprints or Android.bp
- pathsToParse := []string{}
- for candidate := range files {
- base := filepath.Base(candidate)
- if base == "Blueprints" || base == "Android.bp" {
- pathsToParse = append(pathsToParse, candidate)
- }
- }
- if len(pathsToParse) < 1 {
- panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", files))
- }
- files[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
-
- ctx.Context.MockFileSystem(files)
-}
-
type testBuildProvider interface {
BuildParamsForTests() []BuildParams
RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
diff --git a/android/variable.go b/android/variable.go
index 628408e..548e09b 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -288,6 +288,7 @@
Exclude_draft_ndk_apis *bool `json:",omitempty"`
Flatten_apex *bool `json:",omitempty"`
+ Aml_abis *bool `json:",omitempty"`
DexpreoptGlobalConfig *string `json:",omitempty"`
diff --git a/android/variable_test.go b/android/variable_test.go
index 1826e39..451d43d 100644
--- a/android/variable_test.go
+++ b/android/variable_test.go
@@ -198,18 +198,11 @@
name: "baz",
}
`
-
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- }
-
- ctx.MockFileSystem(mockFS)
-
- ctx.Register()
-
- config := TestConfig(buildDir, nil)
+ config := TestConfig(buildDir, nil, bp, nil)
config.TestProductVariables.Eng = proptools.BoolPtr(true)
+ ctx.Register(config)
+
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/android/visibility_test.go b/android/visibility_test.go
index 1984a21..fbf2fb7 100644
--- a/android/visibility_test.go
+++ b/android/visibility_test.go
@@ -868,7 +868,7 @@
func testVisibility(buildDir string, fs map[string][]byte) (*TestContext, []error) {
// Create a new config per test as visibility information is stored in the config.
- config := TestArchConfig(buildDir, nil)
+ config := TestArchConfig(buildDir, nil, "", fs)
ctx := NewTestArchContext()
ctx.RegisterModuleType("package", PackageFactory)
@@ -879,9 +879,7 @@
ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
ctx.PreArchMutators(RegisterVisibilityRuleGatherer)
ctx.PostDepsMutators(RegisterVisibilityRuleEnforcer)
- ctx.Register()
-
- ctx.MockFileSystem(fs)
+ ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles(".")
if len(errs) > 0 {
diff --git a/android/vts_config_test.go b/android/vts_config_test.go
index 162944d..254fa92 100644
--- a/android/vts_config_test.go
+++ b/android/vts_config_test.go
@@ -19,15 +19,11 @@
)
func testVtsConfig(test *testing.T, bpFileContents string) *TestContext {
- config := TestArchConfig(buildDir, nil)
+ config := TestArchConfig(buildDir, nil, bpFileContents, nil)
ctx := NewTestArchContext()
ctx.RegisterModuleType("vts_config", VtsConfigFactory)
- ctx.Register()
- mockFiles := map[string][]byte{
- "Android.bp": []byte(bpFileContents),
- }
- ctx.MockFileSystem(mockFiles)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
FailIfErrored(test, errs)
_, errs = ctx.PrepareBuildActions(config)
diff --git a/apex/androidmk.go b/apex/androidmk.go
index 1b02bcb..c42b348 100644
--- a/apex/androidmk.go
+++ b/apex/androidmk.go
@@ -22,7 +22,6 @@
"android/soong/android"
"android/soong/cc"
- "android/soong/java"
"github.com/google/blueprint/proptools"
)
@@ -119,7 +118,7 @@
}
}
if fi.class == javaSharedLib {
- javaModule := fi.module.(*java.Library)
+ javaModule := fi.module.(javaLibrary)
// soong_java_prebuilt.mk sets LOCAL_MODULE_SUFFIX := .jar Therefore
// we need to remove the suffix from LOCAL_MODULE_STEM, otherwise
// we will have foo.jar.jar
diff --git a/apex/apex.go b/apex/apex.go
index 8340aac..ce463fc 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -724,7 +724,13 @@
}
func (a *apexBundle) getCertString(ctx android.BaseModuleContext) string {
- certificate, overridden := ctx.DeviceConfig().OverrideCertificateFor(ctx.ModuleName())
+ moduleName := ctx.ModuleName()
+ // VNDK APEXes share the same certificate. To avoid adding a new VNDK version to the OVERRIDE_* list,
+ // we check with the pseudo module name to see if its certificate is overridden.
+ if a.vndkApex {
+ moduleName = vndkApexName
+ }
+ certificate, overridden := ctx.DeviceConfig().OverrideCertificateFor(moduleName)
if overridden {
return ":" + certificate
}
@@ -866,10 +872,16 @@
return af
}
-func apexFileForJavaLibrary(ctx android.BaseModuleContext, java *java.Library) apexFile {
+// TODO(b/146586360): replace javaLibrary(in apex/apex.go) with java.Dependency
+type javaLibrary interface {
+ android.Module
+ java.Dependency
+}
+
+func apexFileForJavaLibrary(ctx android.BaseModuleContext, lib javaLibrary) apexFile {
dirInApex := "javalib"
- fileToCopy := java.DexJarFile()
- return newApexFile(ctx, fileToCopy, java.Name(), dirInApex, javaSharedLib, java)
+ fileToCopy := lib.DexJar()
+ return newApexFile(ctx, fileToCopy, lib.Name(), dirInApex, javaSharedLib, lib)
}
func apexFileForPrebuiltJavaLibrary(ctx android.BaseModuleContext, java *java.Import) apexFile {
@@ -1016,6 +1028,21 @@
filesInfo = append(filesInfo, af)
return true // track transitive dependencies
}
+ } else if sdkLib, ok := child.(*java.SdkLibrary); ok {
+ af := apexFileForJavaLibrary(ctx, sdkLib)
+ if !af.Ok() {
+ ctx.PropertyErrorf("java_libs", "%q is not configured to be compiled into dex", depName)
+ return false
+ }
+ filesInfo = append(filesInfo, af)
+
+ pf := sdkLib.PermissionFile()
+ if pf == nil {
+ ctx.PropertyErrorf("java_libs", "%q failed to generate permission XML", depName)
+ return false
+ }
+ filesInfo = append(filesInfo, newApexFile(ctx, pf, pf.Base(), "etc/permissions", etc, nil))
+ return true // track transitive dependencies
} else if javaLib, ok := child.(*java.Import); ok {
af := apexFileForPrebuiltJavaLibrary(ctx, javaLib)
if !af.Ok() {
@@ -1095,7 +1122,7 @@
// don't include it in this APEX
return false
}
- if !a.Host() && (cc.IsStubs() || cc.HasStubsVariants()) {
+ if !a.Host() && !android.DirectlyInApex(ctx.ModuleName(), ctx.OtherModuleName(cc)) && (cc.IsStubs() || cc.HasStubsVariants()) {
// If the dependency is a stubs lib, don't include it in this APEX,
// but make sure that the lib is installed on the device.
// In case no APEX is having the lib, the lib is installed to the system
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 7ac8308..60ed801 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -92,69 +92,7 @@
}
func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
- config := android.TestArchConfig(buildDir, nil)
- config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
- config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
- config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
- config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
- config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
- config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
-
- ctx := android.NewTestArchContext()
- ctx.RegisterModuleType("apex", BundleFactory)
- ctx.RegisterModuleType("apex_test", testApexBundleFactory)
- ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
- ctx.RegisterModuleType("apex_key", ApexKeyFactory)
- ctx.RegisterModuleType("apex_defaults", defaultsFactory)
- ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
- ctx.RegisterModuleType("override_apex", overrideApexFactory)
-
- ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
- ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
- ctx.RegisterModuleType("cc_prebuilt_library_shared", cc.PrebuiltSharedLibraryFactory)
- ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
- ctx.RegisterModuleType("cc_binary", cc.BinaryFactory)
- ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
- ctx.RegisterModuleType("cc_defaults", func() android.Module {
- return cc.DefaultsFactory()
- })
- ctx.RegisterModuleType("cc_test", cc.TestFactory)
- ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
- ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
- ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
- ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
- ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
- ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
- ctx.RegisterModuleType("android_app_certificate", java.AndroidAppCertificateFactory)
- ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
- ctx.RegisterModuleType("java_library", java.LibraryFactory)
- ctx.RegisterModuleType("java_import", java.ImportFactory)
- ctx.RegisterModuleType("java_system_modules", java.SystemModulesFactory)
- ctx.RegisterModuleType("android_app", java.AndroidAppFactory)
- ctx.RegisterModuleType("android_app_import", java.AndroidAppImportFactory)
- ctx.RegisterModuleType("override_android_app", java.OverrideAndroidAppModuleFactory)
-
- ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
- })
- ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
- ctx.BottomUp("link", cc.LinkageMutator).Parallel()
- ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
- ctx.BottomUp("version", cc.VersionMutator).Parallel()
- ctx.BottomUp("begin", cc.BeginMutator).Parallel()
- })
- ctx.PreDepsMutators(RegisterPreDepsMutators)
- ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
- ctx.PostDepsMutators(RegisterPostDepsMutators)
- ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
- ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
- })
-
- ctx.Register()
+ android.ClearApexDependency()
bp = bp + `
toolchain_library {
@@ -270,10 +208,10 @@
],
}
`
+
bp = bp + java.GatherRequiredDepsForTest()
fs := map[string][]byte{
- "Android.bp": []byte(bp),
"a.java": nil,
"PrebuiltAppFoo.apk": nil,
"PrebuiltAppFooPriv.apk": nil,
@@ -284,42 +222,89 @@
"system/sepolicy/apex/otherapex-file_contexts": nil,
"system/sepolicy/apex/commonapex-file_contexts": nil,
"system/sepolicy/apex/com.android.vndk-file_contexts": nil,
- "mylib.cpp": nil,
- "mylib_common.cpp": nil,
- "mytest.cpp": nil,
- "mytest1.cpp": nil,
- "mytest2.cpp": nil,
- "mytest3.cpp": nil,
- "myprebuilt": nil,
- "my_include": nil,
- "foo/bar/MyClass.java": nil,
- "prebuilt.jar": nil,
- "vendor/foo/devkeys/test.x509.pem": nil,
- "vendor/foo/devkeys/test.pk8": nil,
- "testkey.x509.pem": nil,
- "testkey.pk8": nil,
- "testkey.override.x509.pem": nil,
- "testkey.override.pk8": nil,
- "vendor/foo/devkeys/testkey.avbpubkey": nil,
- "vendor/foo/devkeys/testkey.pem": nil,
- "NOTICE": nil,
- "custom_notice": nil,
- "testkey2.avbpubkey": nil,
- "testkey2.pem": nil,
- "myapex-arm64.apex": nil,
- "myapex-arm.apex": nil,
- "frameworks/base/api/current.txt": nil,
- "framework/aidl/a.aidl": nil,
- "build/make/core/proguard.flags": nil,
- "build/make/core/proguard_basic_keeps.flags": nil,
- "dummy.txt": nil,
+ "mylib.cpp": nil,
+ "mylib_common.cpp": nil,
+ "mytest.cpp": nil,
+ "mytest1.cpp": nil,
+ "mytest2.cpp": nil,
+ "mytest3.cpp": nil,
+ "myprebuilt": nil,
+ "my_include": nil,
+ "foo/bar/MyClass.java": nil,
+ "prebuilt.jar": nil,
+ "vendor/foo/devkeys/test.x509.pem": nil,
+ "vendor/foo/devkeys/test.pk8": nil,
+ "testkey.x509.pem": nil,
+ "testkey.pk8": nil,
+ "testkey.override.x509.pem": nil,
+ "testkey.override.pk8": nil,
+ "vendor/foo/devkeys/testkey.avbpubkey": nil,
+ "vendor/foo/devkeys/testkey.pem": nil,
+ "NOTICE": nil,
+ "custom_notice": nil,
+ "testkey2.avbpubkey": nil,
+ "testkey2.pem": nil,
+ "myapex-arm64.apex": nil,
+ "myapex-arm.apex": nil,
+ "frameworks/base/api/current.txt": nil,
+ "framework/aidl/a.aidl": nil,
+ "build/make/core/proguard.flags": nil,
+ "build/make/core/proguard_basic_keeps.flags": nil,
+ "dummy.txt": nil,
}
for _, handler := range handlers {
- handler(fs, config)
+ // The fs now needs to be populated before creating the config, call handlers twice
+ // for now, once to get any fs changes, and later after the config was created to
+ // set product variables or targets.
+ tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
+ handler(fs, tempConfig)
}
- ctx.MockFileSystem(fs)
+ config := android.TestArchConfig(buildDir, nil, bp, fs)
+ config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
+ config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
+ config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
+ config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
+ config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
+ config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
+
+ for _, handler := range handlers {
+ // The fs now needs to be populated before creating the config, call handlers twice
+ // for now, earlier to get any fs changes, and now after the config was created to
+ // set product variables or targets.
+ tempFS := map[string][]byte{}
+ handler(tempFS, config)
+ }
+
+ ctx := android.NewTestArchContext()
+ ctx.RegisterModuleType("apex", BundleFactory)
+ ctx.RegisterModuleType("apex_test", testApexBundleFactory)
+ ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
+ ctx.RegisterModuleType("apex_key", ApexKeyFactory)
+ ctx.RegisterModuleType("apex_defaults", defaultsFactory)
+ ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
+ ctx.RegisterModuleType("override_apex", overrideApexFactory)
+
+ cc.RegisterRequiredBuildComponentsForTest(ctx)
+ ctx.RegisterModuleType("cc_binary", cc.BinaryFactory)
+ ctx.RegisterModuleType("cc_test", cc.TestFactory)
+ ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
+ ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
+ ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
+ ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
+ ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
+ java.RegisterJavaBuildComponents(ctx)
+ java.RegisterSystemModulesBuildComponents(ctx)
+ java.RegisterAppBuildComponents(ctx)
+ ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
+
+ ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
+ ctx.PreDepsMutators(RegisterPreDepsMutators)
+ ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
+ ctx.PostDepsMutators(RegisterPostDepsMutators)
+
+ ctx.Register(config)
return ctx, config
}
@@ -739,6 +724,12 @@
// Ensure that genstub is invoked with --apex
ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3_myapex").Rule("genStubSrc").Args["flags"])
+
+ ensureExactContents(t, ctx, "myapex", []string{
+ "lib64/mylib.so",
+ "lib64/mylib3.so",
+ "lib64/mylib4.so",
+ })
}
func TestApexWithExplicitStubsDependency(t *testing.T) {
@@ -1153,8 +1144,8 @@
inputsString := strings.Join(inputsList, " ")
// ensure that the apex includes vendor variants of the direct and indirect deps
- ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib.so")
- ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib2.so")
+ ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
+ ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
// ensure that the apex does not include core variants
ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
@@ -1312,6 +1303,134 @@
}
}
+func TestCertificate(t *testing.T) {
+ t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }`)
+ rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
+ expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+ t.Run("override when unspecified", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex_keytest",
+ key: "myapex.key",
+ file_contexts: ":myapex-file_contexts",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+ android_app_certificate {
+ name: "myapex.certificate.override",
+ certificate: "testkey.override",
+ }`)
+ rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
+ expected := "testkey.override.x509.pem testkey.override.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+ t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ certificate: ":myapex.certificate",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+ android_app_certificate {
+ name: "myapex.certificate",
+ certificate: "testkey",
+ }`)
+ rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
+ expected := "testkey.x509.pem testkey.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+ t.Run("override when specifiec as <:module>", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex_keytest",
+ key: "myapex.key",
+ file_contexts: ":myapex-file_contexts",
+ certificate: ":myapex.certificate",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+ android_app_certificate {
+ name: "myapex.certificate.override",
+ certificate: "testkey.override",
+ }`)
+ rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
+ expected := "testkey.override.x509.pem testkey.override.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+ t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ certificate: "testkey",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }`)
+ rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
+ expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+ t.Run("override when specified as <name>", func(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex_keytest",
+ key: "myapex.key",
+ file_contexts: ":myapex-file_contexts",
+ certificate: "testkey",
+ }
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+ android_app_certificate {
+ name: "myapex.certificate.override",
+ certificate: "testkey.override",
+ }`)
+ rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
+ expected := "testkey.override.x509.pem testkey.override.pk8"
+ if actual := rule.Args["certificates"]; actual != expected {
+ t.Errorf("certificates should be %q, not %q", expected, actual)
+ }
+ })
+}
+
func TestMacro(t *testing.T) {
ctx, _ := testApex(t, `
apex {
@@ -3114,6 +3233,44 @@
ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
}
+func TestJavaSDKLibrary(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ java_libs: ["foo"],
+ }
+
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+
+ java_sdk_library {
+ name: "foo",
+ srcs: ["a.java"],
+ api_packages: ["foo"],
+ }
+ `, withFiles(map[string][]byte{
+ "api/current.txt": nil,
+ "api/removed.txt": nil,
+ "api/system-current.txt": nil,
+ "api/system-removed.txt": nil,
+ "api/test-current.txt": nil,
+ "api/test-removed.txt": nil,
+ }))
+
+ // java_sdk_library installs both impl jar and permission XML
+ ensureExactContents(t, ctx, "myapex", []string{
+ "javalib/foo.jar",
+ "etc/permissions/foo.xml",
+ })
+ // Permission XML should point to the activated path of impl jar of java_sdk_library
+ genXMLCommand := ctx.ModuleForTests("foo", "android_common_myapex").Output("foo.xml").RuleParams.Command
+ ensureContains(t, genXMLCommand, `<library name="foo" file="/apex/myapex/javalib/foo.jar"`)
+}
+
func TestRejectNonInstallableJavaLibrary(t *testing.T) {
testApexError(t, `"myjar" is not configured to be compiled into dex`, `
apex {
diff --git a/apex/builder.go b/apex/builder.go
index a90918d..fe465f5 100644
--- a/apex/builder.go
+++ b/apex/builder.go
@@ -138,7 +138,6 @@
Command: `${zip2zip} -i $in -o $out ` +
`apex_payload.img:apex/${abi}.img ` +
`apex_manifest.json:root/apex_manifest.json ` +
- `apex_pubkey:root/apex_pubkey ` +
`apex_manifest.pb:root/apex_manifest.pb ` +
`AndroidManifest.xml:manifest/AndroidManifest.xml ` +
`assets/NOTICE.html.gz:assets/NOTICE.html.gz`,
@@ -350,8 +349,8 @@
implicitInputs = append(implicitInputs, cannedFsConfig, a.fileContexts, a.private_key_file, a.public_key_file)
optFlags = append(optFlags, "--pubkey "+a.public_key_file.String())
- manifestPackageName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(a.Name())
- if overridden {
+ manifestPackageName := a.getOverrideManifestPackageName(ctx)
+ if manifestPackageName != "" {
optFlags = append(optFlags, "--override_apk_package_name "+manifestPackageName)
}
@@ -495,15 +494,17 @@
}
func (a *apexBundle) setCertificateAndPrivateKey(ctx android.ModuleContext) {
- cert := String(a.properties.Certificate)
- if cert != "" && android.SrcIsModule(cert) == "" {
- defaultDir := ctx.Config().DefaultAppCertificateDir(ctx)
- a.container_certificate_file = defaultDir.Join(ctx, cert+".x509.pem")
- a.container_private_key_file = defaultDir.Join(ctx, cert+".pk8")
- } else if cert == "" {
- pem, key := ctx.Config().DefaultAppCertificate(ctx)
- a.container_certificate_file = pem
- a.container_private_key_file = key
+ if a.container_certificate_file == nil {
+ cert := String(a.properties.Certificate)
+ if cert == "" {
+ pem, key := ctx.Config().DefaultAppCertificate(ctx)
+ a.container_certificate_file = pem
+ a.container_private_key_file = key
+ } else {
+ defaultDir := ctx.Config().DefaultAppCertificateDir(ctx)
+ a.container_certificate_file = defaultDir.Join(ctx, cert+".x509.pem")
+ a.container_private_key_file = defaultDir.Join(ctx, cert+".pk8")
+ }
}
}
@@ -534,3 +535,21 @@
}
}
}
+
+func (a *apexBundle) getOverrideManifestPackageName(ctx android.ModuleContext) string {
+ // For VNDK APEXes, check "com.android.vndk" in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
+ // to see if it should be overridden because their <apex name> is dynamically generated
+ // according to its VNDK version.
+ if a.vndkApex {
+ overrideName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(vndkApexName)
+ if overridden {
+ return strings.Replace(*a.properties.Apex_name, vndkApexName, overrideName, 1)
+ }
+ return ""
+ }
+ manifestPackageName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(a.Name())
+ if overridden {
+ return manifestPackageName
+ }
+ return ""
+}
diff --git a/apex/vndk.go b/apex/vndk.go
index 15f7f87..43fcfcd 100644
--- a/apex/vndk.go
+++ b/apex/vndk.go
@@ -26,7 +26,8 @@
)
const (
- vndkApexNamePrefix = "com.android.vndk.v"
+ vndkApexName = "com.android.vndk"
+ vndkApexNamePrefix = vndkApexName + ".v"
)
// apex_vndk creates a special variant of apex modules which contains only VNDK libraries.
diff --git a/bpf/bpf_test.go b/bpf/bpf_test.go
index 73b90ba..eeca057 100644
--- a/bpf/bpf_test.go
+++ b/bpf/bpf_test.go
@@ -48,21 +48,24 @@
os.Exit(run())
}
-func testContext(bp string) *android.TestContext {
+func testConfig(buildDir string, env map[string]string, bp string) android.Config {
mockFS := map[string][]byte{
"bpf.c": nil,
"BpfTest.cpp": nil,
}
- ctx := cc.CreateTestContext(bp, mockFS, android.Android)
+ return cc.TestConfig(buildDir, android.Android, env, bp, mockFS)
+}
+
+func testContext(config android.Config) *android.TestContext {
+ ctx := cc.CreateTestContext()
ctx.RegisterModuleType("bpf", bpfFactory)
- ctx.Register()
+ ctx.Register(config)
return ctx
}
func TestBpfDataDependency(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
bp := `
bpf {
name: "bpf.o",
@@ -77,7 +80,9 @@
}
`
- ctx := testContext(bp)
+ config := testConfig(buildDir, nil, bp)
+ ctx := testContext(config)
+
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if errs == nil {
_, errs = ctx.PrepareBuildActions(config)
diff --git a/cc/cc.go b/cc/cc.go
index 7aa02fc..470ea44 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -33,19 +33,25 @@
)
func init() {
- android.RegisterModuleType("cc_defaults", defaultsFactory)
+ RegisterCCBuildComponents(android.InitRegistrationContext)
- android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ pctx.Import("android/soong/cc/config")
+}
+
+func RegisterCCBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("cc_defaults", defaultsFactory)
+
+ ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("vndk", VndkMutator).Parallel()
ctx.BottomUp("link", LinkageMutator).Parallel()
ctx.BottomUp("ndk_api", NdkApiMutator).Parallel()
ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
ctx.BottomUp("version", VersionMutator).Parallel()
ctx.BottomUp("begin", BeginMutator).Parallel()
- ctx.BottomUp("sysprop", SyspropMutator).Parallel()
+ ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
})
- android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.TopDown("asan_deps", sanitizerDepsMutator(asan))
ctx.BottomUp("asan", sanitizerMutator(asan)).Parallel()
@@ -79,7 +85,6 @@
})
android.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
- pctx.Import("android/soong/cc/config")
}
type Deps struct {
@@ -412,6 +417,9 @@
hod android.HostOrDeviceSupported
multilib android.Multilib
+ // Allowable SdkMemberTypes of this module type.
+ sdkMemberTypes []android.SdkMemberType
+
// delegates, initialize before calling Init
features []feature
compiler compiler
@@ -755,11 +763,11 @@
return c.coverage.Properties.IsCoverageVariant
}
-func (c *Module) isNdk() bool {
+func (c *Module) IsNdk() bool {
return inList(c.Name(), ndkMigratedLibs)
}
-func (c *Module) IsLlndk(config android.Config) bool {
+func (c *Module) isLlndk(config android.Config) bool {
// Returns true for both LLNDK (public) and LLNDK-private libs.
return isLlndkLibrary(c.BaseModuleName(), config)
}
@@ -995,11 +1003,11 @@
}
func (ctx *moduleContextImpl) isNdk() bool {
- return ctx.mod.isNdk()
+ return ctx.mod.IsNdk()
}
func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
- return ctx.mod.IsLlndk(config)
+ return ctx.mod.isLlndk(config)
}
func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
@@ -1880,7 +1888,7 @@
return true
}
- if to.isVndkSp() || to.IsLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
+ if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
return false
}
@@ -1895,7 +1903,7 @@
}
if module, ok := ctx.Module().(*Module); ok {
if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
- if module.IsLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
+ if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
ctx.WalkDeps(check)
}
}
@@ -2572,9 +2580,6 @@
// If the device isn't compiling against the VNDK, we always
// use the core mode.
coreVariantNeeded = true
- } else if m.Target().NativeBridge == android.NativeBridgeEnabled {
- // Skip creating vendor variants for natvie bridge modules
- coreVariantNeeded = true
} else if _, ok := m.linker.(*llndkStubDecorator); ok {
// LL-NDK stubs only exist in the vendor variant, since the
// real libraries will be used in the core variant.
@@ -2623,14 +2628,6 @@
coreVariantNeeded = false
}
- if recoveryVariantNeeded {
- primaryArch := mctx.Config().DevicePrimaryArchType()
- moduleArch := m.Target().Arch.ArchType
- if moduleArch != primaryArch {
- recoveryVariantNeeded = false
- }
- }
-
for _, variant := range android.FirstUniqueStrings(vendorVariants) {
m.Properties.VendorVariants = append(m.Properties.VendorVariants, VendorVariationPrefix+variant)
}
diff --git a/cc/cc_test.go b/cc/cc_test.go
index 92c1e3b..27ff38f 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -52,15 +52,10 @@
os.Exit(run())
}
-func testCcWithConfig(t *testing.T, bp string, config android.Config) *android.TestContext {
+func testCcWithConfig(t *testing.T, config android.Config) *android.TestContext {
t.Helper()
- return testCcWithConfigForOs(t, bp, config, android.Android)
-}
-
-func testCcWithConfigForOs(t *testing.T, bp string, config android.Config, os android.OsType) *android.TestContext {
- t.Helper()
- ctx := CreateTestContext(bp, nil, os)
- ctx.Register()
+ ctx := CreateTestContext()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
android.FailIfErrored(t, errs)
@@ -72,29 +67,29 @@
func testCc(t *testing.T, bp string) *android.TestContext {
t.Helper()
- config := android.TestArchConfig(buildDir, nil)
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
- return testCcWithConfig(t, bp, config)
+ return testCcWithConfig(t, config)
}
func testCcNoVndk(t *testing.T, bp string) *android.TestContext {
t.Helper()
- config := android.TestArchConfig(buildDir, nil)
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
- return testCcWithConfig(t, bp, config)
+ return testCcWithConfig(t, config)
}
func testCcError(t *testing.T, pattern string, bp string) {
t.Helper()
- config := android.TestArchConfig(buildDir, nil)
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
- ctx := CreateTestContext(bp, nil, android.Android)
- ctx.Register()
+ ctx := CreateTestContext()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if len(errs) > 0 {
@@ -113,8 +108,8 @@
const (
coreVariant = "android_arm64_armv8-a_shared"
- vendorVariant = "android_arm64_armv8-a_vendor.VER_shared"
- recoveryVariant = "android_arm64_armv8-a_recovery_shared"
+ vendorVariant = "android_vendor.VER_arm64_armv8-a_shared"
+ recoveryVariant = "android_recovery_arm64_armv8-a_shared"
)
func TestFuchsiaDeps(t *testing.T) {
@@ -131,8 +126,8 @@
},
}`
- config := android.TestArchConfigFuchsia(buildDir, nil)
- ctx := testCcWithConfigForOs(t, bp, config, android.Fuchsia)
+ config := TestConfig(buildDir, android.Fuchsia, nil, bp, nil)
+ ctx := testCcWithConfig(t, config)
rt := false
fb := false
@@ -168,8 +163,8 @@
},
}`
- config := android.TestArchConfigFuchsia(buildDir, nil)
- ctx := testCcWithConfigForOs(t, bp, config, android.Fuchsia)
+ config := TestConfig(buildDir, android.Fuchsia, nil, bp, nil)
+ ctx := testCcWithConfig(t, config)
ld := ctx.ModuleForTests("libTest", "fuchsia_arm64_shared").Rule("ld")
var objs []string
for _, o := range ld.Inputs {
@@ -290,11 +285,7 @@
}
func TestVndk(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
- config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
- config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
-
- ctx := testCcWithConfig(t, `
+ bp := `
cc_library {
name: "libvndk",
vendor_available: true,
@@ -354,7 +345,13 @@
vndk_libraries_txt {
name: "vndkcorevariant.libraries.txt",
}
- `, config)
+ `
+
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+
+ ctx := testCcWithConfig(t, config)
checkVndkModule(t, ctx, "libvndk", "vndk-VER", false, "")
checkVndkModule(t, ctx, "libvndk_private", "vndk-VER", false, "")
@@ -376,8 +373,8 @@
vndkCoreLib2ndPath := filepath.Join(vndkLib2ndPath, "shared", "vndk-core")
vndkSpLib2ndPath := filepath.Join(vndkLib2ndPath, "shared", "vndk-sp")
- variant := "android_arm64_armv8-a_vendor.VER_shared"
- variant2nd := "android_arm_armv7-a-neon_vendor.VER_shared"
+ variant := "android_vendor.VER_arm64_armv8-a_shared"
+ variant2nd := "android_vendor.VER_arm_armv7-a-neon_shared"
checkVndkSnapshot(t, ctx, "libvndk", "libvndk.so", vndkCoreLibPath, variant)
checkVndkSnapshot(t, ctx, "libvndk", "libvndk.so", vndkCoreLib2ndPath, variant2nd)
@@ -412,13 +409,14 @@
}
func TestVndkLibrariesTxtAndroidMk(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
- config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
- config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
- ctx := testCcWithConfig(t, `
+ bp := `
vndk_libraries_txt {
name: "llndk.libraries.txt",
- }`, config)
+ }`
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+ ctx := testCcWithConfig(t, config)
module := ctx.ModuleForTests("llndk.libraries.txt", "")
entries := android.AndroidMkEntriesForTest(t, config, "", module.Module())[0]
@@ -426,14 +424,7 @@
}
func TestVndkUsingCoreVariant(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
- config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
- config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
- config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
-
- setVndkMustUseVendorVariantListForTest(config, []string{"libvndk"})
-
- ctx := testCcWithConfig(t, `
+ bp := `
cc_library {
name: "libvndk",
vendor_available: true,
@@ -465,7 +456,16 @@
vndk_libraries_txt {
name: "vndkcorevariant.libraries.txt",
}
- `, config)
+ `
+
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+ config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
+
+ setVndkMustUseVendorVariantListForTest(config, []string{"libvndk"})
+
+ ctx := testCcWithConfig(t, config)
checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", []string{"libc++.so", "libvndk2.so", "libvndk_sp.so"})
}
@@ -1446,75 +1446,77 @@
}
func TestMakeLinkType(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
+ bp := `
+ cc_library {
+ name: "libvndk",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ },
+ }
+ cc_library {
+ name: "libvndksp",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ support_system_process: true,
+ },
+ }
+ cc_library {
+ name: "libvndkprivate",
+ vendor_available: false,
+ vndk: {
+ enabled: true,
+ },
+ }
+ cc_library {
+ name: "libvendor",
+ vendor: true,
+ }
+ cc_library {
+ name: "libvndkext",
+ vendor: true,
+ vndk: {
+ enabled: true,
+ extends: "libvndk",
+ },
+ }
+ vndk_prebuilt_shared {
+ name: "prevndk",
+ version: "27",
+ target_arch: "arm",
+ binder32bit: true,
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ },
+ arch: {
+ arm: {
+ srcs: ["liba.so"],
+ },
+ },
+ }
+ cc_library {
+ name: "libllndk",
+ }
+ llndk_library {
+ name: "libllndk",
+ symbol_file: "",
+ }
+ cc_library {
+ name: "libllndkprivate",
+ }
+ llndk_library {
+ name: "libllndkprivate",
+ vendor_available: false,
+ symbol_file: "",
+ }`
+
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
// native:vndk
- ctx := testCcWithConfig(t, `
- cc_library {
- name: "libvndk",
- vendor_available: true,
- vndk: {
- enabled: true,
- },
- }
- cc_library {
- name: "libvndksp",
- vendor_available: true,
- vndk: {
- enabled: true,
- support_system_process: true,
- },
- }
- cc_library {
- name: "libvndkprivate",
- vendor_available: false,
- vndk: {
- enabled: true,
- },
- }
- cc_library {
- name: "libvendor",
- vendor: true,
- }
- cc_library {
- name: "libvndkext",
- vendor: true,
- vndk: {
- enabled: true,
- extends: "libvndk",
- },
- }
- vndk_prebuilt_shared {
- name: "prevndk",
- version: "27",
- target_arch: "arm",
- binder32bit: true,
- vendor_available: true,
- vndk: {
- enabled: true,
- },
- arch: {
- arm: {
- srcs: ["liba.so"],
- },
- },
- }
- cc_library {
- name: "libllndk",
- }
- llndk_library {
- name: "libllndk",
- symbol_file: "",
- }
- cc_library {
- name: "libllndkprivate",
- }
- llndk_library {
- name: "libllndkprivate",
- vendor_available: false,
- symbol_file: "",
- }`, config)
+ ctx := testCcWithConfig(t, config)
assertMapKeys(t, vndkCoreLibraries(config),
[]string{"libvndk", "libvndkprivate"})
@@ -1525,7 +1527,7 @@
assertMapKeys(t, vndkPrivateLibraries(config),
[]string{"libft2", "libllndkprivate", "libvndkprivate"})
- vendorVariant27 := "android_arm64_armv8-a_vendor.27_shared"
+ vendorVariant27 := "android_vendor.27_arm64_armv8-a_shared"
tests := []struct {
variant string
@@ -1976,7 +1978,7 @@
`)
// _static variant is used since _shared reuses *.o from the static variant
- cc := ctx.ModuleForTests("libvendor", "android_arm_armv7-a-neon_vendor.VER_static").Rule("cc")
+ cc := ctx.ModuleForTests("libvendor", "android_vendor.VER_arm_armv7-a-neon_static").Rule("cc")
cflags := cc.Args["cFlags"]
if !strings.Contains(cflags, "-Imy_include") {
t.Errorf("cflags for libvendor must contain -Imy_include, but was %#v.", cflags)
@@ -2062,7 +2064,7 @@
// runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core
// and vendor variants.
- variant = "android_arm64_armv8-a_vendor.VER_shared"
+ variant = "android_vendor.VER_arm64_armv8-a_shared"
module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
checkRuntimeLibs(t, []string{"libvendor_available1.vendor"}, module)
@@ -2078,7 +2080,7 @@
module := ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
- variant = "android_arm64_armv8-a_vendor.VER_shared"
+ variant = "android_vendor.VER_arm64_armv8-a_shared"
module = ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
checkRuntimeLibs(t, nil, module)
}
@@ -2257,7 +2259,7 @@
`)
coreVariant := "android_arm64_armv8-a_shared"
- vendorVariant := "android_arm64_armv8-a_vendor.VER_shared"
+ vendorVariant := "android_vendor.VER_arm64_armv8-a_shared"
// test if header search paths are correctly added
// _static variant is used since _shared reuses *.o from the static variant
@@ -2304,7 +2306,7 @@
`)
variants := ctx.ModuleVariantsForTests("librecovery")
- const arm64 = "android_arm64_armv8-a_recovery_shared"
+ const arm64 = "android_recovery_arm64_armv8-a_shared"
if len(variants) != 1 || !android.InList(arm64, variants) {
t.Errorf("variants of librecovery must be \"%s\" only, but was %#v", arm64, variants)
}
@@ -2476,7 +2478,7 @@
srcs: ["foo.c"],
}`)
- variant := "android_arm64_armv8-a"
+ variant := "android_arm64_armv8-a_fuzzer"
ctx.ModuleForTests("fuzz_smoke_test", variant).Rule("cc")
}
diff --git a/cc/compdb.go b/cc/compdb.go
index 519380f..dff14db 100644
--- a/cc/compdb.go
+++ b/cc/compdb.go
@@ -27,7 +27,7 @@
// This singleton generates a compile_commands.json file. It does so for each
// blueprint Android.bp resulting in a cc.Module when either make, mm, mma, mmm
// or mmma is called. It will only create a single compile_commands.json file
-// at out/development/ide/compdb/compile_commands.json. It will also symlink it
+// at ${OUT_DIR}/soong/development/ide/compdb/compile_commands.json. It will also symlink it
// to ${SOONG_LINK_COMPDB_TO} if set. In general this should be created by running
// make SOONG_GEN_COMPDB=1 nothing to get all targets.
@@ -43,7 +43,7 @@
const (
compdbFilename = "compile_commands.json"
- compdbOutputProjectsDirectory = "out/development/ide/compdb"
+ compdbOutputProjectsDirectory = "development/ide/compdb"
// Environment variables used to modify behavior of this singleton.
envVariableGenerateCompdb = "SOONG_GEN_COMPDB"
@@ -78,12 +78,12 @@
})
// Create the output file.
- dir := filepath.Join(getCompdbAndroidSrcRootDirectory(ctx), compdbOutputProjectsDirectory)
- os.MkdirAll(dir, 0777)
- compDBFile := filepath.Join(dir, compdbFilename)
- f, err := os.Create(compdbFilename)
+ dir := android.PathForOutput(ctx, compdbOutputProjectsDirectory)
+ os.MkdirAll(dir.String(), 0777)
+ compDBFile := dir.Join(ctx, compdbFilename)
+ f, err := os.Create(compDBFile.String())
if err != nil {
- log.Fatalf("Could not create file %s: %s", filepath.Join(dir, compdbFilename), err)
+ log.Fatalf("Could not create file %s: %s", compDBFile, err)
}
defer f.Close()
@@ -106,7 +106,7 @@
finalLinkPath := filepath.Join(ctx.Config().Getenv(envVariableCompdbLink), compdbFilename)
if finalLinkPath != "" {
os.Remove(finalLinkPath)
- if err := os.Symlink(compDBFile, finalLinkPath); err != nil {
+ if err := os.Symlink(compDBFile.String(), finalLinkPath); err != nil {
log.Fatalf("Unable to symlink %s to %s: %s", compDBFile, finalLinkPath, err)
}
}
diff --git a/cc/fuzz.go b/cc/fuzz.go
index 0d3cc74..8b84be8 100644
--- a/cc/fuzz.go
+++ b/cc/fuzz.go
@@ -27,9 +27,10 @@
type FuzzConfig struct {
// Email address of people to CC on bugs or contact about this fuzz target.
Cc []string `json:"cc,omitempty"`
- // Boolean specifying whether to disable the fuzz target from running
- // automatically in continuous fuzzing infrastructure.
- Disable *bool `json:"disable,omitempty"`
+ // Specify whether to enable continuous fuzzing on devices. Defaults to true.
+ Fuzz_on_haiku_device *bool `json:"fuzz_on_haiku_device,omitempty"`
+ // Specify whether to enable continuous fuzzing on host. Defaults to true.
+ Fuzz_on_haiku_host *bool `json:"fuzz_on_haiku_host,omitempty"`
// Component in Google's bug tracking system that bugs should be filed to.
Componentid *int64 `json:"componentid,omitempty"`
// Hotlists in Google's bug tracking system that bugs should be marked with.
diff --git a/cc/genrule.go b/cc/genrule.go
index e74dd4d..b9765a4 100644
--- a/cc/genrule.go
+++ b/cc/genrule.go
@@ -59,12 +59,7 @@
}
func (g *GenruleExtraProperties) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool {
- if Bool(g.Recovery_available) {
- primaryArch := ctx.Config().DevicePrimaryArchType()
- moduleArch := ctx.Target().Arch.ArchType
- return moduleArch == primaryArch
- }
- return false
+ return Bool(g.Recovery_available)
}
func (g *GenruleExtraProperties) ExtraImageVariations(ctx android.BaseModuleContext) []string {
diff --git a/cc/genrule_test.go b/cc/genrule_test.go
index 785e3e1..d38cf27 100644
--- a/cc/genrule_test.go
+++ b/cc/genrule_test.go
@@ -21,31 +21,20 @@
"android/soong/android"
)
-func testGenruleContext(config android.Config, bp string,
- fs map[string][]byte) *android.TestContext {
-
+func testGenruleContext(config android.Config) *android.TestContext {
ctx := android.NewTestArchContext()
ctx.RegisterModuleType("cc_genrule", genRuleFactory)
- ctx.Register()
-
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- "tool": nil,
- "foo": nil,
- "bar": nil,
- }
-
- for k, v := range fs {
- mockFS[k] = v
- }
-
- ctx.MockFileSystem(mockFS)
+ ctx.Register(config)
return ctx
}
func TestArchGenruleCmd(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
+ fs := map[string][]byte{
+ "tool": nil,
+ "foo": nil,
+ "bar": nil,
+ }
bp := `
cc_genrule {
name: "gen",
@@ -63,8 +52,9 @@
},
}
`
+ config := android.TestArchConfig(buildDir, nil, bp, fs)
- ctx := testGenruleContext(config, bp, nil)
+ ctx := testGenruleContext(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if errs == nil {
diff --git a/cc/library.go b/cc/library.go
index 04130c4..ae95bc5 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -174,12 +174,16 @@
}
func init() {
- android.RegisterModuleType("cc_library_static", LibraryStaticFactory)
- android.RegisterModuleType("cc_library_shared", LibrarySharedFactory)
- android.RegisterModuleType("cc_library", LibraryFactory)
- android.RegisterModuleType("cc_library_host_static", LibraryHostStaticFactory)
- android.RegisterModuleType("cc_library_host_shared", LibraryHostSharedFactory)
- android.RegisterModuleType("cc_library_headers", LibraryHeaderFactory)
+ RegisterLibraryBuildComponents(android.InitRegistrationContext)
+}
+
+func RegisterLibraryBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("cc_library_static", LibraryStaticFactory)
+ ctx.RegisterModuleType("cc_library_shared", LibrarySharedFactory)
+ ctx.RegisterModuleType("cc_library", LibraryFactory)
+ ctx.RegisterModuleType("cc_library_host_static", LibraryHostStaticFactory)
+ ctx.RegisterModuleType("cc_library_host_shared", LibraryHostSharedFactory)
+ ctx.RegisterModuleType("cc_library_headers", LibraryHeaderFactory)
}
// cc_library creates both static and/or shared libraries for a device and/or
@@ -188,6 +192,11 @@
// host.
func LibraryFactory() android.Module {
module, _ := NewLibrary(android.HostAndDeviceSupported)
+ // Can be used as both a static and a shared library.
+ module.sdkMemberTypes = []android.SdkMemberType{
+ sharedLibrarySdkMemberType,
+ staticLibrarySdkMemberType,
+ }
return module.Init()
}
@@ -195,6 +204,7 @@
func LibraryStaticFactory() android.Module {
module, library := NewLibrary(android.HostAndDeviceSupported)
library.BuildOnlyStatic()
+ module.sdkMemberTypes = []android.SdkMemberType{staticLibrarySdkMemberType}
return module.Init()
}
@@ -202,6 +212,7 @@
func LibrarySharedFactory() android.Module {
module, library := NewLibrary(android.HostAndDeviceSupported)
library.BuildOnlyShared()
+ module.sdkMemberTypes = []android.SdkMemberType{sharedLibrarySdkMemberType}
return module.Init()
}
@@ -210,6 +221,7 @@
func LibraryHostStaticFactory() android.Module {
module, library := NewLibrary(android.HostSupported)
library.BuildOnlyStatic()
+ module.sdkMemberTypes = []android.SdkMemberType{staticLibrarySdkMemberType}
return module.Init()
}
@@ -217,6 +229,7 @@
func LibraryHostSharedFactory() android.Module {
module, library := NewLibrary(android.HostSupported)
library.BuildOnlyShared()
+ module.sdkMemberTypes = []android.SdkMemberType{sharedLibrarySdkMemberType}
return module.Init()
}
diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go
index 9319070..2c18e68 100644
--- a/cc/library_sdk_member.go
+++ b/cc/library_sdk_member.go
@@ -24,23 +24,26 @@
// This file contains support for using cc library modules within an sdk.
+var sharedLibrarySdkMemberType = &librarySdkMemberType{
+ SdkMemberTypeBase: android.SdkMemberTypeBase{
+ PropertyName: "native_shared_libs",
+ },
+ prebuiltModuleType: "cc_prebuilt_library_shared",
+ linkTypes: []string{"shared"},
+}
+
+var staticLibrarySdkMemberType = &librarySdkMemberType{
+ SdkMemberTypeBase: android.SdkMemberTypeBase{
+ PropertyName: "native_static_libs",
+ },
+ prebuiltModuleType: "cc_prebuilt_library_static",
+ linkTypes: []string{"static"},
+}
+
func init() {
// Register sdk member types.
- android.RegisterSdkMemberType(&librarySdkMemberType{
- SdkMemberTypeBase: android.SdkMemberTypeBase{
- PropertyName: "native_shared_libs",
- },
- prebuiltModuleType: "cc_prebuilt_library_shared",
- linkTypes: []string{"shared"},
- })
-
- android.RegisterSdkMemberType(&librarySdkMemberType{
- SdkMemberTypeBase: android.SdkMemberTypeBase{
- PropertyName: "native_static_libs",
- },
- prebuiltModuleType: "cc_prebuilt_library_static",
- linkTypes: []string{"static"},
- })
+ android.RegisterSdkMemberType(sharedLibrarySdkMemberType)
+ android.RegisterSdkMemberType(staticLibrarySdkMemberType)
}
type librarySdkMemberType struct {
@@ -72,8 +75,16 @@
}
func (mt *librarySdkMemberType) IsInstance(module android.Module) bool {
- _, ok := module.(*Module)
- return ok
+ // Check the module to see if it can be used with this module type.
+ if m, ok := module.(*Module); ok {
+ for _, allowableMemberType := range m.sdkMemberTypes {
+ if allowableMemberType == mt {
+ return true
+ }
+ }
+ }
+
+ return false
}
// copy exported header files and stub *.so files
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index f20616f..b0cf489 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -19,9 +19,13 @@
)
func init() {
- android.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory)
- android.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory)
- android.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory)
+ RegisterPrebuiltBuildComponents(android.InitRegistrationContext)
+}
+
+func RegisterPrebuiltBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory)
+ ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory)
+ ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory)
}
type prebuiltLinkerInterface interface {
diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go
index 7ddf6eb..3d809fc 100644
--- a/cc/prebuilt_test.go
+++ b/cc/prebuilt_test.go
@@ -68,18 +68,11 @@
"libe.a": nil,
}
- config := android.TestArchConfig(buildDir, nil)
+ config := TestConfig(buildDir, android.Android, nil, bp, fs)
- ctx := CreateTestContext(bp, fs, android.Android)
+ ctx := CreateTestContext()
- ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory)
- ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory)
- ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory)
-
- ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators)
- ctx.PostDepsMutators(android.RegisterPrebuiltsPostDepsMutators)
-
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
android.FailIfErrored(t, errs)
diff --git a/cc/sabi.go b/cc/sabi.go
index 7c9c651..8cef170 100644
--- a/cc/sabi.go
+++ b/cc/sabi.go
@@ -80,7 +80,7 @@
func sabiDepsMutator(mctx android.TopDownMutatorContext) {
if c, ok := mctx.Module().(*Module); ok &&
- ((c.IsVndk() && c.UseVndk()) || c.IsLlndk(mctx.Config()) ||
+ ((c.IsVndk() && c.UseVndk()) || c.isLlndk(mctx.Config()) ||
(c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) {
mctx.VisitDirectDeps(func(m android.Module) {
tag := mctx.OtherModuleDependencyTag(m)
diff --git a/cc/test_data_test.go b/cc/test_data_test.go
index 962ff26..ae59e2f 100644
--- a/cc/test_data_test.go
+++ b/cc/test_data_test.go
@@ -115,20 +115,17 @@
}
defer os.RemoveAll(buildDir)
- config := android.TestConfig(buildDir, nil)
-
for _, test := range testDataTests {
t.Run(test.name, func(t *testing.T) {
- ctx := android.NewTestContext()
- ctx.MockFileSystem(map[string][]byte{
- "Blueprints": []byte(`subdirs = ["dir"]`),
- "dir/Blueprints": []byte(test.modules),
+ config := android.TestConfig(buildDir, nil, "", map[string][]byte{
+ "dir/Android.bp": []byte(test.modules),
"dir/baz": nil,
"dir/bar/baz": nil,
})
+ ctx := android.NewTestContext()
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
ctx.RegisterModuleType("test", newTest)
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles("Blueprints")
android.FailIfErrored(t, errs)
diff --git a/cc/testing.go b/cc/testing.go
index 417ea4a..bc31077 100644
--- a/cc/testing.go
+++ b/cc/testing.go
@@ -18,6 +18,18 @@
"android/soong/android"
)
+func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
+ RegisterPrebuiltBuildComponents(ctx)
+ android.RegisterPrebuiltMutators(ctx)
+
+ RegisterCCBuildComponents(ctx)
+ RegisterLibraryBuildComponents(ctx)
+
+ ctx.RegisterModuleType("toolchain_library", ToolchainLibraryFactory)
+ ctx.RegisterModuleType("llndk_library", LlndkLibraryFactory)
+ ctx.RegisterModuleType("cc_object", ObjectFactory)
+}
+
func GatherRequiredDepsForTest(os android.OsType) string {
ret := `
toolchain_library {
@@ -97,6 +109,14 @@
src: "",
}
+ // Needed for sanitizer
+ cc_prebuilt_library_shared {
+ name: "libclang_rt.ubsan_standalone-aarch64-android",
+ vendor_available: true,
+ recovery_available: true,
+ srcs: [""],
+ }
+
toolchain_library {
name: "libgcc",
vendor_available: true,
@@ -249,45 +269,13 @@
return ret
}
-func CreateTestContext(bp string, fs map[string][]byte,
- os android.OsType) *android.TestContext {
-
- ctx := android.NewTestArchContext()
- ctx.RegisterModuleType("cc_defaults", defaultsFactory)
- ctx.RegisterModuleType("cc_binary", BinaryFactory)
- ctx.RegisterModuleType("cc_binary_host", binaryHostFactory)
- ctx.RegisterModuleType("cc_fuzz", FuzzFactory)
- ctx.RegisterModuleType("cc_library", LibraryFactory)
- ctx.RegisterModuleType("cc_library_shared", LibrarySharedFactory)
- ctx.RegisterModuleType("cc_library_static", LibraryStaticFactory)
- ctx.RegisterModuleType("cc_library_headers", LibraryHeaderFactory)
- ctx.RegisterModuleType("cc_test", TestFactory)
- ctx.RegisterModuleType("toolchain_library", ToolchainLibraryFactory)
- ctx.RegisterModuleType("llndk_library", LlndkLibraryFactory)
- ctx.RegisterModuleType("llndk_headers", llndkHeadersFactory)
- ctx.RegisterModuleType("ndk_library", NdkLibraryFactory)
- ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
- ctx.RegisterModuleType("cc_object", ObjectFactory)
- ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
- ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
- ctx.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
- ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("link", LinkageMutator).Parallel()
- ctx.BottomUp("vndk", VndkMutator).Parallel()
- ctx.BottomUp("version", VersionMutator).Parallel()
- ctx.BottomUp("begin", BeginMutator).Parallel()
- })
- ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
- })
- ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
+func TestConfig(buildDir string, os android.OsType, env map[string]string,
+ bp string, fs map[string][]byte) android.Config {
// add some modules that are required by the compiler and/or linker
bp = bp + GatherRequiredDepsForTest(os)
mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
"foo.c": nil,
"foo.lds": nil,
"bar.c": nil,
@@ -305,7 +293,31 @@
mockFS[k] = v
}
- ctx.MockFileSystem(mockFS)
+ var config android.Config
+ if os == android.Fuchsia {
+ config = android.TestArchConfigFuchsia(buildDir, env, bp, mockFS)
+ } else {
+ config = android.TestArchConfig(buildDir, env, bp, mockFS)
+ }
+
+ return config
+}
+
+func CreateTestContext() *android.TestContext {
+ ctx := android.NewTestArchContext()
+ ctx.RegisterModuleType("cc_binary", BinaryFactory)
+ ctx.RegisterModuleType("cc_binary_host", binaryHostFactory)
+ ctx.RegisterModuleType("cc_fuzz", FuzzFactory)
+ ctx.RegisterModuleType("cc_test", TestFactory)
+ ctx.RegisterModuleType("llndk_headers", llndkHeadersFactory)
+ ctx.RegisterModuleType("ndk_library", NdkLibraryFactory)
+ ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
+ ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
+ ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
+ ctx.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
+ RegisterRequiredBuildComponentsForTest(ctx)
+ ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
+ ctx.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
return ctx
}
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go
index ee04dfd..fc1bae1 100644
--- a/dexpreopt/dexpreopt.go
+++ b/dexpreopt/dexpreopt.go
@@ -222,6 +222,14 @@
invocationPath := odexPath.ReplaceExtension(ctx, "invocation")
+ // TODO(skvadrik): fix this to use boot image location in the module config (currently it is broken
+ // in JIT-zygote builds, because "default" boot image is hard-coded in parts of the module config).
+ bootImage := module.DexPreoptImages[archIdx]
+ var bootImageLocation string
+ if bootImage != nil {
+ bootImageLocation = PathToLocation(bootImage, arch)
+ }
+
// The class loader context using paths in the build
var classLoaderContextHost android.Paths
@@ -349,7 +357,7 @@
Flag("--runtime-arg").FlagWithList("-Xbootclasspath-locations:", module.PreoptBootClassPathDexLocations, ":").
Flag("${class_loader_context_arg}").
Flag("${stored_class_loader_context_arg}").
- FlagWithArg("--boot-image=", strings.Join(module.DexPreoptImageLocations, ":")).Implicits(module.DexPreoptImagesDeps[archIdx].Paths()).
+ FlagWithArg("--boot-image=", bootImageLocation).Implicits(module.DexPreoptImagesDeps[archIdx].Paths()).
FlagWithInput("--dex-file=", module.DexPath).
FlagWithArg("--dex-location=", dexLocationArg).
FlagWithOutput("--oat-file=", odexPath).ImplicitOutput(vdexPath).
diff --git a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go
index 009e906..6f51080 100644
--- a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go
+++ b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go
@@ -71,7 +71,7 @@
usage("path to module configuration file is required")
}
- ctx := &pathContext{android.TestConfig(*outDir, nil)}
+ ctx := &pathContext{android.TestConfig(*outDir, nil, "", nil)}
globalConfig, _, err := dexpreopt.LoadGlobalConfig(ctx, *globalConfigPath)
if err != nil {
diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go
index 3264d6a..a128dc0 100644
--- a/dexpreopt/dexpreopt_test.go
+++ b/dexpreopt/dexpreopt_test.go
@@ -61,7 +61,7 @@
}
func TestDexPreopt(t *testing.T) {
- ctx := android.PathContextForTesting(android.TestConfig("out", nil), nil)
+ ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil))
global, module := GlobalConfigForTests(ctx), testSystemModuleConfig(ctx, "test")
rule, err := GenerateDexpreoptRule(ctx, global, module)
@@ -80,7 +80,7 @@
}
func TestDexPreoptSystemOther(t *testing.T) {
- ctx := android.PathContextForTesting(android.TestConfig("out", nil), nil)
+ ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil))
global := GlobalConfigForTests(ctx)
systemModule := testSystemModuleConfig(ctx, "Stest")
systemProductModule := testSystemProductModuleConfig(ctx, "SPtest")
@@ -138,7 +138,7 @@
}
func TestDexPreoptProfile(t *testing.T) {
- ctx := android.PathContextForTesting(android.TestConfig("out", nil), nil)
+ ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil))
global, module := GlobalConfigForTests(ctx), testSystemModuleConfig(ctx, "test")
module.ProfileClassListing = android.OptionalPathForPath(android.PathForTesting("profile"))
diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go
index 07de999..ea49e08 100644
--- a/genrule/genrule_test.go
+++ b/genrule/genrule_test.go
@@ -51,8 +51,7 @@
os.Exit(run())
}
-func testContext(config android.Config, bp string,
- fs map[string][]byte) *android.TestContext {
+func testContext(config android.Config) *android.TestContext {
ctx := android.NewTestArchContext()
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
@@ -61,8 +60,12 @@
ctx.RegisterModuleType("genrule_defaults", defaultsFactory)
ctx.RegisterModuleType("tool", toolFactory)
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.Register()
+ ctx.Register(config)
+ return ctx
+}
+
+func testConfig(bp string, fs map[string][]byte) android.Config {
bp += `
tool {
name: "tool",
@@ -104,7 +107,6 @@
`
mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
"tool": nil,
"tool_file1": nil,
"tool_file2": nil,
@@ -119,9 +121,7 @@
mockFS[k] = v
}
- ctx.MockFileSystem(mockFS)
-
- return ctx
+ return android.TestArchConfig(buildDir, nil, bp, mockFS)
}
func TestGenruleCmd(t *testing.T) {
@@ -461,15 +461,15 @@
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
bp := "genrule {\n"
bp += "name: \"gen\",\n"
bp += test.prop
bp += "}\n"
+ config := testConfig(bp, nil)
config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(test.allowMissingDependencies)
- ctx := testContext(config, bp, nil)
+ ctx := testContext(config)
ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
@@ -546,14 +546,14 @@
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
bp := "gensrcs {\n"
bp += `name: "gen",` + "\n"
bp += `output_extension: "h",` + "\n"
bp += test.prop
bp += "}\n"
- ctx := testContext(config, bp, nil)
+ config := testConfig(bp, nil)
+ ctx := testContext(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if errs == nil {
@@ -595,7 +595,6 @@
}
func TestGenruleDefaults(t *testing.T) {
- config := android.TestArchConfig(buildDir, nil)
bp := `
genrule_defaults {
name: "gen_defaults1",
@@ -613,7 +612,8 @@
defaults: ["gen_defaults1", "gen_defaults2"],
}
`
- ctx := testContext(config, bp, nil)
+ config := testConfig(bp, nil)
+ ctx := testContext(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if errs == nil {
_, errs = ctx.PrepareBuildActions(config)
diff --git a/java/aar.go b/java/aar.go
index e0bea5d..201e590 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -34,8 +34,12 @@
}
func init() {
- android.RegisterModuleType("android_library_import", AARImportFactory)
- android.RegisterModuleType("android_library", AndroidLibraryFactory)
+ RegisterAARBuildComponents(android.InitRegistrationContext)
+}
+
+func RegisterAARBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("android_library_import", AARImportFactory)
+ ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
}
//
diff --git a/java/app.go b/java/app.go
index aa9c78c..94f6bb1 100755
--- a/java/app.go
+++ b/java/app.go
@@ -33,18 +33,22 @@
var supportedDpis = []string{"ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"}
func init() {
- android.RegisterModuleType("android_app", AndroidAppFactory)
- android.RegisterModuleType("android_test", AndroidTestFactory)
- android.RegisterModuleType("android_test_helper_app", AndroidTestHelperAppFactory)
- android.RegisterModuleType("android_app_certificate", AndroidAppCertificateFactory)
- android.RegisterModuleType("override_android_app", OverrideAndroidAppModuleFactory)
- android.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)
- android.RegisterModuleType("android_app_import", AndroidAppImportFactory)
- android.RegisterModuleType("android_test_import", AndroidTestImportFactory)
+ RegisterAppBuildComponents(android.InitRegistrationContext)
initAndroidAppImportVariantGroupTypes()
}
+func RegisterAppBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("android_app", AndroidAppFactory)
+ ctx.RegisterModuleType("android_test", AndroidTestFactory)
+ ctx.RegisterModuleType("android_test_helper_app", AndroidTestHelperAppFactory)
+ ctx.RegisterModuleType("android_app_certificate", AndroidAppCertificateFactory)
+ ctx.RegisterModuleType("override_android_app", OverrideAndroidAppModuleFactory)
+ ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)
+ ctx.RegisterModuleType("android_app_import", AndroidAppImportFactory)
+ ctx.RegisterModuleType("android_test_import", AndroidTestImportFactory)
+}
+
// AndroidManifest.xml merging
// package splits
@@ -511,7 +515,7 @@
if IsJniDepTag(tag) || tag == cc.SharedDepTag {
if dep, ok := module.(*cc.Module); ok {
- if dep.IsLlndk(ctx.Config()) || dep.IsStubs() {
+ if dep.IsNdk() || dep.IsStubs() {
return false
}
@@ -646,7 +650,7 @@
fixedConfig := android.PathForModuleOut(ctx, "test_config_fixer", "AndroidTest.xml")
rule := android.NewRuleBuilder()
rule.Command().BuiltTool(ctx, "test_config_fixer").
- FlagWithArg("--manifest ", a.manifestPath.String()).
+ FlagWithInput("--manifest ", a.manifestPath).
FlagWithArg("--package-name ", *a.overridableAppProperties.Package_name).
Input(a.testConfig).
Output(fixedConfig)
diff --git a/java/app_test.go b/java/app_test.go
index 5cf0ba7..9bdef4e 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -43,7 +43,7 @@
}
)
-func testAppContext(bp string, fs map[string][]byte) *android.TestContext {
+func testAppConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
appFS := map[string][]byte{}
for k, v := range fs {
appFS[k] = v
@@ -53,13 +53,13 @@
appFS[file] = nil
}
- return testContext(bp, appFS)
+ return testConfig(env, bp, appFS)
}
func testApp(t *testing.T, bp string) *android.TestContext {
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
@@ -301,8 +301,8 @@
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
- config := testConfig(nil)
- ctx := testContext(fmt.Sprintf(bp, testCase.prop), fs)
+ config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs)
+ ctx := testContext()
run(t, ctx, config)
module := ctx.ModuleForTests("foo", "android_common")
@@ -509,7 +509,7 @@
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, fs)
config.TestProductVariables.DeviceResourceOverlays = deviceResourceOverlays
config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
if testCase.enforceRROTargets != nil {
@@ -519,7 +519,7 @@
config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
}
- ctx := testAppContext(bp, fs)
+ ctx := testContext()
run(t, ctx, config)
resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
@@ -649,12 +649,12 @@
%s
}`, moduleType, test.sdkVersion, platformApiProp)
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename
config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
@@ -777,9 +777,6 @@
`)
for _, enforce := range []bool{true, false} {
-
- config := testConfig(nil)
- config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
bp := `
android_app {
name: "foo",
@@ -788,10 +785,13 @@
platform_apis: true,
}
`
+
+ config := testAppConfig(nil, bp, nil)
+ config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
if enforce {
- testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", bp, config)
+ testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", config)
} else {
- testJavaWithConfig(t, bp, config)
+ testJavaWithConfig(t, config)
}
}
}
@@ -954,11 +954,11 @@
for _, test := range testCases {
t.Run(test.name, func(t *testing.T) {
- config := testConfig(nil)
+ config := testAppConfig(nil, test.bp, nil)
if test.certificateOverride != "" {
config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride}
}
- ctx := testAppContext(test.bp, nil)
+ ctx := testContext()
run(t, ctx, config)
foo := ctx.ModuleForTests("foo", "android_common")
@@ -1014,11 +1014,11 @@
for _, test := range testCases {
t.Run(test.name, func(t *testing.T) {
- config := testConfig(nil)
+ config := testAppConfig(nil, test.bp, nil)
if test.packageNameOverride != "" {
config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride}
}
- ctx := testAppContext(test.bp, nil)
+ ctx := testContext()
run(t, ctx, config)
foo := ctx.ModuleForTests("foo", "android_common")
@@ -1051,9 +1051,9 @@
sdk_version: "current",
}
`
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
@@ -1471,10 +1471,10 @@
jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)")
for _, test := range testCases {
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
config.TestProductVariables.AAPTPreferredConfig = test.aaptPreferredConfig
config.TestProductVariables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
@@ -1770,10 +1770,10 @@
}
`
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
config.TestProductVariables.MissingUsesLibraries = []string{"baz"}
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
@@ -2044,12 +2044,12 @@
test := func(t *testing.T, bp string, want bool, unbundled bool) {
t.Helper()
- config := testConfig(nil)
+ config := testAppConfig(nil, bp, nil)
if unbundled {
config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
}
- ctx := testAppContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
diff --git a/java/config/config.go b/java/config/config.go
index fee6341..9738454 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -29,7 +29,7 @@
DefaultBootclasspathLibraries = []string{"core.platform.api.stubs", "core-lambda-stubs"}
DefaultSystemModules = "core-platform-api-stubs-system-modules"
- DefaultLibraries = []string{"ext", "framework", "updatable_media_stubs"}
+ DefaultLibraries = []string{"ext", "framework"}
DefaultLambdaStubsLibrary = "core-lambda-stubs"
SdkLambdaStubsPath = "prebuilts/sdk/tools/core-lambda-stubs.jar"
@@ -46,6 +46,7 @@
"core-oj",
"core-libart",
"updatable-media",
+ "ike",
}
)
diff --git a/java/dexpreopt_bootjars_test.go b/java/dexpreopt_bootjars_test.go
index 29a5abe..8f29e9e 100644
--- a/java/dexpreopt_bootjars_test.go
+++ b/java/dexpreopt_bootjars_test.go
@@ -44,14 +44,14 @@
}
`
- config := testConfig(nil)
+ config := testConfig(nil, bp, nil)
- pathCtx := android.PathContextForTesting(config, nil)
+ pathCtx := android.PathContextForTesting(config)
dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
dexpreoptConfig.ArtApexJars = []string{"foo", "bar", "baz"}
setDexpreoptTestGlobalConfig(config, dexpreoptConfig)
- ctx := testContext(bp, nil)
+ ctx := testContext()
ctx.RegisterSingletonType("dex_bootjars", dexpreoptBootJarsFactory)
diff --git a/java/droiddoc.go b/java/droiddoc.go
index 92f9246..3b7f772 100644
--- a/java/droiddoc.go
+++ b/java/droiddoc.go
@@ -27,19 +27,8 @@
)
func init() {
- android.RegisterModuleType("doc_defaults", DocDefaultsFactory)
- android.RegisterModuleType("stubs_defaults", StubsDefaultsFactory)
-
- android.RegisterModuleType("droiddoc", DroiddocFactory)
- android.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
- android.RegisterModuleType("droiddoc_exported_dir", ExportedDroiddocDirFactory)
- android.RegisterModuleType("javadoc", JavadocFactory)
- android.RegisterModuleType("javadoc_host", JavadocHostFactory)
-
- android.RegisterModuleType("droidstubs", DroidstubsFactory)
- android.RegisterModuleType("droidstubs_host", DroidstubsHostFactory)
-
- android.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory)
+ RegisterDocsBuildComponents(android.InitRegistrationContext)
+ RegisterStubsBuildComponents(android.InitRegistrationContext)
// Register sdk member type.
android.RegisterSdkMemberType(&droidStubsSdkMemberType{
@@ -49,6 +38,25 @@
})
}
+func RegisterDocsBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("doc_defaults", DocDefaultsFactory)
+
+ ctx.RegisterModuleType("droiddoc", DroiddocFactory)
+ ctx.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
+ ctx.RegisterModuleType("droiddoc_exported_dir", ExportedDroiddocDirFactory)
+ ctx.RegisterModuleType("javadoc", JavadocFactory)
+ ctx.RegisterModuleType("javadoc_host", JavadocHostFactory)
+}
+
+func RegisterStubsBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("stubs_defaults", StubsDefaultsFactory)
+
+ ctx.RegisterModuleType("droidstubs", DroidstubsFactory)
+ ctx.RegisterModuleType("droidstubs_host", DroidstubsHostFactory)
+
+ ctx.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory)
+}
+
var (
srcsLibTag = dependencyTag{name: "sources from javalib"}
)
@@ -782,7 +790,7 @@
if t, ok := m.(*ExportedDroiddocDir); ok {
cmd.FlagWithArg("-templatedir ", t.dir.String()).Implicits(t.deps)
} else {
- ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_template", ctx.OtherModuleName(m))
+ ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_exported_dir", ctx.OtherModuleName(m))
}
})
diff --git a/java/genrule.go b/java/genrule.go
index 25494ec..e0a9c8f 100644
--- a/java/genrule.go
+++ b/java/genrule.go
@@ -20,8 +20,12 @@
)
func init() {
- android.RegisterModuleType("java_genrule", genRuleFactory)
- android.RegisterModuleType("java_genrule_host", genRuleFactoryHost)
+ RegisterGenRuleBuildComponents(android.InitRegistrationContext)
+}
+
+func RegisterGenRuleBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("java_genrule", genRuleFactory)
+ ctx.RegisterModuleType("java_genrule_host", genRuleFactoryHost)
}
// java_genrule is a genrule that can depend on other java_* objects.
diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go
index e9e4a45..ad84cde 100644
--- a/java/hiddenapi_singleton.go
+++ b/java/hiddenapi_singleton.go
@@ -16,7 +16,6 @@
import (
"fmt"
- "strings"
"android/soong/android"
)
@@ -153,23 +152,11 @@
// Collect dex jar paths for modules that had hiddenapi encode called on them.
if h, ok := module.(hiddenAPIIntf); ok {
if jar := h.bootDexJar(); jar != nil {
- // Don't add multiple variants of the same library to bootDexJars, otherwise
- // hiddenapi tool will complain about duplicated classes. Such multiple variants
- // of the same library can happen when the library is included in one or more APEXes.
- // TODO(b/146308764): remove this heuristic
- if a, ok := module.(android.ApexModule); ok && android.InAnyApex(module.Name()) {
- if a.AvailableFor("//apex_available:platform") && !a.IsForPlatform() {
- // skip the apex variants if the jar is available for the platform
- return
- }
- apexName := a.ApexName()
- if strings.Contains(apexName, "test") {
- // skip the if the jar is in test APEX
- return
- }
-
- if strings.Contains(apexName, "com.android.art") && apexName != "com.android.art.release" {
- // skip the ART APEX variants other than com.android.art.release
+ // For a java lib included in an APEX, only take the one built for
+ // the platform variant, and skip the variants for APEXes.
+ // Otherwise, the hiddenapi tool will complain about duplicated classes
+ if a, ok := module.(android.ApexModule); ok {
+ if android.InAnyApex(module.Name()) && !a.IsForPlatform() {
return
}
}
diff --git a/java/java.go b/java/java.go
index 9745da4..d0bf9d7 100644
--- a/java/java.go
+++ b/java/java.go
@@ -34,24 +34,7 @@
)
func init() {
- android.RegisterModuleType("java_defaults", DefaultsFactory)
-
- android.RegisterModuleType("java_library", LibraryFactory)
- android.RegisterModuleType("java_library_static", LibraryStaticFactory)
- android.RegisterModuleType("java_library_host", LibraryHostFactory)
- android.RegisterModuleType("java_binary", BinaryFactory)
- android.RegisterModuleType("java_binary_host", BinaryHostFactory)
- android.RegisterModuleType("java_test", TestFactory)
- android.RegisterModuleType("java_test_helper_library", TestHelperLibraryFactory)
- android.RegisterModuleType("java_test_host", TestHostFactory)
- android.RegisterModuleType("java_import", ImportFactory)
- android.RegisterModuleType("java_import_host", ImportFactoryHost)
- android.RegisterModuleType("java_device_for_host", DeviceForHostFactory)
- android.RegisterModuleType("java_host_for_device", HostForDeviceFactory)
- android.RegisterModuleType("dex_import", DexImportFactory)
-
- android.RegisterSingletonType("logtags", LogtagsSingleton)
- android.RegisterSingletonType("kythe_java_extract", kytheExtractJavaFactory)
+ RegisterJavaBuildComponents(android.InitRegistrationContext)
// Register sdk member types.
android.RegisterSdkMemberType(&headerLibrarySdkMemberType{
@@ -71,6 +54,27 @@
})
}
+func RegisterJavaBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("java_defaults", DefaultsFactory)
+
+ ctx.RegisterModuleType("java_library", LibraryFactory)
+ ctx.RegisterModuleType("java_library_static", LibraryStaticFactory)
+ ctx.RegisterModuleType("java_library_host", LibraryHostFactory)
+ ctx.RegisterModuleType("java_binary", BinaryFactory)
+ ctx.RegisterModuleType("java_binary_host", BinaryHostFactory)
+ ctx.RegisterModuleType("java_test", TestFactory)
+ ctx.RegisterModuleType("java_test_helper_library", TestHelperLibraryFactory)
+ ctx.RegisterModuleType("java_test_host", TestHostFactory)
+ ctx.RegisterModuleType("java_import", ImportFactory)
+ ctx.RegisterModuleType("java_import_host", ImportFactoryHost)
+ ctx.RegisterModuleType("java_device_for_host", DeviceForHostFactory)
+ ctx.RegisterModuleType("java_host_for_device", HostForDeviceFactory)
+ ctx.RegisterModuleType("dex_import", DexImportFactory)
+
+ ctx.RegisterSingletonType("logtags", LogtagsSingleton)
+ ctx.RegisterSingletonType("kythe_java_extract", kytheExtractJavaFactory)
+}
+
func (j *Module) checkSdkVersion(ctx android.ModuleContext) {
if j.SocSpecific() || j.DeviceSpecific() ||
(j.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface()) {
@@ -422,10 +426,6 @@
}
}
-func (j *Module) DexJarFile() android.Path {
- return j.dexJarFile
-}
-
var _ android.OutputFileProducer = (*Module)(nil)
type Dependency interface {
@@ -594,8 +594,36 @@
}
}
- ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
- ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs...)
+ syspropPublicStubs := syspropPublicStubs(ctx.Config())
+
+ // rewriteSyspropLibs validates if a java module can link against platform's sysprop_library,
+ // and redirects dependency to public stub depending on the link type.
+ rewriteSyspropLibs := func(libs []string, prop string) []string {
+ // make a copy
+ ret := android.CopyOf(libs)
+
+ for idx, lib := range libs {
+ stub, ok := syspropPublicStubs[lib]
+
+ if !ok {
+ continue
+ }
+
+ linkType, _ := j.getLinkType(ctx.ModuleName())
+ if linkType == javaSystem {
+ ret[idx] = stub
+ } else if linkType != javaPlatform {
+ ctx.PropertyErrorf("sdk_version",
+ "can't link against sysprop_library %q from a module using public or core API",
+ lib)
+ }
+ }
+
+ return ret
+ }
+
+ ctx.AddVariationDependencies(nil, libTag, rewriteSyspropLibs(j.properties.Libs, "libs")...)
+ ctx.AddVariationDependencies(nil, staticLibTag, rewriteSyspropLibs(j.properties.Static_libs, "static_libs")...)
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), pluginTag, j.properties.Plugins...)
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), exportedPluginTag, j.properties.Exported_plugins...)
diff --git a/java/java_test.go b/java/java_test.go
index 4a549e6..096cdb9 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -56,168 +56,35 @@
os.Exit(run())
}
-func testConfig(env map[string]string) android.Config {
- return TestConfig(buildDir, env)
+func testConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
+ return TestConfig(buildDir, env, bp, fs)
}
-func testContext(bp string, fs map[string][]byte) *android.TestContext {
+func testContext() *android.TestContext {
ctx := android.NewTestArchContext()
- ctx.RegisterModuleType("android_app", AndroidAppFactory)
- ctx.RegisterModuleType("android_app_certificate", AndroidAppCertificateFactory)
- ctx.RegisterModuleType("android_app_import", AndroidAppImportFactory)
- ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
- ctx.RegisterModuleType("android_test", AndroidTestFactory)
- ctx.RegisterModuleType("android_test_helper_app", AndroidTestHelperAppFactory)
- ctx.RegisterModuleType("android_test_import", AndroidTestImportFactory)
- ctx.RegisterModuleType("java_binary", BinaryFactory)
- ctx.RegisterModuleType("java_binary_host", BinaryHostFactory)
- ctx.RegisterModuleType("java_device_for_host", DeviceForHostFactory)
- ctx.RegisterModuleType("java_host_for_device", HostForDeviceFactory)
- ctx.RegisterModuleType("java_library", LibraryFactory)
- ctx.RegisterModuleType("java_library_host", LibraryHostFactory)
- ctx.RegisterModuleType("java_test", TestFactory)
- ctx.RegisterModuleType("java_import", ImportFactory)
- ctx.RegisterModuleType("java_import_host", ImportFactoryHost)
- ctx.RegisterModuleType("java_defaults", DefaultsFactory)
- ctx.RegisterModuleType("java_system_modules", SystemModulesFactory)
- ctx.RegisterModuleType("java_genrule", genRuleFactory)
+ RegisterJavaBuildComponents(ctx)
+ RegisterAppBuildComponents(ctx)
+ RegisterAARBuildComponents(ctx)
+ RegisterGenRuleBuildComponents(ctx)
+ RegisterSystemModulesBuildComponents(ctx)
ctx.RegisterModuleType("java_plugin", PluginFactory)
- ctx.RegisterModuleType("dex_import", DexImportFactory)
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
ctx.RegisterModuleType("genrule", genrule.GenRuleFactory)
- ctx.RegisterModuleType("droiddoc", DroiddocFactory)
- ctx.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
- ctx.RegisterModuleType("droiddoc_template", ExportedDroiddocDirFactory)
- ctx.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory)
- ctx.RegisterModuleType("java_sdk_library", SdkLibraryFactory)
- ctx.RegisterModuleType("java_sdk_library_import", sdkLibraryImportFactory)
- ctx.RegisterModuleType("override_android_app", OverrideAndroidAppModuleFactory)
- ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)
- ctx.RegisterModuleType("prebuilt_apis", PrebuiltApisFactory)
- ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators)
- ctx.PreArchMutators(android.RegisterPrebuiltsPostDepsMutators)
+ RegisterDocsBuildComponents(ctx)
+ RegisterStubsBuildComponents(ctx)
+ RegisterSdkLibraryBuildComponents(ctx)
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.TopDown("prebuilt_apis", PrebuiltApisMutator).Parallel()
- })
+
+ RegisterPrebuiltApisBuildComponents(ctx)
+
ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
ctx.RegisterPreSingletonType("overlay", android.SingletonFactoryAdaptor(OverlaySingletonFactory))
ctx.RegisterPreSingletonType("sdk_versions", android.SingletonFactoryAdaptor(sdkPreSingletonFactory))
// Register module types and mutators from cc needed for JNI testing
- ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
- ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
- ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
+ cc.RegisterRequiredBuildComponentsForTest(ctx)
ctx.RegisterModuleType("ndk_prebuilt_shared_stl", cc.NdkPrebuiltSharedStlFactory)
- ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("link", cc.LinkageMutator).Parallel()
- ctx.BottomUp("begin", cc.BeginMutator).Parallel()
- })
-
- bp += GatherRequiredDepsForTest()
-
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- "a.java": nil,
- "b.java": nil,
- "c.java": nil,
- "b.kt": nil,
- "a.jar": nil,
- "b.jar": nil,
- "APP_NOTICE": nil,
- "GENRULE_NOTICE": nil,
- "LIB_NOTICE": nil,
- "TOOL_NOTICE": nil,
- "java-res/a/a": nil,
- "java-res/b/b": nil,
- "java-res2/a": nil,
- "java-fg/a.java": nil,
- "java-fg/b.java": nil,
- "java-fg/c.java": nil,
- "api/current.txt": nil,
- "api/removed.txt": nil,
- "api/system-current.txt": nil,
- "api/system-removed.txt": nil,
- "api/test-current.txt": nil,
- "api/test-removed.txt": nil,
- "framework/aidl/a.aidl": nil,
-
- "prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so": nil,
-
- "prebuilts/sdk/14/public/android.jar": nil,
- "prebuilts/sdk/14/public/framework.aidl": nil,
- "prebuilts/sdk/14/system/android.jar": nil,
- "prebuilts/sdk/17/public/android.jar": nil,
- "prebuilts/sdk/17/public/framework.aidl": nil,
- "prebuilts/sdk/17/system/android.jar": nil,
- "prebuilts/sdk/29/public/android.jar": nil,
- "prebuilts/sdk/29/public/framework.aidl": nil,
- "prebuilts/sdk/29/system/android.jar": nil,
- "prebuilts/sdk/current/core/android.jar": nil,
- "prebuilts/sdk/current/public/android.jar": nil,
- "prebuilts/sdk/current/public/framework.aidl": nil,
- "prebuilts/sdk/current/public/core.jar": nil,
- "prebuilts/sdk/current/system/android.jar": nil,
- "prebuilts/sdk/current/test/android.jar": nil,
- "prebuilts/sdk/28/public/api/foo.txt": nil,
- "prebuilts/sdk/28/system/api/foo.txt": nil,
- "prebuilts/sdk/28/test/api/foo.txt": nil,
- "prebuilts/sdk/28/public/api/foo-removed.txt": nil,
- "prebuilts/sdk/28/system/api/foo-removed.txt": nil,
- "prebuilts/sdk/28/test/api/foo-removed.txt": nil,
- "prebuilts/sdk/28/public/api/bar.txt": nil,
- "prebuilts/sdk/28/system/api/bar.txt": nil,
- "prebuilts/sdk/28/test/api/bar.txt": nil,
- "prebuilts/sdk/28/public/api/bar-removed.txt": nil,
- "prebuilts/sdk/28/system/api/bar-removed.txt": nil,
- "prebuilts/sdk/28/test/api/bar-removed.txt": nil,
- "prebuilts/sdk/tools/core-lambda-stubs.jar": nil,
- "prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "current"],}`),
-
- "prebuilts/apk/app.apk": nil,
- "prebuilts/apk/app_arm.apk": nil,
- "prebuilts/apk/app_arm64.apk": nil,
- "prebuilts/apk/app_xhdpi.apk": nil,
- "prebuilts/apk/app_xxhdpi.apk": nil,
-
- // For framework-res, which is an implicit dependency for framework
- "AndroidManifest.xml": nil,
- "build/make/target/product/security/testkey": nil,
-
- "build/soong/scripts/jar-wrapper.sh": nil,
-
- "build/make/core/verify_uses_libraries.sh": nil,
-
- "build/make/core/proguard.flags": nil,
- "build/make/core/proguard_basic_keeps.flags": nil,
-
- "jdk8/jre/lib/jce.jar": nil,
- "jdk8/jre/lib/rt.jar": nil,
- "jdk8/lib/tools.jar": nil,
-
- "bar-doc/a.java": nil,
- "bar-doc/b.java": nil,
- "bar-doc/IFoo.aidl": nil,
- "bar-doc/IBar.aidl": nil,
- "bar-doc/known_oj_tags.txt": nil,
- "external/doclava/templates-sdk": nil,
-
- "cert/new_cert.x509.pem": nil,
- "cert/new_cert.pk8": nil,
-
- "testdata/data": nil,
-
- "stubs-sources/foo/Foo.java": nil,
- "stubs/sources/foo/Foo.java": nil,
- }
-
- for k, v := range fs {
- mockFS[k] = v
- }
-
- ctx.MockFileSystem(mockFS)
return ctx
}
@@ -225,10 +92,10 @@
func run(t *testing.T, ctx *android.TestContext, config android.Config) {
t.Helper()
- pathCtx := android.PathContextForTesting(config, nil)
+ pathCtx := android.PathContextForTesting(config)
setDexpreoptTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles("Android.bp")
android.FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)
@@ -237,17 +104,17 @@
func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
t.Helper()
- return testJavaErrorWithConfig(t, pattern, bp, testConfig(nil))
+ return testJavaErrorWithConfig(t, pattern, testConfig(nil, bp, nil))
}
-func testJavaErrorWithConfig(t *testing.T, pattern string, bp string, config android.Config) (*android.TestContext, android.Config) {
+func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config) (*android.TestContext, android.Config) {
t.Helper()
- ctx := testContext(bp, nil)
+ ctx := testContext()
- pathCtx := android.PathContextForTesting(config, nil)
+ pathCtx := android.PathContextForTesting(config)
setDexpreoptTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
- ctx.Register()
+ ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles("Android.bp")
if len(errs) > 0 {
android.FailIfNoMatchingErrors(t, pattern, errs)
@@ -266,12 +133,12 @@
func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
t.Helper()
- return testJavaWithConfig(t, bp, testConfig(nil))
+ return testJavaWithConfig(t, testConfig(nil, bp, nil))
}
-func testJavaWithConfig(t *testing.T, bp string, config android.Config) (*android.TestContext, android.Config) {
+func testJavaWithConfig(t *testing.T, config android.Config) (*android.TestContext, android.Config) {
t.Helper()
- ctx := testContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
return ctx, config
@@ -520,9 +387,6 @@
`)
for _, enforce := range []bool{true, false} {
-
- config := testConfig(nil)
- config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
bp := `
java_library {
name: "foo",
@@ -530,10 +394,13 @@
product_specific: true,
}
`
+
+ config := testConfig(nil, bp, nil)
+ config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
if enforce {
- testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", bp, config)
+ testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", config)
} else {
- testJavaWithConfig(t, bp, config)
+ testJavaWithConfig(t, config)
}
}
}
@@ -995,7 +862,7 @@
func TestDroiddoc(t *testing.T) {
ctx, _ := testJava(t, `
- droiddoc_template {
+ droiddoc_exported_dir {
name: "droiddoc-templates-sdk",
path: ".",
}
@@ -1127,8 +994,7 @@
}
func TestJavaLibrary(t *testing.T) {
- config := testConfig(nil)
- ctx := testContext("", map[string][]byte{
+ config := testConfig(nil, "", map[string][]byte{
"libcore/Android.bp": []byte(`
java_library {
name: "core",
@@ -1136,12 +1002,13 @@
system_modules: "none",
}`),
})
+ ctx := testContext()
run(t, ctx, config)
}
func TestJavaSdkLibrary(t *testing.T) {
ctx, _ := testJava(t, `
- droiddoc_template {
+ droiddoc_exported_dir {
name: "droiddoc-templates-sdk",
path: ".",
}
@@ -1347,7 +1214,7 @@
checkPatchModuleFlag(t, ctx, "foo", "")
expected := "java.base=.:" + buildDir
checkPatchModuleFlag(t, ctx, "bar", expected)
- expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework"), moduleToPath("updatable_media_stubs")}, ":")
+ expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework")}, ":")
checkPatchModuleFlag(t, ctx, "baz", expected)
})
}
diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go
index 7801634..fefd0e6 100644
--- a/java/platform_compat_config.go
+++ b/java/platform_compat_config.go
@@ -32,39 +32,23 @@
properties platformCompatConfigProperties
installDirPath android.InstallPath
configFile android.OutputPath
+ metadataFile android.OutputPath
}
func (p *platformCompatConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) {
rule := android.NewRuleBuilder()
configFileName := p.Name() + ".xml"
+ metadataFileName := p.Name() + "_meta.xml"
p.configFile = android.PathForModuleOut(ctx, configFileName).OutputPath
+ p.metadataFile = android.PathForModuleOut(ctx, metadataFileName).OutputPath
path := android.PathForModuleSrc(ctx, String(p.properties.Src))
- // Use the empty config if the compat config file idoesn't exist (can happen if @ChangeId
- // annotation is not used).
- emptyConfig := `'<?xml version="1.0" encoding="UTF-8" standalone="no"?><config/>'`
- configPath := `compat/compat_config.xml`
-
rule.Command().
- Text(`unzip`).
- Flag(`-l`).
- Input(path).
- Text(`| grep`).
- Flag(`-q`).
- Text(configPath).
- Text(`; if [ "$?" = "0" ] ; then`).
- Text(`unzip`).
- Flag(`-qp`).
- Input(path).
- Text(configPath).
- Text(`>`).
- Output(p.configFile).
- Text(`; else echo `).
- Text(emptyConfig).
- Text(`>`).
- Output(p.configFile).
- Text(`; fi`)
+ BuiltTool(ctx, "process-compat-config").
+ FlagWithInput("--jar ", path).
+ FlagWithOutput("--device-config ", p.configFile).
+ FlagWithOutput("--merged-config ", p.metadataFile)
p.installDirPath = android.PathForModuleInstall(ctx, "etc", "compatconfig")
rule.Build(pctx, ctx, configFileName, "Extract compat/compat_config.xml and install it")
diff --git a/java/prebuilt_apis.go b/java/prebuilt_apis.go
index 0d5e31f..cb17fee 100644
--- a/java/prebuilt_apis.go
+++ b/java/prebuilt_apis.go
@@ -23,9 +23,13 @@
)
func init() {
- android.RegisterModuleType("prebuilt_apis", PrebuiltApisFactory)
+ RegisterPrebuiltApisBuildComponents(android.InitRegistrationContext)
+}
- android.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
+func RegisterPrebuiltApisBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("prebuilt_apis", PrebuiltApisFactory)
+
+ ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
ctx.TopDown("prebuilt_apis", PrebuiltApisMutator).Parallel()
})
}
diff --git a/java/sdk_library.go b/java/sdk_library.go
index e204659..def2753 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -29,12 +29,31 @@
"github.com/google/blueprint/proptools"
)
-var (
+const (
sdkStubsLibrarySuffix = ".stubs"
sdkSystemApiSuffix = ".system"
sdkTestApiSuffix = ".test"
sdkDocsSuffix = ".docs"
sdkXmlFileSuffix = ".xml"
+ permissionTemplate = `<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ 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.
+-->
+<permissions>
+ <library name="%s" file="%s"/>
+</permissions>
+`
)
type stubsLibraryDependencyTag struct {
@@ -68,8 +87,7 @@
// 2) HTML generation
func init() {
- android.RegisterModuleType("java_sdk_library", SdkLibraryFactory)
- android.RegisterModuleType("java_sdk_library_import", sdkLibraryImportFactory)
+ RegisterSdkLibraryBuildComponents(android.InitRegistrationContext)
android.RegisterMakeVarsProvider(pctx, func(ctx android.MakeVarsContext) {
javaSdkLibraries := javaSdkLibraries(ctx.Config())
@@ -78,6 +96,11 @@
})
}
+func RegisterSdkLibraryBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("java_sdk_library", SdkLibraryFactory)
+ ctx.RegisterModuleType("java_sdk_library_import", sdkLibraryImportFactory)
+}
+
type sdkLibraryProperties struct {
// List of Java libraries that will be in the classpath when building stubs
Stub_only_libs []string `android:"arch_variant"`
@@ -130,6 +153,8 @@
publicApiFilePath android.Path
systemApiFilePath android.Path
testApiFilePath android.Path
+
+ permissionFile android.Path
}
var _ Dependency = (*SdkLibrary)(nil)
@@ -159,6 +184,10 @@
func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
module.Library.GenerateAndroidBuildActions(ctx)
+ if module.ApexName() != "" {
+ module.buildPermissionFile(ctx)
+ }
+
// Record the paths to the header jars of the library (stubs and impl).
// When this java_sdk_library is dependened from others via "libs" property,
// the recorded paths will be returned depending on the link type of the caller.
@@ -194,6 +223,21 @@
})
}
+func (module *SdkLibrary) buildPermissionFile(ctx android.ModuleContext) {
+ xmlContent := strings.ReplaceAll(fmt.Sprintf(permissionTemplate, module.BaseModuleName(), module.implPath()), "\n", "\\n")
+ permissionFile := android.PathForModuleOut(ctx, module.xmlFileName())
+
+ rule := android.NewRuleBuilder()
+ rule.Command().Text("echo -e ").Text(proptools.ShellEscape(xmlContent)).Text(">").Output(permissionFile)
+ rule.Build(pctx, ctx, "gen_permission_xml", "Generate permission")
+
+ module.permissionFile = permissionFile
+}
+
+func (module *SdkLibrary) PermissionFile() android.Path {
+ return module.permissionFile
+}
+
func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries {
entriesList := module.Library.AndroidMkEntries()
entries := &entriesList[0]
@@ -286,6 +330,12 @@
// File path to the runtime implementation library
func (module *SdkLibrary) implPath() string {
+ if apexName := module.ApexName(); apexName != "" {
+ // TODO(b/146468504): ApexName() is only a soong module name, not apex name.
+ // In most cases, this works fine. But when apex_name is set or override_apex is used
+ // this can be wrong.
+ return fmt.Sprintf("/apex/%s/javalib/%s.jar", apexName, module.implName())
+ }
partition := "system"
if module.SocSpecific() {
partition = "vendor"
@@ -528,31 +578,11 @@
// Creates the xml file that publicizes the runtime library
func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) {
- template := `
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
- 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.
--->
-
-<permissions>
- <library name="%s" file="%s"/>
-</permissions>
-`
// genrule to generate the xml file content from the template above
// TODO: preserve newlines in the generate xml file. Newlines are being squashed
// in the ninja file. Do we need to have an external tool for this?
- xmlContent := fmt.Sprintf(template, module.BaseModuleName(), module.implPath())
+ xmlContent := fmt.Sprintf(permissionTemplate, module.BaseModuleName(), module.implPath())
genruleProps := struct {
Name *string
Cmd *string
@@ -662,10 +692,12 @@
func (module *SdkLibrary) CreateInternalModules(mctx android.LoadHookContext) {
if len(module.Library.Module.properties.Srcs) == 0 {
mctx.PropertyErrorf("srcs", "java_sdk_library must specify srcs")
+ return
}
if len(module.sdkLibraryProperties.Api_packages) == 0 {
mctx.PropertyErrorf("api_packages", "java_sdk_library must specify api_packages")
+ return
}
missing_current_api := false
@@ -741,6 +773,7 @@
func SdkLibraryFactory() android.Module {
module := &SdkLibrary{}
module.InitSdkLibraryProperties()
+ android.InitApexModule(module)
InitJavaModule(module, android.HostAndDeviceSupported)
android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.CreateInternalModules(ctx) })
return module
diff --git a/java/sdk_test.go b/java/sdk_test.go
index 525c898..9cabd77 100644
--- a/java/sdk_test.go
+++ b/java/sdk_test.go
@@ -327,14 +327,14 @@
// Test with legacy javac -source 1.8 -target 1.8
t.Run("Java language level 8", func(t *testing.T) {
- config := testConfig(nil)
+ config := testConfig(nil, bpJava8, nil)
if testcase.unbundled {
config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
}
if testcase.pdk {
config.TestProductVariables.Pdk = proptools.BoolPtr(true)
}
- ctx := testContext(bpJava8, nil)
+ ctx := testContext()
run(t, ctx, config)
checkClasspath(t, ctx, true /* isJava8 */)
@@ -350,14 +350,14 @@
// Test with default javac -source 9 -target 9
t.Run("Java language level 9", func(t *testing.T) {
- config := testConfig(nil)
+ config := testConfig(nil, bp, nil)
if testcase.unbundled {
config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
}
if testcase.pdk {
config.TestProductVariables.Pdk = proptools.BoolPtr(true)
}
- ctx := testContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
checkClasspath(t, ctx, false /* isJava8 */)
@@ -373,7 +373,7 @@
// Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8
t.Run("REL + Java language level 8", func(t *testing.T) {
- config := testConfig(nil)
+ config := testConfig(nil, bpJava8, nil)
config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
@@ -383,7 +383,7 @@
if testcase.pdk {
config.TestProductVariables.Pdk = proptools.BoolPtr(true)
}
- ctx := testContext(bpJava8, nil)
+ ctx := testContext()
run(t, ctx, config)
checkClasspath(t, ctx, true /* isJava8 */)
@@ -391,7 +391,7 @@
// Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9
t.Run("REL + Java language level 9", func(t *testing.T) {
- config := testConfig(nil)
+ config := testConfig(nil, bp, nil)
config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
@@ -401,7 +401,7 @@
if testcase.pdk {
config.TestProductVariables.Pdk = proptools.BoolPtr(true)
}
- ctx := testContext(bp, nil)
+ ctx := testContext()
run(t, ctx, config)
checkClasspath(t, ctx, false /* isJava8 */)
diff --git a/java/sysprop.go b/java/sysprop.go
new file mode 100644
index 0000000..1a70499
--- /dev/null
+++ b/java/sysprop.go
@@ -0,0 +1,60 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// 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 java
+
+import (
+ "sync"
+
+ "android/soong/android"
+)
+
+type syspropLibraryInterface interface {
+ BaseModuleName() string
+ Owner() string
+ HasPublicStub() bool
+ JavaPublicStubName() string
+}
+
+var (
+ syspropPublicStubsKey = android.NewOnceKey("syspropPublicStubsJava")
+ syspropPublicStubsLock sync.Mutex
+)
+
+func init() {
+ android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ ctx.BottomUp("sysprop_java", SyspropMutator).Parallel()
+ })
+}
+
+func syspropPublicStubs(config android.Config) map[string]string {
+ return config.Once(syspropPublicStubsKey, func() interface{} {
+ return make(map[string]string)
+ }).(map[string]string)
+}
+
+// gather list of sysprop libraries owned by platform.
+func SyspropMutator(mctx android.BottomUpMutatorContext) {
+ if m, ok := mctx.Module().(syspropLibraryInterface); ok {
+ if m.Owner() != "Platform" || !m.HasPublicStub() {
+ return
+ }
+
+ syspropPublicStubs := syspropPublicStubs(mctx.Config())
+ syspropPublicStubsLock.Lock()
+ defer syspropPublicStubsLock.Unlock()
+
+ syspropPublicStubs[m.BaseModuleName()] = m.JavaPublicStubName()
+ }
+}
diff --git a/java/system_modules.go b/java/system_modules.go
index b56a401..ed2fc18 100644
--- a/java/system_modules.go
+++ b/java/system_modules.go
@@ -28,11 +28,15 @@
// system modules in a runtime image using the jmod and jlink tools.
func init() {
- android.RegisterModuleType("java_system_modules", SystemModulesFactory)
+ RegisterSystemModulesBuildComponents(android.InitRegistrationContext)
pctx.SourcePathVariable("moduleInfoJavaPath", "build/soong/scripts/jars-to-module-info-java.sh")
}
+func RegisterSystemModulesBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("java_system_modules", SystemModulesFactory)
+}
+
var (
jarsTosystemModules = pctx.AndroidStaticRule("jarsTosystemModules", blueprint.RuleParams{
Command: `rm -rf ${outDir} ${workDir} && mkdir -p ${workDir}/jmod && ` +
diff --git a/java/testing.go b/java/testing.go
index acbefb9..e157dd0 100644
--- a/java/testing.go
+++ b/java/testing.go
@@ -20,14 +20,114 @@
"android/soong/android"
)
-func TestConfig(buildDir string, env map[string]string) android.Config {
+func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) android.Config {
+ bp += GatherRequiredDepsForTest()
+
+ mockFS := map[string][]byte{
+ "a.java": nil,
+ "b.java": nil,
+ "c.java": nil,
+ "b.kt": nil,
+ "a.jar": nil,
+ "b.jar": nil,
+ "APP_NOTICE": nil,
+ "GENRULE_NOTICE": nil,
+ "LIB_NOTICE": nil,
+ "TOOL_NOTICE": nil,
+ "java-res/a/a": nil,
+ "java-res/b/b": nil,
+ "java-res2/a": nil,
+ "java-fg/a.java": nil,
+ "java-fg/b.java": nil,
+ "java-fg/c.java": nil,
+ "api/current.txt": nil,
+ "api/removed.txt": nil,
+ "api/system-current.txt": nil,
+ "api/system-removed.txt": nil,
+ "api/test-current.txt": nil,
+ "api/test-removed.txt": nil,
+ "framework/aidl/a.aidl": nil,
+
+ "prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so": nil,
+
+ "prebuilts/sdk/14/public/android.jar": nil,
+ "prebuilts/sdk/14/public/framework.aidl": nil,
+ "prebuilts/sdk/14/system/android.jar": nil,
+ "prebuilts/sdk/17/public/android.jar": nil,
+ "prebuilts/sdk/17/public/framework.aidl": nil,
+ "prebuilts/sdk/17/system/android.jar": nil,
+ "prebuilts/sdk/29/public/android.jar": nil,
+ "prebuilts/sdk/29/public/framework.aidl": nil,
+ "prebuilts/sdk/29/system/android.jar": nil,
+ "prebuilts/sdk/current/core/android.jar": nil,
+ "prebuilts/sdk/current/public/android.jar": nil,
+ "prebuilts/sdk/current/public/framework.aidl": nil,
+ "prebuilts/sdk/current/public/core.jar": nil,
+ "prebuilts/sdk/current/system/android.jar": nil,
+ "prebuilts/sdk/current/test/android.jar": nil,
+ "prebuilts/sdk/28/public/api/foo.txt": nil,
+ "prebuilts/sdk/28/system/api/foo.txt": nil,
+ "prebuilts/sdk/28/test/api/foo.txt": nil,
+ "prebuilts/sdk/28/public/api/foo-removed.txt": nil,
+ "prebuilts/sdk/28/system/api/foo-removed.txt": nil,
+ "prebuilts/sdk/28/test/api/foo-removed.txt": nil,
+ "prebuilts/sdk/28/public/api/bar.txt": nil,
+ "prebuilts/sdk/28/system/api/bar.txt": nil,
+ "prebuilts/sdk/28/test/api/bar.txt": nil,
+ "prebuilts/sdk/28/public/api/bar-removed.txt": nil,
+ "prebuilts/sdk/28/system/api/bar-removed.txt": nil,
+ "prebuilts/sdk/28/test/api/bar-removed.txt": nil,
+ "prebuilts/sdk/tools/core-lambda-stubs.jar": nil,
+ "prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "current"],}`),
+
+ "prebuilts/apk/app.apk": nil,
+ "prebuilts/apk/app_arm.apk": nil,
+ "prebuilts/apk/app_arm64.apk": nil,
+ "prebuilts/apk/app_xhdpi.apk": nil,
+ "prebuilts/apk/app_xxhdpi.apk": nil,
+
+ // For framework-res, which is an implicit dependency for framework
+ "AndroidManifest.xml": nil,
+ "build/make/target/product/security/testkey": nil,
+
+ "build/soong/scripts/jar-wrapper.sh": nil,
+
+ "build/make/core/verify_uses_libraries.sh": nil,
+
+ "build/make/core/proguard.flags": nil,
+ "build/make/core/proguard_basic_keeps.flags": nil,
+
+ "jdk8/jre/lib/jce.jar": nil,
+ "jdk8/jre/lib/rt.jar": nil,
+ "jdk8/lib/tools.jar": nil,
+
+ "bar-doc/a.java": nil,
+ "bar-doc/b.java": nil,
+ "bar-doc/IFoo.aidl": nil,
+ "bar-doc/IBar.aidl": nil,
+ "bar-doc/known_oj_tags.txt": nil,
+ "external/doclava/templates-sdk": nil,
+
+ "cert/new_cert.x509.pem": nil,
+ "cert/new_cert.pk8": nil,
+
+ "testdata/data": nil,
+
+ "stubs-sources/foo/Foo.java": nil,
+ "stubs/sources/foo/Foo.java": nil,
+ }
+
+ for k, v := range fs {
+ mockFS[k] = v
+ }
+
if env == nil {
env = make(map[string]string)
}
if env["ANDROID_JAVA8_HOME"] == "" {
env["ANDROID_JAVA8_HOME"] = "jdk8"
}
- config := android.TestArchConfig(buildDir, env)
+ config := android.TestArchConfig(buildDir, env, bp, mockFS)
return config
}
@@ -38,7 +138,6 @@
extraModules := []string{
"core-lambda-stubs",
"ext",
- "updatable_media_stubs",
"android_stubs_current",
"android_system_stubs_current",
"android_test_stubs_current",
diff --git a/python/python_test.go b/python/python_test.go
index ba5e7fa..1245ca1 100644
--- a/python/python_test.go
+++ b/python/python_test.go
@@ -28,6 +28,8 @@
"android/soong/android"
)
+var buildDir string
+
type pyModule struct {
name string
actualVersion string
@@ -50,7 +52,7 @@
noSrcFileErr = moduleVariantErrTemplate + "doesn't have any source files!"
badSrcFileExtErr = moduleVariantErrTemplate + "srcs: found non (.py|.proto) file: %q!"
badDataFileExtErr = moduleVariantErrTemplate + "data: found (.py|.proto) file: %q!"
- bpFile = "Blueprints"
+ bpFile = "Android.bp"
data = []struct {
desc string
@@ -71,7 +73,7 @@
},
errors: []string{
fmt.Sprintf(noSrcFileErr,
- "dir/Blueprints:1:1", "lib1", "PY3"),
+ "dir/Android.bp:1:1", "lib1", "PY3"),
},
},
{
@@ -90,7 +92,7 @@
},
errors: []string{
fmt.Sprintf(badSrcFileExtErr,
- "dir/Blueprints:3:11", "lib1", "PY3", "dir/file1.exe"),
+ "dir/Android.bp:3:11", "lib1", "PY3", "dir/file1.exe"),
},
},
{
@@ -113,7 +115,7 @@
},
errors: []string{
fmt.Sprintf(badDataFileExtErr,
- "dir/Blueprints:6:11", "lib1", "PY3", "dir/file2.py"),
+ "dir/Android.bp:6:11", "lib1", "PY3", "dir/file2.py"),
},
},
{
@@ -149,9 +151,9 @@
},
errors: []string{
fmt.Sprintf(pkgPathErrTemplate,
- "dir/Blueprints:11:15", "lib2", "PY3", "a/c/../../../"),
+ "dir/Android.bp:11:15", "lib2", "PY3", "a/c/../../../"),
fmt.Sprintf(pkgPathErrTemplate,
- "dir/Blueprints:19:15", "lib3", "PY3", "/a/c/../../"),
+ "dir/Android.bp:19:15", "lib3", "PY3", "/a/c/../../"),
},
},
{
@@ -174,11 +176,11 @@
"dir/-e/f/file1.py": nil,
},
errors: []string{
- fmt.Sprintf(badIdentifierErrTemplate, "dir/Blueprints:4:11",
+ fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11",
"lib1", "PY3", "a/b/c/-e/f/file1.py", "-e"),
- fmt.Sprintf(badIdentifierErrTemplate, "dir/Blueprints:4:11",
+ fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11",
"lib1", "PY3", "a/b/c/.file1.py", ".file1"),
- fmt.Sprintf(badIdentifierErrTemplate, "dir/Blueprints:4:11",
+ fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11",
"lib1", "PY3", "a/b/c/123/file1.py", "123"),
},
},
@@ -211,7 +213,7 @@
"dir/file1.py": nil,
},
errors: []string{
- fmt.Sprintf(dupRunfileErrTemplate, "dir/Blueprints:9:6",
+ fmt.Sprintf(dupRunfileErrTemplate, "dir/Android.bp:9:6",
"lib2", "PY3", "a/b/c/file1.py", "lib2", "dir/file1.py",
"lib1", "dir/c/file1.py"),
},
@@ -324,10 +326,9 @@
)
func TestPythonModule(t *testing.T) {
- config, buildDir := setupBuildEnv(t)
- defer tearDownBuildEnv(buildDir)
for _, d := range data {
t.Run(d.desc, func(t *testing.T) {
+ config := android.TestConfig(buildDir, nil, "", d.mockFiles)
ctx := android.NewTestContext()
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("version_split", versionSplitMutator()).Parallel()
@@ -336,8 +337,7 @@
ctx.RegisterModuleType("python_binary_host", PythonBinaryHostFactory)
ctx.RegisterModuleType("python_defaults", defaultsFactory)
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.Register()
- ctx.MockFileSystem(d.mockFiles)
+ ctx.Register(config)
_, testErrs := ctx.ParseBlueprintsFiles(bpFile)
android.FailIfErrored(t, testErrs)
_, actErrs := ctx.PrepareBuildActions(config)
@@ -425,17 +425,25 @@
return
}
-func setupBuildEnv(t *testing.T) (config android.Config, buildDir string) {
- buildDir, err := ioutil.TempDir("", buildNamePrefix)
+func setUp() {
+ var err error
+ buildDir, err = ioutil.TempDir("", "soong_python_test")
if err != nil {
- t.Fatal(err)
+ panic(err)
}
-
- config = android.TestConfig(buildDir, nil)
-
- return
}
-func tearDownBuildEnv(buildDir string) {
+func tearDown() {
os.RemoveAll(buildDir)
}
+
+func TestMain(m *testing.M) {
+ run := func() int {
+ setUp()
+ defer tearDown()
+
+ return m.Run()
+ }
+
+ os.Exit(run())
+}
diff --git a/rust/rust_test.go b/rust/rust_test.go
index 01b89db..3be9ee7 100644
--- a/rust/rust_test.go
+++ b/rust/rust_test.go
@@ -51,6 +51,19 @@
os.Exit(run())
}
+func testConfig(bp string) android.Config {
+ bp = bp + GatherRequiredDepsForTest()
+
+ fs := map[string][]byte{
+ "foo.rs": nil,
+ "src/bar.rs": nil,
+ "liby.so": nil,
+ "libz.so": nil,
+ }
+
+ return android.TestArchConfig(buildDir, nil, bp, fs)
+}
+
func testRust(t *testing.T, bp string) *android.TestContext {
// TODO (b/140435149)
if runtime.GOOS != "linux" {
@@ -58,11 +71,11 @@
}
t.Helper()
- config := android.TestArchConfig(buildDir, nil)
+ config := testConfig(bp)
t.Helper()
- ctx := CreateTestContext(bp)
- ctx.Register()
+ ctx := CreateTestContext()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
android.FailIfErrored(t, errs)
@@ -79,10 +92,10 @@
}
t.Helper()
- config := android.TestArchConfig(buildDir, nil)
+ config := testConfig(bp)
- ctx := CreateTestContext(bp)
- ctx.Register()
+ ctx := CreateTestContext()
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
if len(errs) > 0 {
diff --git a/rust/testing.go b/rust/testing.go
index 2067f82..f9adec8 100644
--- a/rust/testing.go
+++ b/rust/testing.go
@@ -75,97 +75,19 @@
//////////////////////////////
// Device module requirements
- toolchain_library {
- name: "libgcc",
- no_libcrt: true,
- nocrt: true,
- src: "",
- system_shared_libs: [],
- }
- cc_library {
- name: "libc",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- }
- cc_library {
- name: "libm",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- }
- cc_library {
- name: "libdl",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- }
- cc_object {
- name: "crtbegin_dynamic",
- }
-
- cc_object {
- name: "crtend_android",
- }
cc_library {
name: "liblog",
no_libcrt: true,
nocrt: true,
system_shared_libs: [],
}
-
- //////////////////////////////
- // cc module requirements
-
- toolchain_library {
- name: "libatomic",
- src: "",
- }
- toolchain_library {
- name: "libclang_rt.builtins-aarch64-android",
- src: "",
- }
- toolchain_library {
- name: "libgcc_stripped",
- src: "",
- }
- cc_library {
- name: "libc++_static",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- stl: "none",
- }
- cc_library {
- name: "libc++demangle",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- stl: "none",
- host_supported: false,
- }
- cc_library {
- name: "libc++",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- stl: "none",
- }
- cc_library {
- name: "libunwind_llvm",
- no_libcrt: true,
- nocrt: true,
- system_shared_libs: [],
- stl: "none",
- }
- `
+` + cc.GatherRequiredDepsForTest(android.NoOsType)
return bp
}
-func CreateTestContext(bp string) *android.TestContext {
+func CreateTestContext() *android.TestContext {
ctx := android.NewTestArchContext()
- ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
+ cc.RegisterRequiredBuildComponentsForTest(ctx)
ctx.RegisterModuleType("rust_binary", RustBinaryFactory)
ctx.RegisterModuleType("rust_binary_host", RustBinaryHostFactory)
ctx.RegisterModuleType("rust_test", RustTestFactory)
@@ -182,28 +104,11 @@
ctx.RegisterModuleType("rust_library_host_static", RustLibraryStaticHostFactory)
ctx.RegisterModuleType("rust_proc_macro", ProcMacroFactory)
ctx.RegisterModuleType("rust_prebuilt_dylib", PrebuiltDylibFactory)
- ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- // cc mutators
- ctx.BottomUp("link", cc.LinkageMutator).Parallel()
- ctx.BottomUp("version", cc.VersionMutator).Parallel()
- ctx.BottomUp("begin", cc.BeginMutator).Parallel()
-
// rust mutators
ctx.BottomUp("rust_libraries", LibraryMutator).Parallel()
ctx.BottomUp("rust_unit_tests", TestPerSrcMutator).Parallel()
})
- bp = bp + GatherRequiredDepsForTest()
-
- mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
- "foo.rs": nil,
- "src/bar.rs": nil,
- "liby.so": nil,
- "libz.so": nil,
- }
-
- ctx.MockFileSystem(mockFS)
return ctx
}
diff --git a/scripts/build-aml-prebuilts.sh b/scripts/build-aml-prebuilts.sh
new file mode 100755
index 0000000..7e3a82c
--- /dev/null
+++ b/scripts/build-aml-prebuilts.sh
@@ -0,0 +1,75 @@
+#!/bin/bash -e
+
+export OUT_DIR=${OUT_DIR:-out}
+
+if [ -e ${OUT_DIR}/soong/.soong.in_make ]; then
+ # If ${OUT_DIR} has been created without --skip-make, Soong will create an
+ # ${OUT_DIR}/soong/build.ninja that leaves out many targets which are
+ # expected to be supplied by the .mk files, and that might cause errors in
+ # "m --skip-make" below. We therefore default to a different out dir
+ # location in that case.
+ AML_OUT_DIR=out-aml
+ echo "Avoiding in-make OUT_DIR '${OUT_DIR}' - building in '${AML_OUT_DIR}' instead"
+ OUT_DIR=${AML_OUT_DIR}
+fi
+
+source build/envsetup.sh
+
+my_get_build_var() {
+ # get_build_var will run Soong in normal in-make mode where it creates
+ # .soong.in_make. That would clobber our real out directory, so we need to
+ # run it in a different one.
+ OUT_DIR=${OUT_DIR}/get_build_var get_build_var "$@"
+}
+
+PLATFORM_SDK_VERSION=$(my_get_build_var PLATFORM_SDK_VERSION)
+PLATFORM_VERSION=$(my_get_build_var PLATFORM_VERSION)
+PLATFORM_VERSION_ALL_CODENAMES=$(my_get_build_var PLATFORM_VERSION_ALL_CODENAMES)
+
+# PLATFORM_VERSION_ALL_CODENAMES is a comma separated list like O,P. We need to
+# turn this into ["O","P"].
+PLATFORM_VERSION_ALL_CODENAMES=${PLATFORM_VERSION_ALL_CODENAMES/,/'","'}
+PLATFORM_VERSION_ALL_CODENAMES="[\"${PLATFORM_VERSION_ALL_CODENAMES}\"]"
+
+# Logic from build/make/core/goma.mk
+if [ "${USE_GOMA}" = true ]; then
+ if [ -n "${GOMA_DIR}" ]; then
+ goma_dir="${GOMA_DIR}"
+ else
+ goma_dir="${HOME}/goma"
+ fi
+ GOMA_CC="${goma_dir}/gomacc"
+ export CC_WRAPPER="${CC_WRAPPER}${CC_WRAPPER:+ }${GOMA_CC}"
+ export CXX_WRAPPER="${CXX_WRAPPER}${CXX_WRAPPER:+ }${GOMA_CC}"
+ export JAVAC_WRAPPER="${JAVAC_WRAPPER}${JAVAC_WRAPPER:+ }${GOMA_CC}"
+else
+ USE_GOMA=false
+fi
+
+SOONG_OUT=${OUT_DIR}/soong
+mkdir -p ${SOONG_OUT}
+SOONG_VARS=${SOONG_OUT}/soong.variables
+
+cat > ${SOONG_VARS}.new << EOF
+{
+ "Platform_sdk_version": ${PLATFORM_SDK_VERSION},
+ "Platform_sdk_codename": "${PLATFORM_VERSION}",
+ "Platform_version_active_codenames": ${PLATFORM_VERSION_ALL_CODENAMES},
+
+ "DeviceName": "generic_arm64",
+ "HostArch": "x86_64",
+ "Aml_abis": true,
+
+ "UseGoma": ${USE_GOMA}
+}
+EOF
+
+if [ -f ${SOONG_VARS} ] && cmp -s ${SOONG_VARS} ${SOONG_VARS}.new; then
+ # Don't touch soong.variables if we don't have to, to avoid Soong rebuilding
+ # the ninja file when it isn't necessary.
+ rm ${SOONG_VARS}.new
+else
+ mv ${SOONG_VARS}.new ${SOONG_VARS}
+fi
+
+m --skip-make "$@"
diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go
index 08751e4..f477445 100644
--- a/sdk/cc_sdk_test.go
+++ b/sdk/cc_sdk_test.go
@@ -73,6 +73,10 @@
native_shared_libs: ["sdkmember"],
}
+ cc_library_shared {
+ name: "sdkmember",
+ }
+
sdk_snapshot {
name: "mysdk@1",
native_shared_libs: ["sdkmember_mysdk_1"],
@@ -143,6 +147,66 @@
ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String())
}
+// Make sure the sdk can use host specific cc libraries static/shared and both.
+func TestHostSdkWithCc(t *testing.T) {
+ testSdkWithCc(t, `
+ sdk {
+ name: "mysdk",
+ device_supported: false,
+ host_supported: true,
+ native_shared_libs: ["sdkshared"],
+ native_static_libs: ["sdkstatic"],
+ }
+
+ cc_library_host_shared {
+ name: "sdkshared",
+ system_shared_libs: [],
+ stl: "none",
+ }
+
+ cc_library_host_static {
+ name: "sdkstatic",
+ system_shared_libs: [],
+ stl: "none",
+ }
+ `)
+}
+
+// Make sure the sdk can use cc libraries static/shared and both.
+func TestSdkWithCc(t *testing.T) {
+ testSdkWithCc(t, `
+ sdk {
+ name: "mysdk",
+ native_shared_libs: ["sdkshared", "sdkboth1"],
+ native_static_libs: ["sdkstatic", "sdkboth2"],
+ }
+
+ cc_library_shared {
+ name: "sdkshared",
+ system_shared_libs: [],
+ stl: "none",
+ }
+
+ cc_library_static {
+ name: "sdkstatic",
+ system_shared_libs: [],
+ stl: "none",
+ }
+
+ cc_library {
+ name: "sdkboth1",
+ system_shared_libs: [],
+ stl: "none",
+ }
+
+ cc_library {
+ name: "sdkboth2",
+ system_shared_libs: [],
+ stl: "none",
+ }
+ `)
+}
+
func TestSnapshotWithCcDuplicateHeaders(t *testing.T) {
result := testSdkWithCc(t, `
sdk {
diff --git a/sdk/testing.go b/sdk/testing.go
index 5082ab4..950cf0a 100644
--- a/sdk/testing.go
+++ b/sdk/testing.go
@@ -29,63 +29,6 @@
)
func testSdkContext(bp string, fs map[string][]byte) (*android.TestContext, android.Config) {
- config := android.TestArchConfig(buildDir, nil)
- ctx := android.NewTestArchContext()
-
- // from android package
- ctx.PreArchMutators(android.RegisterPackageRenamer)
- ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
- ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
- ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
- ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
-
- ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
- })
- ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
- ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
- })
- ctx.RegisterModuleType("package", android.PackageFactory)
-
- // from java package
- ctx.RegisterModuleType("android_app_certificate", java.AndroidAppCertificateFactory)
- ctx.RegisterModuleType("java_defaults", java.DefaultsFactory)
- ctx.RegisterModuleType("java_library", java.LibraryFactory)
- ctx.RegisterModuleType("java_import", java.ImportFactory)
- ctx.RegisterModuleType("droidstubs", java.DroidstubsFactory)
- ctx.RegisterModuleType("prebuilt_stubs_sources", java.PrebuiltStubsSourcesFactory)
-
- // from cc package
- ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
- ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
- ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
- ctx.RegisterModuleType("cc_prebuilt_library_shared", cc.PrebuiltSharedLibraryFactory)
- ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
- ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
- ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
- ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("link", cc.LinkageMutator).Parallel()
- ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
- ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
- ctx.BottomUp("version", cc.VersionMutator).Parallel()
- ctx.BottomUp("begin", cc.BeginMutator).Parallel()
- })
-
- // from apex package
- ctx.RegisterModuleType("apex", apex.BundleFactory)
- ctx.RegisterModuleType("apex_key", apex.ApexKeyFactory)
- ctx.PostDepsMutators(apex.RegisterPostDepsMutators)
-
- // from this package
- ctx.RegisterModuleType("sdk", ModuleFactory)
- ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
- ctx.PreDepsMutators(RegisterPreDepsMutators)
- ctx.PostDepsMutators(RegisterPostDepsMutators)
-
- ctx.Register()
-
bp = bp + `
apex_key {
name: "myapex.key",
@@ -100,7 +43,6 @@
` + cc.GatherRequiredDepsForTest(android.Android)
mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
"build/make/target/product/security": nil,
"apex_manifest.json": nil,
"system/sepolicy/apex/myapex-file_contexts": nil,
@@ -115,7 +57,39 @@
mockFS[k] = v
}
- ctx.MockFileSystem(mockFS)
+ config := android.TestArchConfig(buildDir, nil, bp, mockFS)
+
+ ctx := android.NewTestArchContext()
+
+ // from android package
+ ctx.PreArchMutators(android.RegisterPackageRenamer)
+ ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
+ ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
+ ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
+ ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
+
+ ctx.RegisterModuleType("package", android.PackageFactory)
+
+ // from java package
+ java.RegisterJavaBuildComponents(ctx)
+ java.RegisterAppBuildComponents(ctx)
+ java.RegisterStubsBuildComponents(ctx)
+
+ // from cc package
+ cc.RegisterRequiredBuildComponentsForTest(ctx)
+
+ // from apex package
+ ctx.RegisterModuleType("apex", apex.BundleFactory)
+ ctx.RegisterModuleType("apex_key", apex.ApexKeyFactory)
+ ctx.PostDepsMutators(apex.RegisterPostDepsMutators)
+
+ // from this package
+ ctx.RegisterModuleType("sdk", ModuleFactory)
+ ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
+ ctx.PreDepsMutators(RegisterPreDepsMutators)
+ ctx.PostDepsMutators(RegisterPostDepsMutators)
+
+ ctx.Register(config)
return ctx, config
}
diff --git a/sysprop/sysprop_library.go b/sysprop/sysprop_library.go
index 1fc94db..ce404f8 100644
--- a/sysprop/sysprop_library.go
+++ b/sysprop/sysprop_library.go
@@ -35,6 +35,7 @@
type syspropGenProperties struct {
Srcs []string `android:"path"`
Scope string
+ Name *string
}
type syspropJavaGenRule struct {
@@ -142,6 +143,9 @@
// list of .sysprop files which defines the properties.
Srcs []string `android:"path"`
+
+ // Whether public stub exists or not.
+ Public_stub *bool `blueprint:"mutated"`
}
var (
@@ -157,18 +161,37 @@
return m.BaseModuleName() + "_sysprop_library"
}
+func (m *syspropLibrary) Owner() string {
+ return m.properties.Property_owner
+}
+
func (m *syspropLibrary) CcModuleName() string {
return "lib" + m.BaseModuleName()
}
+func (m *syspropLibrary) JavaPublicStubName() string {
+ if proptools.Bool(m.properties.Public_stub) {
+ return m.BaseModuleName() + "_public"
+ }
+ return ""
+}
+
func (m *syspropLibrary) javaGenModuleName() string {
return m.BaseModuleName() + "_java_gen"
}
+func (m *syspropLibrary) javaGenPublicStubName() string {
+ return m.BaseModuleName() + "_java_gen_public"
+}
+
func (m *syspropLibrary) BaseModuleName() string {
return m.ModuleBase.Name()
}
+func (m *syspropLibrary) HasPublicStub() bool {
+ return proptools.Bool(m.properties.Public_stub)
+}
+
func (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
baseModuleName := m.BaseModuleName()
@@ -274,6 +297,36 @@
return m
}
+type ccLibraryProperties struct {
+ Name *string
+ Srcs []string
+ Soc_specific *bool
+ Device_specific *bool
+ Product_specific *bool
+ Sysprop struct {
+ Platform *bool
+ }
+ Header_libs []string
+ Shared_libs []string
+ Required []string
+ Recovery *bool
+ Recovery_available *bool
+ Vendor_available *bool
+}
+
+type javaLibraryProperties struct {
+ Name *string
+ Srcs []string
+ Soc_specific *bool
+ Device_specific *bool
+ Product_specific *bool
+ Required []string
+ Sdk_version *string
+ Installable *bool
+ Libs []string
+ Stem *string
+}
+
func syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) {
if len(m.properties.Srcs) == 0 {
ctx.PropertyErrorf("srcs", "sysprop_library must specify srcs")
@@ -304,120 +357,107 @@
return
}
- socSpecific := ctx.SocSpecific()
- deviceSpecific := ctx.DeviceSpecific()
- productSpecific := ctx.ProductSpecific()
-
- owner := m.properties.Property_owner
+ // ctx's Platform or Specific functions represent where this sysprop_library installed.
+ installedInSystem := ctx.Platform() || ctx.SystemExtSpecific()
+ installedInVendorOrOdm := ctx.SocSpecific() || ctx.DeviceSpecific()
+ isOwnerPlatform := false
stub := "sysprop-library-stub-"
- switch owner {
+ switch m.Owner() {
case "Platform":
// Every partition can access platform-defined properties
stub += "platform"
+ isOwnerPlatform = true
case "Vendor":
// System can't access vendor's properties
- if !socSpecific && !deviceSpecific && !productSpecific {
+ if installedInSystem {
ctx.ModuleErrorf("None of soc_specific, device_specific, product_specific is true. " +
"System can't access sysprop_library owned by Vendor")
}
stub += "vendor"
case "Odm":
// Only vendor can access Odm-defined properties
- if !socSpecific && !deviceSpecific {
+ if !installedInVendorOrOdm {
ctx.ModuleErrorf("Neither soc_speicifc nor device_specific is true. " +
"Odm-defined properties should be accessed only in Vendor or Odm")
}
stub += "vendor"
default:
ctx.PropertyErrorf("property_owner",
- "Unknown value %s: must be one of Platform, Vendor or Odm", owner)
+ "Unknown value %s: must be one of Platform, Vendor or Odm", m.Owner())
}
- ccProps := struct {
- Name *string
- Srcs []string
- Soc_specific *bool
- Device_specific *bool
- Product_specific *bool
- Sysprop struct {
- Platform *bool
- }
- Header_libs []string
- Shared_libs []string
- Required []string
- Recovery *bool
- Recovery_available *bool
- Vendor_available *bool
- }{}
-
+ ccProps := ccLibraryProperties{}
ccProps.Name = proptools.StringPtr(m.CcModuleName())
ccProps.Srcs = m.properties.Srcs
- ccProps.Soc_specific = proptools.BoolPtr(socSpecific)
- ccProps.Device_specific = proptools.BoolPtr(deviceSpecific)
- ccProps.Product_specific = proptools.BoolPtr(productSpecific)
- ccProps.Sysprop.Platform = proptools.BoolPtr(owner == "Platform")
+ ccProps.Soc_specific = proptools.BoolPtr(ctx.SocSpecific())
+ ccProps.Device_specific = proptools.BoolPtr(ctx.DeviceSpecific())
+ ccProps.Product_specific = proptools.BoolPtr(ctx.ProductSpecific())
+ ccProps.Sysprop.Platform = proptools.BoolPtr(isOwnerPlatform)
ccProps.Header_libs = []string{"libbase_headers"}
ccProps.Shared_libs = []string{"liblog"}
ccProps.Recovery_available = m.properties.Recovery_available
ccProps.Vendor_available = m.properties.Vendor_available
-
ctx.CreateModule(cc.LibraryFactory, &ccProps)
- // internal scope contains all properties
- // public scope only contains public properties
- // use public if the owner is different from client
scope := "internal"
- isProduct := ctx.ProductSpecific()
- isVendor := ctx.SocSpecific()
- isOwnerPlatform := owner == "Platform"
- if isProduct {
- // product can't own any sysprop_library now, so product must use public scope
+ // We need to only use public version, if the partition where sysprop_library will be installed
+ // is different from owner.
+
+ if ctx.ProductSpecific() {
+ // Currently product partition can't own any sysprop_library.
scope = "public"
- } else if isVendor && isOwnerPlatform {
- // vendor and odm can only use the public properties from the platform
+ } else if isOwnerPlatform && installedInVendorOrOdm {
+ // Vendor or Odm should use public version of Platform's sysprop_library.
scope = "public"
}
- javaGenProps := struct {
- Srcs []string
- Scope string
- Name *string
- }{
+ ctx.CreateModule(syspropJavaGenFactory, &syspropGenProperties{
Srcs: m.properties.Srcs,
Scope: scope,
Name: proptools.StringPtr(m.javaGenModuleName()),
+ })
+
+ ctx.CreateModule(java.LibraryFactory, &javaLibraryProperties{
+ Name: proptools.StringPtr(m.BaseModuleName()),
+ Srcs: []string{":" + m.javaGenModuleName()},
+ Soc_specific: proptools.BoolPtr(ctx.SocSpecific()),
+ Device_specific: proptools.BoolPtr(ctx.DeviceSpecific()),
+ Product_specific: proptools.BoolPtr(ctx.ProductSpecific()),
+ Installable: m.properties.Installable,
+ Sdk_version: proptools.StringPtr("core_current"),
+ Libs: []string{stub},
+ })
+
+ // if platform sysprop_library is installed in /system or /system-ext, we regard it as an API
+ // and allow any modules (even from different partition) to link against the sysprop_library.
+ // To do that, we create a public stub and expose it to modules with sdk_version: system_*.
+ if isOwnerPlatform && installedInSystem {
+ m.properties.Public_stub = proptools.BoolPtr(true)
+ ctx.CreateModule(syspropJavaGenFactory, &syspropGenProperties{
+ Srcs: m.properties.Srcs,
+ Scope: "public",
+ Name: proptools.StringPtr(m.javaGenPublicStubName()),
+ })
+
+ ctx.CreateModule(java.LibraryFactory, &javaLibraryProperties{
+ Name: proptools.StringPtr(m.JavaPublicStubName()),
+ Srcs: []string{":" + m.javaGenPublicStubName()},
+ Installable: proptools.BoolPtr(false),
+ Sdk_version: proptools.StringPtr("core_current"),
+ Libs: []string{stub},
+ Stem: proptools.StringPtr(m.BaseModuleName()),
+ })
}
-
- ctx.CreateModule(syspropJavaGenFactory, &javaGenProps)
-
- javaProps := struct {
- Name *string
- Srcs []string
- Soc_specific *bool
- Device_specific *bool
- Product_specific *bool
- Required []string
- Sdk_version *string
- Installable *bool
- Libs []string
- }{}
-
- javaProps.Name = proptools.StringPtr(m.BaseModuleName())
- javaProps.Srcs = []string{":" + *javaGenProps.Name}
- javaProps.Soc_specific = proptools.BoolPtr(socSpecific)
- javaProps.Device_specific = proptools.BoolPtr(deviceSpecific)
- javaProps.Product_specific = proptools.BoolPtr(productSpecific)
- javaProps.Installable = m.properties.Installable
- javaProps.Sdk_version = proptools.StringPtr("core_current")
- javaProps.Libs = []string{stub}
-
- ctx.CreateModule(java.LibraryFactory, &javaProps)
}
func syspropDepsMutator(ctx android.BottomUpMutatorContext) {
if m, ok := ctx.Module().(*syspropLibrary); ok {
ctx.AddReverseDependency(m, nil, m.javaGenModuleName())
+
+ if proptools.Bool(m.properties.Public_stub) {
+ ctx.AddReverseDependency(m, nil, m.javaGenPublicStubName())
+ }
}
}
diff --git a/sysprop/sysprop_test.go b/sysprop/sysprop_test.go
index 7b90673..7cad3da 100644
--- a/sysprop/sysprop_test.go
+++ b/sysprop/sysprop_test.go
@@ -24,6 +24,7 @@
"strings"
"testing"
+ "github.com/google/blueprint"
"github.com/google/blueprint/proptools"
)
@@ -52,43 +53,42 @@
os.Exit(run())
}
-func testContext(config android.Config, bp string,
- fs map[string][]byte) *android.TestContext {
+func testContext(config android.Config) *android.TestContext {
ctx := android.NewTestArchContext()
- ctx.RegisterModuleType("android_app", java.AndroidAppFactory)
- ctx.RegisterModuleType("java_library", java.LibraryFactory)
- ctx.RegisterModuleType("java_system_modules", java.SystemModulesFactory)
- ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators)
- ctx.PreArchMutators(android.RegisterPrebuiltsPostDepsMutators)
+ java.RegisterJavaBuildComponents(ctx)
+ java.RegisterAppBuildComponents(ctx)
+ java.RegisterSystemModulesBuildComponents(ctx)
+
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("sysprop_deps", syspropDepsMutator).Parallel()
})
- ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
- ctx.RegisterModuleType("cc_library_static", cc.LibraryFactory)
- ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
- ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
- ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
+ cc.RegisterRequiredBuildComponentsForTest(ctx)
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
- ctx.BottomUp("link", cc.LinkageMutator).Parallel()
- ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
- ctx.BottomUp("version", cc.VersionMutator).Parallel()
- ctx.BottomUp("begin", cc.BeginMutator).Parallel()
- ctx.BottomUp("sysprop", cc.SyspropMutator).Parallel()
+ ctx.BottomUp("sysprop_java", java.SyspropMutator).Parallel()
})
ctx.RegisterModuleType("sysprop_library", syspropLibraryFactory)
- ctx.Register()
+ ctx.Register(config)
- bp += java.GatherRequiredDepsForTest()
+ return ctx
+}
+
+func run(t *testing.T, ctx *android.TestContext, config android.Config) {
+ t.Helper()
+ _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
+ android.FailIfErrored(t, errs)
+ _, errs = ctx.PrepareBuildActions(config)
+ android.FailIfErrored(t, errs)
+}
+
+func testConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
bp += cc.GatherRequiredDepsForTest(android.Android)
mockFS := map[string][]byte{
- "Android.bp": []byte(bp),
"a.java": nil,
"b.java": nil,
"c.java": nil,
@@ -134,21 +134,7 @@
mockFS[k] = v
}
- ctx.MockFileSystem(mockFS)
-
- return ctx
-}
-
-func run(t *testing.T, ctx *android.TestContext, config android.Config) {
- t.Helper()
- _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
- android.FailIfErrored(t, errs)
- _, errs = ctx.PrepareBuildActions(config)
- android.FailIfErrored(t, errs)
-}
-
-func testConfig(env map[string]string) android.Config {
- config := java.TestConfig(buildDir, env)
+ config := java.TestConfig(buildDir, env, bp, mockFS)
config.TestProductVariables.DeviceSystemSdkVersions = []string{"28"}
config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
@@ -160,8 +146,8 @@
func test(t *testing.T, bp string) *android.TestContext {
t.Helper()
- config := testConfig(nil)
- ctx := testContext(config, bp, nil)
+ config := testConfig(nil, bp, nil)
+ ctx := testContext(config)
run(t, ctx, config)
return ctx
@@ -210,6 +196,13 @@
}
java_library {
+ name: "java-platform-private",
+ srcs: ["c.java"],
+ platform_apis: true,
+ libs: ["sysprop-platform"],
+ }
+
+ java_library {
name: "java-product",
srcs: ["c.java"],
sdk_version: "system_current",
@@ -284,10 +277,10 @@
// Check for generated cc_library
for _, variant := range []string{
- "android_arm_armv7-a-neon_vendor.VER_shared",
- "android_arm_armv7-a-neon_vendor.VER_static",
- "android_arm64_armv8-a_vendor.VER_shared",
- "android_arm64_armv8-a_vendor.VER_static",
+ "android_vendor.VER_arm_armv7-a-neon_shared",
+ "android_vendor.VER_arm_armv7-a-neon_static",
+ "android_vendor.VER_arm64_armv8-a_shared",
+ "android_vendor.VER_arm64_armv8-a_static",
} {
ctx.ModuleForTests("libsysprop-platform", variant)
ctx.ModuleForTests("libsysprop-vendor", variant)
@@ -307,19 +300,20 @@
}
ctx.ModuleForTests("sysprop-platform", "android_common")
+ ctx.ModuleForTests("sysprop-platform_public", "android_common")
ctx.ModuleForTests("sysprop-vendor", "android_common")
// Check for exported includes
coreVariant := "android_arm64_armv8-a_static"
- vendorVariant := "android_arm64_armv8-a_vendor.VER_static"
+ vendorVariant := "android_vendor.VER_arm64_armv8-a_static"
platformInternalPath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/include"
platformPublicCorePath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/public/include"
- platformPublicVendorPath := "libsysprop-platform/android_arm64_armv8-a_vendor.VER_static/gen/sysprop/public/include"
+ platformPublicVendorPath := "libsysprop-platform/android_vendor.VER_arm64_armv8-a_static/gen/sysprop/public/include"
platformOnProductPath := "libsysprop-platform-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include"
- vendorInternalPath := "libsysprop-vendor/android_arm64_armv8-a_vendor.VER_static/gen/sysprop/include"
+ vendorInternalPath := "libsysprop-vendor/android_vendor.VER_arm64_armv8-a_static/gen/sysprop/include"
vendorPublicPath := "libsysprop-vendor/android_arm64_armv8-a_static/gen/sysprop/public/include"
platformClient := ctx.ModuleForTests("cc-client-platform", coreVariant)
@@ -359,4 +353,17 @@
t.Errorf("flags for vendor must contain %#v and %#v, but was %#v.",
platformPublicVendorPath, vendorInternalPath, vendorFlags)
}
+
+ // Java modules linking against system API should use public stub
+ javaSystemApiClient := ctx.ModuleForTests("java-platform", "android_common")
+ publicStubFound := false
+ ctx.VisitDirectDeps(javaSystemApiClient.Module(), func(dep blueprint.Module) {
+ if dep.Name() == "sysprop-platform_public" {
+ publicStubFound = true
+ }
+ })
+ if !publicStubFound {
+ t.Errorf("system api client should use public stub")
+ }
+
}
diff --git a/ui/build/paths/config.go b/ui/build/paths/config.go
index 90ff706..711a9c7 100644
--- a/ui/build/paths/config.go
+++ b/ui/build/paths/config.go
@@ -94,7 +94,6 @@
"patch": Allowed,
"pstree": Allowed,
"python3": Allowed,
- "realpath": Allowed,
"rsync": Allowed,
"sh": Allowed,
"tr": Allowed,
diff --git a/xml/xml_test.go b/xml/xml_test.go
index 0a11566..f8ec823 100644
--- a/xml/xml_test.go
+++ b/xml/xml_test.go
@@ -48,20 +48,18 @@
}
func testXml(t *testing.T, bp string) *android.TestContext {
- config := android.TestArchConfig(buildDir, nil)
+ fs := map[string][]byte{
+ "foo.xml": nil,
+ "foo.dtd": nil,
+ "bar.xml": nil,
+ "bar.xsd": nil,
+ "baz.xml": nil,
+ }
+ config := android.TestArchConfig(buildDir, nil, bp, fs)
ctx := android.NewTestArchContext()
ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
ctx.RegisterModuleType("prebuilt_etc_xml", PrebuiltEtcXmlFactory)
- ctx.Register()
- mockFiles := map[string][]byte{
- "Android.bp": []byte(bp),
- "foo.xml": nil,
- "foo.dtd": nil,
- "bar.xml": nil,
- "bar.xsd": nil,
- "baz.xml": nil,
- }
- ctx.MockFileSystem(mockFiles)
+ ctx.Register(config)
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
android.FailIfErrored(t, errs)
_, errs = ctx.PrepareBuildActions(config)