Merge changes from topic "bb_201948713"
* changes:
Revert "Support generating sdk snapshot for specific build release"
Revert "Separate hidden API flags needed in sdk snapshots for S and T"
diff --git a/android/arch.go b/android/arch.go
index 273c02b..54242e5 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -2005,16 +2005,37 @@
osToProp := ArchVariantProperties{}
archOsToProp := ArchVariantProperties{}
+
+ var linuxStructs, bionicStructs []reflect.Value
+ var ok bool
+
+ linuxStructs, ok = getTargetStructs(ctx, archProperties, "Linux")
+ if !ok {
+ linuxStructs = make([]reflect.Value, 0)
+ }
+ bionicStructs, ok = getTargetStructs(ctx, archProperties, "Bionic")
+ if !ok {
+ bionicStructs = make([]reflect.Value, 0)
+ }
+
// For android, linux, ...
for _, os := range osTypeList {
if os == CommonOS {
// It looks like this OS value is not used in Blueprint files
continue
}
- osStructs, ok := getTargetStructs(ctx, archProperties, os.Field)
+ osStructs := make([]reflect.Value, 0)
+ osSpecificStructs, ok := getTargetStructs(ctx, archProperties, os.Field)
if ok {
- osToProp[os.Name] = mergeStructs(ctx, osStructs, propertySet)
+ osStructs = append(osStructs, osSpecificStructs...)
}
+ if os.Linux() {
+ osStructs = append(osStructs, linuxStructs...)
+ }
+ if os.Bionic() {
+ osStructs = append(osStructs, bionicStructs...)
+ }
+ osToProp[os.Name] = mergeStructs(ctx, osStructs, propertySet)
// For arm, x86, ...
for _, arch := range osArchTypeMap[os] {
@@ -2048,15 +2069,9 @@
archOsToProp[targetName] = mergeStructs(ctx, osArchStructs, propertySet)
}
}
+
axisToProps[bazel.OsConfigurationAxis] = osToProp
axisToProps[bazel.OsArchConfigurationAxis] = archOsToProp
-
- bionicStructs, ok := getTargetStructs(ctx, archProperties, "Bionic")
- if ok {
- axisToProps[bazel.BionicConfigurationAxis] = map[string]interface{}{
- "bionic": mergeStructs(ctx, bionicStructs, propertySet)}
- }
-
return axisToProps
}
diff --git a/android/bazel.go b/android/bazel.go
index 53e6060..1c943fa 100644
--- a/android/bazel.go
+++ b/android/bazel.go
@@ -223,9 +223,6 @@
"libc_malloc_debug", // http://b/186824339, cc_library_static, depends on //system/libbase:libbase (http://b/186823646)
"libc_malloc_debug_backtrace", // http://b/186824112, cc_library_static, depends on //external/libcxxabi:libc++demangle (http://b/186823773)
- //"libcutils", // http://b/186827426, cc_library, depends on //system/core/libprocessgroup:libprocessgroup_headers (http://b/186826841)
- //"libcutils_sockets", // http://b/186826853, cc_library, depends on //system/libbase:libbase (http://b/186826479)
-
"liblinker_debuggerd_stub", // http://b/186824327, cc_library_static, depends on //external/zlib:libz (http://b/186823782)
// also depends on //system/libziparchive:libziparchive (http://b/186823656)
// also depends on //system/logging/liblog:liblog (http://b/186822772)
@@ -285,24 +282,6 @@
"libadb_protos_static", // b/200601772: Requires cc_library proto support
"libadb_protos", // b/200601772: Requires cc_library proto support
"libapp_processes_protos_lite", // b/200601772: Requires cc_library proto support
-
- "libbase", // TODO(cparsons): Breaks libandroidfw. Investigate.
-
- // The below items depend on libbase.
- "libadb_pairing_auth",
- "libadb_pairing_auth_static",
- "libadb_sysdeps",
- "libadb_tls_connection",
- "libadb_tls_connection_static",
- "libadbconnection_client",
- "libadbconnection_server",
- "libadbd_auth",
- "libadbd_fs",
- "libcutils",
- "libcutils_sockets",
- "libdiagnose_usb",
- // ---
-
}
// Per-module denylist of cc_library modules to only generate the static
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index 2241255..6648a2f 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -815,7 +815,7 @@
if len(buildStatement.OutputPaths) > 0 {
cmd.Text("rm -f")
for _, outputPath := range buildStatement.OutputPaths {
- cmd.Text(PathForBazelOut(ctx, outputPath).String())
+ cmd.Text(outputPath)
}
cmd.Text("&&")
}
diff --git a/bazel/configurability.go b/bazel/configurability.go
index 7aaff9a..e9641e7 100644
--- a/bazel/configurability.go
+++ b/bazel/configurability.go
@@ -91,11 +91,6 @@
ConditionsDefaultConfigKey: ConditionsDefaultSelectKey, // The default condition of an os select map.
}
- platformBionicMap = map[string]string{
- "bionic": "//build/bazel/platforms/os:bionic",
- ConditionsDefaultConfigKey: ConditionsDefaultSelectKey, // The default condition of an os select map.
- }
-
platformOsArchMap = map[string]string{
osArchAndroidArm: "//build/bazel/platforms/os_arch:android_arm",
osArchAndroidArm64: "//build/bazel/platforms/os_arch:android_arm64",
@@ -122,7 +117,6 @@
arch
os
osArch
- bionic
productVariables
)
@@ -132,7 +126,6 @@
arch: "arch",
os: "os",
osArch: "arch_os",
- bionic: "bionic",
productVariables: "product_variables",
}[ct]
}
@@ -155,10 +148,6 @@
if _, ok := platformOsArchMap[config]; !ok {
panic(fmt.Errorf("Unknown os+arch: %s", config))
}
- case bionic:
- if _, ok := platformBionicMap[config]; !ok {
- panic(fmt.Errorf("Unknown for %s: %s", ct.String(), config))
- }
case productVariables:
// do nothing
default:
@@ -178,8 +167,6 @@
return platformOsMap[config]
case osArch:
return platformOsArchMap[config]
- case bionic:
- return platformBionicMap[config]
case productVariables:
if config == ConditionsDefaultConfigKey {
return ConditionsDefaultSelectKey
@@ -199,8 +186,6 @@
OsConfigurationAxis = ConfigurationAxis{configurationType: os}
// An axis for arch+os-specific configurations
OsArchConfigurationAxis = ConfigurationAxis{configurationType: osArch}
- // An axis for bionic os-specific configurations
- BionicConfigurationAxis = ConfigurationAxis{configurationType: bionic}
)
// ProductVariableConfigurationAxis returns an axis for the given product variable
diff --git a/bazel/properties.go b/bazel/properties.go
index bd8ef0d..ee32e73 100644
--- a/bazel/properties.go
+++ b/bazel/properties.go
@@ -264,7 +264,7 @@
switch axis.configurationType {
case noConfig:
la.Value = &value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
if la.ConfigurableValues == nil {
la.ConfigurableValues = make(configurableLabels)
}
@@ -280,7 +280,7 @@
switch axis.configurationType {
case noConfig:
return *la.Value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
return *la.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -337,7 +337,7 @@
switch axis.configurationType {
case noConfig:
ba.Value = value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
if ba.ConfigurableValues == nil {
ba.ConfigurableValues = make(configurableBools)
}
@@ -353,7 +353,7 @@
switch axis.configurationType {
case noConfig:
return ba.Value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
if v, ok := ba.ConfigurableValues[axis][config]; ok {
return &v
} else {
@@ -459,7 +459,7 @@
switch axis.configurationType {
case noConfig:
lla.Value = list
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
if lla.ConfigurableValues == nil {
lla.ConfigurableValues = make(configurableLabelLists)
}
@@ -475,7 +475,7 @@
switch axis.configurationType {
case noConfig:
return lla.Value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
return lla.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -773,7 +773,7 @@
switch axis.configurationType {
case noConfig:
sla.Value = list
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
if sla.ConfigurableValues == nil {
sla.ConfigurableValues = make(configurableStringLists)
}
@@ -789,7 +789,7 @@
switch axis.configurationType {
case noConfig:
return sla.Value
- case arch, os, osArch, bionic, productVariables:
+ case arch, os, osArch, productVariables:
return sla.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 5952b15..0d65822 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -131,12 +131,13 @@
"//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
"//conditions:default": [],
}) + select({
- "//build/bazel/platforms/os:android": ["android.cpp"],
+ "//build/bazel/platforms/os:android": [
+ "android.cpp",
+ "bionic.cpp",
+ ],
"//build/bazel/platforms/os:darwin": ["darwin.cpp"],
"//build/bazel/platforms/os:linux": ["linux.cpp"],
- "//conditions:default": [],
- }) + select({
- "//build/bazel/platforms/os:bionic": ["bionic.cpp"],
+ "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
"//conditions:default": [],
}),
)`}})
@@ -1571,3 +1572,68 @@
)`},
})
}
+
+func TestCcLibraryOsSelects(t *testing.T) {
+ runCcLibraryTestCase(t, bp2buildTestCase{
+ description: "cc_library - selects for all os targets",
+ moduleTypeUnderTest: "cc_library",
+ moduleTypeUnderTestFactory: cc.LibraryFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
+ filesystem: map[string]string{},
+ blueprint: soongCcLibraryPreamble + `
+cc_library_headers { name: "some-headers" }
+cc_library {
+ name: "foo-lib",
+ srcs: ["base.cpp"],
+ target: {
+ android: {
+ srcs: ["android.cpp"],
+ },
+ linux: {
+ srcs: ["linux.cpp"],
+ },
+ linux_glibc: {
+ srcs: ["linux_glibc.cpp"],
+ },
+ darwin: {
+ srcs: ["darwin.cpp"],
+ },
+ bionic: {
+ srcs: ["bionic.cpp"],
+ },
+ linux_musl: {
+ srcs: ["linux_musl.cpp"],
+ },
+ windows: {
+ srcs: ["windows.cpp"],
+ },
+ },
+ include_build_directory: false,
+}
+`,
+ expectedBazelTargets: []string{`cc_library(
+ name = "foo-lib",
+ srcs = ["base.cpp"] + select({
+ "//build/bazel/platforms/os:android": [
+ "android.cpp",
+ "bionic.cpp",
+ "linux.cpp",
+ ],
+ "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
+ "//build/bazel/platforms/os:linux": [
+ "linux.cpp",
+ "linux_glibc.cpp",
+ ],
+ "//build/bazel/platforms/os:linux_bionic": [
+ "bionic.cpp",
+ "linux.cpp",
+ ],
+ "//build/bazel/platforms/os:linux_musl": [
+ "linux.cpp",
+ "linux_musl.cpp",
+ ],
+ "//build/bazel/platforms/os:windows": ["windows.cpp"],
+ "//conditions:default": [],
+ }),
+)`}})
+}
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index 91b7478..f02ce4d 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -1382,7 +1382,8 @@
expectedBazelTargets: []string{`cc_library_static(
name = "target_bionic",
system_dynamic_deps = select({
- "//build/bazel/platforms/os:bionic": [":libc"],
+ "//build/bazel/platforms/os:android": [":libc"],
+ "//build/bazel/platforms/os:linux_bionic": [":libc"],
"//conditions:default": [],
}),
)`},
diff --git a/bp2build/python_binary_conversion_test.go b/bp2build/python_binary_conversion_test.go
index 6f6fc11..5b4829e 100644
--- a/bp2build/python_binary_conversion_test.go
+++ b/bp2build/python_binary_conversion_test.go
@@ -116,3 +116,37 @@
},
})
}
+
+func TestPythonBinaryHostArchVariance(t *testing.T) {
+ runBp2BuildTestCaseSimple(t, bp2buildTestCase{
+ description: "test arch variants",
+ moduleTypeUnderTest: "python_binary_host",
+ moduleTypeUnderTestFactory: python.PythonBinaryHostFactory,
+ moduleTypeUnderTestBp2BuildMutator: python.PythonBinaryBp2Build,
+ filesystem: map[string]string{
+ "dir/arm.py": "",
+ "dir/x86.py": "",
+ },
+ blueprint: `python_binary_host {
+ name: "foo-arm",
+ arch: {
+ arm: {
+ srcs: ["arm.py"],
+ },
+ x86: {
+ srcs: ["x86.py"],
+ },
+ },
+ }`,
+ expectedBazelTargets: []string{
+ `py_binary(
+ name = "foo-arm",
+ srcs = select({
+ "//build/bazel/platforms/arch:arm": ["arm.py"],
+ "//build/bazel/platforms/arch:x86": ["x86.py"],
+ "//conditions:default": [],
+ }),
+)`,
+ },
+ })
+}
diff --git a/bp2build/python_library_conversion_test.go b/bp2build/python_library_conversion_test.go
index b6f45e5..7f983ad 100644
--- a/bp2build/python_library_conversion_test.go
+++ b/bp2build/python_library_conversion_test.go
@@ -154,3 +154,54 @@
},
})
}
+
+func TestPythonLibraryArchVariance(t *testing.T) {
+ testPythonArchVariance(t, "python_library", "py_library",
+ python.PythonLibraryFactory, python.PythonLibraryBp2Build,
+ func(ctx android.RegistrationContext) {})
+}
+
+func TestPythonLibraryHostArchVariance(t *testing.T) {
+ testPythonArchVariance(t, "python_library_host", "py_library",
+ python.PythonLibraryHostFactory, python.PythonLibraryHostBp2Build,
+ func(ctx android.RegistrationContext) {})
+}
+
+// TODO: refactor python_binary_conversion_test to use this
+func testPythonArchVariance(t *testing.T, modType, bazelTarget string,
+ factory android.ModuleFactory, mutator PythonLibBp2Build,
+ registration func(ctx android.RegistrationContext)) {
+ t.Helper()
+ runBp2BuildTestCase(t, registration, bp2buildTestCase{
+ description: fmt.Sprintf("test %s arch variants", modType),
+ moduleTypeUnderTest: modType,
+ moduleTypeUnderTestFactory: factory,
+ moduleTypeUnderTestBp2BuildMutator: mutator,
+ filesystem: map[string]string{
+ "dir/arm.py": "",
+ "dir/x86.py": "",
+ },
+ blueprint: fmt.Sprintf(`%s {
+ name: "foo",
+ arch: {
+ arm: {
+ srcs: ["arm.py"],
+ },
+ x86: {
+ srcs: ["x86.py"],
+ },
+ },
+ }`, modType),
+ expectedBazelTargets: []string{
+ fmt.Sprintf(`%s(
+ name = "foo",
+ srcs = select({
+ "//build/bazel/platforms/arch:arm": ["arm.py"],
+ "//build/bazel/platforms/arch:x86": ["x86.py"],
+ "//conditions:default": [],
+ }),
+ srcs_version = "PY3",
+)`, bazelTarget),
+ },
+ })
+}
diff --git a/cc/androidmk.go b/cc/androidmk.go
index cd52363..243efe6 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -394,6 +394,8 @@
if Bool(test.Properties.Test_options.Unit_test) {
entries.SetBool("LOCAL_IS_UNIT_TEST", true)
}
+
+ entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", Bool(test.Properties.Per_testcase_directory))
})
AndroidMkWriteTestData(test.data, entries)
diff --git a/cc/cc.go b/cc/cc.go
index 57e7887..b410834 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -95,6 +95,7 @@
// Used for data dependencies adjacent to tests
DataLibs []string
+ DataBins []string
// Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
SystemSharedLibs []string
@@ -718,6 +719,7 @@
staticVariantTag = dependencyTag{name: "static variant"}
vndkExtDepTag = dependencyTag{name: "vndk extends"}
dataLibDepTag = dependencyTag{name: "data lib"}
+ dataBinDepTag = dependencyTag{name: "data bin"}
runtimeDepTag = installDependencyTag{name: "runtime lib"}
testPerSrcDepTag = dependencyTag{name: "test_per_src"}
stubImplDepTag = dependencyTag{name: "stub_impl"}
@@ -2274,6 +2276,8 @@
{Mutator: "link", Variation: "shared"},
}, dataLibDepTag, deps.DataLibs...)
+ actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
+
actx.AddVariationDependencies([]blueprint.Variation{
{Mutator: "link", Variation: "shared"},
}, runtimeDepTag, deps.RuntimeLibs...)
diff --git a/cc/genrule.go b/cc/genrule.go
index 9df5228..239064f 100644
--- a/cc/genrule.go
+++ b/cc/genrule.go
@@ -15,6 +15,8 @@
package cc
import (
+ "fmt"
+
"android/soong/android"
"android/soong/genrule"
"android/soong/snapshot"
@@ -36,13 +38,23 @@
// cc_genrule is a genrule that can depend on other cc_* objects.
// The cmd may be run multiple times, once for each of the different arch/etc
-// variations.
+// variations. The following environment variables will be set when the command
+// execute:
+//
+// CC_ARCH the name of the architecture the command is being executed for
+//
+// CC_MULTILIB "lib32" if the architecture the command is being executed for is 32-bit,
+// "lib64" if it is 64-bit.
+//
+// CC_NATIVE_BRIDGE the name of the subdirectory that native bridge libraries are stored in if
+// the architecture has native bridge enabled, empty if it is disabled.
func GenRuleFactory() android.Module {
module := genrule.NewGenRule()
extra := &GenruleExtraProperties{}
module.Extra = extra
module.ImageInterface = extra
+ module.CmdModifier = genruleCmdModifier
module.AddProperties(module.Extra)
android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibBoth)
@@ -53,6 +65,13 @@
return module
}
+func genruleCmdModifier(ctx android.ModuleContext, cmd string) string {
+ target := ctx.Target()
+ arch := target.Arch.ArchType
+ return fmt.Sprintf("CC_ARCH=%s CC_NATIVE_BRIDGE=%s CC_MULTILIB=%s && %s",
+ arch.Name, target.NativeBridgeRelativePath, arch.Multilib, cmd)
+}
+
var _ android.ImageInterface = (*GenruleExtraProperties)(nil)
func (g *GenruleExtraProperties) ImageMutatorBegin(ctx android.BaseModuleContext) {}
diff --git a/cc/genrule_test.go b/cc/genrule_test.go
index b6afb05..f25f704 100644
--- a/cc/genrule_test.go
+++ b/cc/genrule_test.go
@@ -115,3 +115,75 @@
t.Errorf(`want inputs %v, got %v`, expected, got)
}
}
+
+func TestCmdPrefix(t *testing.T) {
+ bp := `
+ cc_genrule {
+ name: "gen",
+ cmd: "echo foo",
+ out: ["out"],
+ native_bridge_supported: true,
+ }
+ `
+
+ testCases := []struct {
+ name string
+ variant string
+ preparer android.FixturePreparer
+
+ arch string
+ nativeBridge string
+ multilib string
+ }{
+ {
+ name: "arm",
+ variant: "android_arm_armv7-a-neon",
+ arch: "arm",
+ multilib: "lib32",
+ },
+ {
+ name: "arm64",
+ variant: "android_arm64_armv8-a",
+ arch: "arm64",
+ multilib: "lib64",
+ },
+ {
+ name: "nativebridge",
+ variant: "android_native_bridge_arm_armv7-a-neon",
+ preparer: android.FixtureModifyConfig(func(config android.Config) {
+ config.Targets[android.Android] = []android.Target{
+ {
+ Os: android.Android,
+ Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
+ NativeBridge: android.NativeBridgeDisabled,
+ },
+ {
+ Os: android.Android,
+ Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
+ NativeBridge: android.NativeBridgeEnabled,
+ NativeBridgeHostArchName: "x86",
+ NativeBridgeRelativePath: "arm",
+ },
+ }
+ }),
+ arch: "arm",
+ multilib: "lib32",
+ nativeBridge: "arm",
+ },
+ }
+
+ for _, tt := range testCases {
+ t.Run(tt.name, func(t *testing.T) {
+ result := android.GroupFixturePreparers(
+ PrepareForIntegrationTestWithCc,
+ android.OptionalFixturePreparer(tt.preparer),
+ ).RunTestWithBp(t, bp)
+ gen := result.ModuleForTests("gen", tt.variant)
+ sboxProto := android.RuleBuilderSboxProtoForTests(t, gen.Output("genrule.sbox.textproto"))
+ cmd := *sboxProto.Commands[0].Command
+ android.AssertStringDoesContain(t, "incorrect CC_ARCH", cmd, "CC_ARCH="+tt.arch+" ")
+ android.AssertStringDoesContain(t, "incorrect CC_NATIVE_BRIDGE", cmd, "CC_NATIVE_BRIDGE="+tt.nativeBridge+" ")
+ android.AssertStringDoesContain(t, "incorrect CC_MULTILIB", cmd, "CC_MULTILIB="+tt.multilib+" ")
+ })
+ }
+}
diff --git a/cc/test.go b/cc/test.go
index 047a69e..c589165 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -80,6 +80,9 @@
// list of shared library modules that should be installed alongside the test
Data_libs []string `android:"arch_variant"`
+ // list of binary modules that should be installed alongside the test
+ Data_bins []string `android:"arch_variant"`
+
// list of compatibility suites (for example "cts", "vts") that the module should be
// installed into.
Test_suites []string `android:"arch_variant"`
@@ -115,6 +118,9 @@
// Add parameterized mainline modules to auto generated test config. The options will be
// handled by TradeFed to download and install the specified modules on the device.
Test_mainline_modules []string
+
+ // Install the test into a folder named for the module in all test suites.
+ Per_testcase_directory *bool
}
func init() {
@@ -347,6 +353,7 @@
deps = test.testDecorator.linkerDeps(ctx, deps)
deps = test.binaryDecorator.linkerDeps(ctx, deps)
deps.DataLibs = append(deps.DataLibs, test.Properties.Data_libs...)
+ deps.DataBins = append(deps.DataBins, test.Properties.Data_bins...)
return deps
}
@@ -386,6 +393,18 @@
RelativeInstallPath: ccModule.installer.relativeInstallPath()})
}
})
+ ctx.VisitDirectDepsWithTag(dataBinDepTag, func(dep android.Module) {
+ depName := ctx.OtherModuleName(dep)
+ ccModule, ok := dep.(*Module)
+ if !ok {
+ ctx.ModuleErrorf("data_bin %q is not a cc module", depName)
+ }
+ if ccModule.OutputFile().Valid() {
+ test.data = append(test.data,
+ android.DataPath{SrcPath: ccModule.OutputFile().Path(),
+ RelativeInstallPath: ccModule.installer.relativeInstallPath()})
+ }
+ })
var configs []tradefed.Config
for _, module := range test.Properties.Test_mainline_modules {
diff --git a/genrule/genrule.go b/genrule/genrule.go
index f4bde70..96b610b 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -156,6 +156,11 @@
// For other packages to make their own genrules with extra
// properties
Extra interface{}
+
+ // CmdModifier can be set by wrappers around genrule to modify the command, for example to
+ // prefix environment variables to it.
+ CmdModifier func(ctx android.ModuleContext, cmd string) string
+
android.ImageInterface
properties generatorProperties
@@ -398,8 +403,13 @@
var outputFiles android.WritablePaths
var zipArgs strings.Builder
+ cmd := String(g.properties.Cmd)
+ if g.CmdModifier != nil {
+ cmd = g.CmdModifier(ctx, cmd)
+ }
+
// Generate tasks, either from genrule or gensrcs.
- for _, task := range g.taskGenerator(ctx, String(g.properties.Cmd), srcFiles) {
+ for _, task := range g.taskGenerator(ctx, cmd, srcFiles) {
if len(task.out) == 0 {
ctx.ModuleErrorf("must have at least one output file")
return
diff --git a/java/androidmk.go b/java/androidmk.go
index 1914595..0f1a1ec 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -147,20 +147,21 @@
}
// Called for modules that are a component of a test suite.
-func testSuiteComponent(entries *android.AndroidMkEntries, test_suites []string) {
+func testSuiteComponent(entries *android.AndroidMkEntries, test_suites []string, perTestcaseDirectory bool) {
entries.SetString("LOCAL_MODULE_TAGS", "tests")
if len(test_suites) > 0 {
entries.AddCompatibilityTestSuites(test_suites...)
} else {
entries.AddCompatibilityTestSuites("null-suite")
}
+ entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", perTestcaseDirectory)
}
func (j *Test) AndroidMkEntries() []android.AndroidMkEntries {
entriesList := j.Library.AndroidMkEntries()
entries := &entriesList[0]
entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
- testSuiteComponent(entries, j.testProperties.Test_suites)
+ testSuiteComponent(entries, j.testProperties.Test_suites, Bool(j.testProperties.Per_testcase_directory))
if j.testConfig != nil {
entries.SetPath("LOCAL_FULL_TEST_CONFIG", j.testConfig)
}
@@ -188,7 +189,7 @@
entriesList := j.Library.AndroidMkEntries()
entries := &entriesList[0]
entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
- testSuiteComponent(entries, j.testHelperLibraryProperties.Test_suites)
+ testSuiteComponent(entries, j.testHelperLibraryProperties.Test_suites, Bool(j.testHelperLibraryProperties.Per_testcase_directory))
})
return entriesList
@@ -450,7 +451,7 @@
entriesList := a.AndroidApp.AndroidMkEntries()
entries := &entriesList[0]
entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
- testSuiteComponent(entries, a.testProperties.Test_suites)
+ testSuiteComponent(entries, a.testProperties.Test_suites, Bool(a.testProperties.Per_testcase_directory))
if a.testConfig != nil {
entries.SetPath("LOCAL_FULL_TEST_CONFIG", a.testConfig)
}
@@ -466,7 +467,7 @@
entriesList := a.AndroidApp.AndroidMkEntries()
entries := &entriesList[0]
entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
- testSuiteComponent(entries, a.appTestHelperAppProperties.Test_suites)
+ testSuiteComponent(entries, a.appTestHelperAppProperties.Test_suites, Bool(a.appTestHelperAppProperties.Per_testcase_directory))
// introduce a flag variable to control the generation of the .config file
entries.SetString("LOCAL_DISABLE_TEST_CONFIG", "true")
})
@@ -677,7 +678,7 @@
entriesList := a.AndroidAppImport.AndroidMkEntries()
entries := &entriesList[0]
entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
- testSuiteComponent(entries, a.testProperties.Test_suites)
+ testSuiteComponent(entries, a.testProperties.Test_suites, Bool(a.testProperties.Per_testcase_directory))
androidMkWriteTestData(a.data, entries)
})
return entriesList
diff --git a/java/app.go b/java/app.go
index 2fd6463..bc0f488 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1070,6 +1070,9 @@
// doesn't exist next to the Android.bp, this attribute doesn't need to be set to true
// explicitly.
Auto_gen_config *bool
+
+ // Install the test into a folder named for the module in all test suites.
+ Per_testcase_directory *bool
}
type AndroidTestHelperApp struct {
diff --git a/java/base.go b/java/base.go
index 579085b..7dd6c2d 100644
--- a/java/base.go
+++ b/java/base.go
@@ -1265,10 +1265,25 @@
// Check package restrictions if necessary.
if len(j.properties.Permitted_packages) > 0 {
- // Check packages and copy to package-checked file.
+ // Time stamp file created by the package check rule.
pkgckFile := android.PathForModuleOut(ctx, "package-check.stamp")
+
+ // Create a rule to copy the output jar to another path and add a validate dependency that
+ // will check that the jar only contains the permitted packages. The new location will become
+ // the output file of this module.
+ inputFile := outputFile
+ outputFile = android.PathForModuleOut(ctx, "package-check", jarName).OutputPath
+ ctx.Build(pctx, android.BuildParams{
+ Rule: android.Cp,
+ Input: inputFile,
+ Output: outputFile,
+ // Make sure that any dependency on the output file will cause ninja to run the package check
+ // rule.
+ Validation: pkgckFile,
+ })
+
+ // Check packages and create a timestamp file when complete.
CheckJarPackages(ctx, pkgckFile, outputFile, j.properties.Permitted_packages)
- j.additionalCheckedModules = append(j.additionalCheckedModules, pkgckFile)
if ctx.Failed() {
return
diff --git a/java/java.go b/java/java.go
index 23809df..287bcfa 100644
--- a/java/java.go
+++ b/java/java.go
@@ -781,6 +781,9 @@
// Names of modules containing JNI libraries that should be installed alongside the test.
Jni_libs []string
+
+ // Install the test into a folder named for the module in all test suites.
+ Per_testcase_directory *bool
}
type hostTestProperties struct {
@@ -792,6 +795,9 @@
// list of compatibility suites (for example "cts", "vts") that the module should be
// installed into.
Test_suites []string `android:"arch_variant"`
+
+ // Install the test into a folder named for the module in all test suites.
+ Per_testcase_directory *bool
}
type prebuiltTestProperties struct {
@@ -1392,10 +1398,19 @@
if dexOutputPath := di.PrebuiltExportPath(apexRootRelativePathToJavaLib(j.BaseModuleName())); dexOutputPath != nil {
dexJarFile := makeDexJarPathFromPath(dexOutputPath)
j.dexJarFile = dexJarFile
- j.dexJarInstallFile = android.PathForModuleInPartitionInstall(ctx, "apex", ai.ApexVariationName, apexRootRelativePathToJavaLib(j.BaseModuleName()))
+ installPath := android.PathForModuleInPartitionInstall(ctx, "apex", ai.ApexVariationName, apexRootRelativePathToJavaLib(j.BaseModuleName()))
+ j.dexJarInstallFile = installPath
// Initialize the hiddenapi structure.
j.initHiddenAPI(ctx, dexJarFile, outputFile, nil)
+
+ j.dexpreopter.installPath = j.dexpreopter.getInstallPath(ctx, installPath)
+ if j.dexProperties.Uncompress_dex == nil {
+ // If the value was not force-set by the user, use reasonable default based on the module.
+ j.dexProperties.Uncompress_dex = proptools.BoolPtr(shouldUncompressDex(ctx, &j.dexpreopter))
+ }
+ j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex
+ j.dexpreopt(ctx, dexOutputPath)
} else {
// This should never happen as a variant for a prebuilt_apex is only created if the
// prebuilt_apex has been configured to export the java library dex file.
diff --git a/python/binary.go b/python/binary.go
index bc2768c..afcc53a 100644
--- a/python/binary.go
+++ b/python/binary.go
@@ -63,6 +63,7 @@
}
}
}
+
// TODO(b/182306917): this doesn't fully handle all nested props versioned
// by the python version, which would have been handled by the version split
// mutator. This is sufficient for very simple python_binary_host modules
@@ -80,15 +81,12 @@
// do nothing, since python_version defaults to PY3.
}
- srcs := android.BazelLabelForModuleSrcExcludes(ctx, m.properties.Srcs, m.properties.Exclude_srcs)
- data := android.BazelLabelForModuleSrc(ctx, m.properties.Data)
- deps := android.BazelLabelForModuleDeps(ctx, m.properties.Libs)
-
+ baseAttrs := m.makeArchVariantBaseAttributes(ctx)
attrs := &bazelPythonBinaryAttributes{
Main: main,
- Srcs: bazel.MakeLabelListAttribute(srcs),
- Data: bazel.MakeLabelListAttribute(data),
- Deps: bazel.MakeLabelListAttribute(deps),
+ Srcs: baseAttrs.Srcs,
+ Data: baseAttrs.Data,
+ Deps: baseAttrs.Deps,
Python_version: python_version,
}
diff --git a/python/library.go b/python/library.go
index a132216..19fa59a 100644
--- a/python/library.go
+++ b/python/library.go
@@ -88,14 +88,11 @@
// do nothing, since python_version defaults to PY2ANDPY3
}
- srcs := android.BazelLabelForModuleSrcExcludes(ctx, m.properties.Srcs, m.properties.Exclude_srcs)
- data := android.BazelLabelForModuleSrc(ctx, m.properties.Data)
- deps := android.BazelLabelForModuleDeps(ctx, m.properties.Libs)
-
+ baseAttrs := m.makeArchVariantBaseAttributes(ctx)
attrs := &bazelPythonLibraryAttributes{
- Srcs: bazel.MakeLabelListAttribute(srcs),
- Data: bazel.MakeLabelListAttribute(data),
- Deps: bazel.MakeLabelListAttribute(deps),
+ Srcs: baseAttrs.Srcs,
+ Data: baseAttrs.Data,
+ Deps: baseAttrs.Deps,
Srcs_version: python_version,
}
diff --git a/python/python.go b/python/python.go
index f900172..401d91f 100644
--- a/python/python.go
+++ b/python/python.go
@@ -22,6 +22,7 @@
"regexp"
"strings"
+ "android/soong/bazel"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -120,6 +121,18 @@
Embedded_launcher *bool `blueprint:"mutated"`
}
+type baseAttributes struct {
+ // TODO(b/200311466): Probably not translate b/c Bazel has no good equiv
+ //Pkg_path bazel.StringAttribute
+ // TODO: Related to Pkg_bath and similarLy gated
+ //Is_internal bazel.BoolAttribute
+ // Combines Srcs and Exclude_srcs
+ Srcs bazel.LabelListAttribute
+ Deps bazel.LabelListAttribute
+ // Combines Data and Java_data (invariant)
+ Data bazel.LabelListAttribute
+}
+
// Used to store files of current module after expanding dependencies
type pathMapping struct {
dest string
@@ -177,6 +190,25 @@
}
}
+func (m *Module) makeArchVariantBaseAttributes(ctx android.TopDownMutatorContext) baseAttributes {
+ var attrs baseAttributes
+ archVariantBaseProps := m.GetArchVariantProperties(ctx, &BaseProperties{})
+ for axis, configToProps := range archVariantBaseProps {
+ for config, props := range configToProps {
+ if baseProps, ok := props.(*BaseProperties); ok {
+ attrs.Srcs.SetSelectValue(axis, config,
+ android.BazelLabelForModuleSrcExcludes(ctx, baseProps.Srcs, baseProps.Exclude_srcs))
+ attrs.Deps.SetSelectValue(axis, config,
+ android.BazelLabelForModuleDeps(ctx, baseProps.Libs))
+ data := android.BazelLabelForModuleSrc(ctx, baseProps.Data)
+ data.Append(android.BazelLabelForModuleSrc(ctx, baseProps.Java_data))
+ attrs.Data.SetSelectValue(axis, config, data)
+ }
+ }
+ }
+ return attrs
+}
+
// bootstrapper interface should be implemented for runnable modules, e.g. binary and test
type bootstrapper interface {
bootstrapperProps() []interface{}