Merge "Don't add dexpreopt compat deps to android_library modules"
diff --git a/android/config.go b/android/config.go
index 9c1a484..4ebb00f 100644
--- a/android/config.go
+++ b/android/config.go
@@ -595,10 +595,6 @@
fmt.Fprintln(os.Stderr, "unsupported env var GLOBAL_THINLTO for Bazel: falling back to non-mixed build")
return false
}
- if c.IsEnvTrue("CLANG_COVERAGE") {
- fmt.Fprintln(os.Stderr, "unsupported env var CLANG_COVERAGE for Bazel: falling back to non-mixed build")
- return false
- }
if len(c.productVariables.SanitizeHost) > 0 {
fmt.Fprintln(os.Stderr, "unsupported product var SanitizeHost for Bazel: falling back to non-mixed build")
return false
diff --git a/android/soong_config_modules.go b/android/soong_config_modules.go
index c0f4523..c1e92b8 100644
--- a/android/soong_config_modules.go
+++ b/android/soong_config_modules.go
@@ -382,15 +382,15 @@
defer r.Close()
mtDef, errs := soongconfig.Parse(r, from)
- if ctx.Config().BuildMode == Bp2build {
- ctx.Config().Bp2buildSoongConfigDefinitions.AddVars(*mtDef)
- }
-
if len(errs) > 0 {
reportErrors(ctx, from, errs...)
return (map[string]blueprint.ModuleFactory)(nil)
}
+ if ctx.Config().BuildMode == Bp2build {
+ ctx.Config().Bp2buildSoongConfigDefinitions.AddVars(*mtDef)
+ }
+
globalModuleTypes := ctx.moduleFactories()
factories := make(map[string]blueprint.ModuleFactory)
diff --git a/apex/apex.go b/apex/apex.go
index fcac3ab..a07576a 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -2066,15 +2066,23 @@
requireNativeLibs []string
handleSpecialLibs bool
+
+ // if true, raise error on duplicate apexFile
+ checkDuplicate bool
}
-func (vctx *visitorContext) normalizeFileInfo() {
+func (vctx *visitorContext) normalizeFileInfo(mctx android.ModuleContext) {
encountered := make(map[string]apexFile)
for _, f := range vctx.filesInfo {
dest := filepath.Join(f.installDir, f.builtFile.Base())
if e, ok := encountered[dest]; !ok {
encountered[dest] = f
} else {
+ if vctx.checkDuplicate && f.builtFile.String() != e.builtFile.String() {
+ mctx.ModuleErrorf("apex file %v is provided by two different files %v and %v",
+ dest, e.builtFile, f.builtFile)
+ return
+ }
// If a module is directly included and also transitively depended on
// consider it as directly included.
e.transitiveDep = e.transitiveDep && f.transitiveDep
@@ -2433,6 +2441,25 @@
return false
}
+func (a *apexBundle) shouldCheckDuplicate(ctx android.ModuleContext) bool {
+ // TODO(b/263308293) remove this
+ if a.properties.IsCoverageVariant {
+ return false
+ }
+ // TODO(b/263308515) remove this
+ if a.testApex {
+ return false
+ }
+ // TODO(b/263309864) remove this
+ if a.Host() {
+ return false
+ }
+ if a.Device() && ctx.DeviceConfig().DeviceArch() == "" {
+ return false
+ }
+ return true
+}
+
// Creates build rules for an APEX. It consists of the following major steps:
//
// 1) do some validity checks such as apex_available, min_sdk_version, etc.
@@ -2453,9 +2480,12 @@
// TODO(jiyong): do this using WalkPayloadDeps
// TODO(jiyong): make this clean!!!
- vctx := visitorContext{handleSpecialLibs: !android.Bool(a.properties.Ignore_system_library_special_case)}
+ vctx := visitorContext{
+ handleSpecialLibs: !android.Bool(a.properties.Ignore_system_library_special_case),
+ checkDuplicate: a.shouldCheckDuplicate(ctx),
+ }
ctx.WalkDepsBlueprint(func(child, parent blueprint.Module) bool { return a.depVisitor(&vctx, ctx, child, parent) })
- vctx.normalizeFileInfo()
+ vctx.normalizeFileInfo(ctx)
if a.privateKeyFile == nil {
ctx.PropertyErrorf("key", "private_key for %q could not be found", String(a.overridableProperties.Key))
return
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 499d753..33fce7c 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -3420,11 +3420,34 @@
isLink bool
}
+func (f fileInApex) String() string {
+ return f.src + ":" + f.path
+}
+
+func (f fileInApex) match(expectation string) bool {
+ parts := strings.Split(expectation, ":")
+ if len(parts) == 1 {
+ match, _ := path.Match(parts[0], f.path)
+ return match
+ }
+ if len(parts) == 2 {
+ matchSrc, _ := path.Match(parts[0], f.src)
+ matchDst, _ := path.Match(parts[1], f.path)
+ return matchSrc && matchDst
+ }
+ panic("invalid expected file specification: " + expectation)
+}
+
func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
t.Helper()
- apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
+ module := ctx.ModuleForTests(moduleName, variant)
+ apexRule := module.MaybeRule("apexRule")
+ apexDir := "/image.apex/"
+ if apexRule.Rule == nil {
+ apexRule = module.Rule("zipApexRule")
+ apexDir = "/image.zipapex/"
+ }
copyCmds := apexRule.Args["copy_commands"]
- imageApexDir := "/image.apex/"
var ret []fileInApex
for _, cmd := range strings.Split(copyCmds, "&&") {
cmd = strings.TrimSpace(cmd)
@@ -3455,11 +3478,11 @@
t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
}
if dst != "" {
- index := strings.Index(dst, imageApexDir)
+ index := strings.Index(dst, apexDir)
if index == -1 {
- t.Fatal("copyCmds should copy a file to image.apex/", cmd)
+ t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
}
- dstFile := dst[index+len(imageApexDir):]
+ dstFile := dst[index+len(apexDir):]
ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
}
}
@@ -3472,16 +3495,16 @@
var surplus []string
filesMatched := make(map[string]bool)
for _, file := range getFiles(t, ctx, moduleName, variant) {
- mactchFound := false
+ matchFound := false
for _, expected := range files {
- if matched, _ := path.Match(expected, file.path); matched {
+ if file.match(expected) {
+ matchFound = true
filesMatched[expected] = true
- mactchFound = true
break
}
}
- if !mactchFound {
- surplus = append(surplus, file.path)
+ if !matchFound {
+ surplus = append(surplus, file.String())
}
}
@@ -3974,6 +3997,11 @@
apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
ensureListEmpty(t, provideNativeLibs)
+ ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
+ "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
+ "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
+ "*/*",
+ })
}
func TestDependenciesInApexManifest(t *testing.T) {
@@ -6992,6 +7020,42 @@
})
}
+func TestNoDupeApexFiles(t *testing.T) {
+ android.GroupFixturePreparers(
+ android.PrepareForTestWithAndroidBuildComponents,
+ PrepareForTestWithApexBuildComponents,
+ prepareForTestWithMyapex,
+ prebuilt_etc.PrepareForTestWithPrebuiltEtc,
+ ).
+ ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
+ RunTestWithBp(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ prebuilts: ["foo", "bar"],
+ updatable: false,
+ }
+
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+
+ prebuilt_etc {
+ name: "foo",
+ src: "myprebuilt",
+ filename_from_src: true,
+ }
+
+ prebuilt_etc {
+ name: "bar",
+ src: "myprebuilt",
+ filename_from_src: true,
+ }
+ `)
+}
+
func TestRejectNonInstallableJavaLibrary(t *testing.T) {
testApexError(t, `"myjar" is not configured to be compiled into dex`, `
apex {
diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go
index b298dac..af4fd9f 100644
--- a/apex/bootclasspath_fragment_test.go
+++ b/apex/bootclasspath_fragment_test.go
@@ -71,10 +71,6 @@
name: "com.android.art",
key: "com.android.art.key",
bootclasspath_fragments: ["art-bootclasspath-fragment"],
- java_libs: [
- "baz",
- "quuz",
- ],
updatable: false,
}
@@ -301,11 +297,7 @@
"mybootclasspathfragment",
],
// bar (like foo) should be transitively included in this apex because it is part of the
- // mybootclasspathfragment bootclasspath_fragment. However, it is kept here to ensure that the
- // apex dedups the files correctly.
- java_libs: [
- "bar",
- ],
+ // mybootclasspathfragment bootclasspath_fragment.
updatable: false,
}
@@ -445,7 +437,6 @@
})
java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
- `bar`,
`com.android.art.key`,
`mybootclasspathfragment`,
})
@@ -559,7 +550,6 @@
})
java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
- `bar`,
`com.android.art.key`,
`mybootclasspathfragment`,
`prebuilt_com.android.art`,
@@ -1105,10 +1095,6 @@
name: "com.android.art",
key: "com.android.art.key",
bootclasspath_fragments: ["art-bootclasspath-fragment"],
- java_libs: [
- "baz",
- "quuz",
- ],
updatable: false,
}
@@ -1270,10 +1256,6 @@
name: "com.android.art",
key: "com.android.art.key",
bootclasspath_fragments: ["art-bootclasspath-fragment"],
- java_libs: [
- "baz",
- "quuz",
- ],
updatable: false,
}
diff --git a/bp2build/soong_config_module_type_conversion_test.go b/bp2build/soong_config_module_type_conversion_test.go
index a94b2b9..7029b93 100644
--- a/bp2build/soong_config_module_type_conversion_test.go
+++ b/bp2build/soong_config_module_type_conversion_test.go
@@ -17,6 +17,7 @@
import (
"android/soong/android"
"android/soong/cc"
+ "fmt"
"testing"
)
@@ -36,6 +37,29 @@
ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
}
+func TestErrorInBpFileDoesNotPanic(t *testing.T) {
+ bp := `
+soong_config_module_type {
+ name: "library_linking_strategy_cc_defaults",
+ module_type: "cc_defaults",
+ config_namespace: "ANDROID",
+ variables: ["library_linking_strategy"],
+ properties: [
+ "shared_libs",
+ "static_libs",
+ ],
+}
+`
+
+ runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
+ Description: "soong config variables - generates selects for library_linking_strategy",
+ ModuleTypeUnderTest: "cc_binary",
+ ModuleTypeUnderTestFactory: cc.BinaryFactory,
+ Blueprint: bp,
+ ExpectedErr: fmt.Errorf(`unknown variable "library_linking_strategy" in module type "library_linking_strategy_cc_defaults`),
+ })
+}
+
func TestSoongConfigModuleType(t *testing.T) {
bp := `
soong_config_module_type {
diff --git a/cc/config/global.go b/cc/config/global.go
index a4e2975..e78839b 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -294,8 +294,8 @@
}
llvmNextExtraCommonGlobalCflags = []string{
- // New warnings to be fixed after clang-r475365
- "-Wno-error=single-bit-bitfield-constant-conversion", // http://b/243965903
+ // Do not report warnings when testing with the top of trunk LLVM.
+ "-Wno-error",
}
IllegalFlags = []string{
@@ -344,16 +344,7 @@
exportedVars.ExportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags)
// Export the static default CommonGlobalCflags to Bazel.
- // TODO(187086342): handle cflags that are set in VariableFuncs.
- bazelCommonGlobalCflags := append(
- commonGlobalCflags,
- []string{
- // Default to zero initialization.
- "-ftrivial-auto-var-init=zero",
- "-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang",
- "-Wno-unused-command-line-argument",
- }...)
- exportedVars.ExportStringList("CommonGlobalCflags", bazelCommonGlobalCflags)
+ exportedVars.ExportStringList("CommonGlobalCflags", commonGlobalCflags)
pctx.VariableFunc("CommonGlobalCflags", func(ctx android.PackageVarContext) string {
flags := commonGlobalCflags
diff --git a/cc/vndk.go b/cc/vndk.go
index 4cd4d42..6ab4734 100644
--- a/cc/vndk.go
+++ b/cc/vndk.go
@@ -368,7 +368,10 @@
}
return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.IsVndkSp() && !m.IsVndkExt()
}
-
+ // VNDK APEX doesn't need stub variants
+ if lib.buildStubs() {
+ return false
+ }
useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt() && !useCoreVariant
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index 1365d4a..e123f24 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -72,6 +72,9 @@
// Hash and signing algorithm for avbtool. Default is SHA256_RSA4096.
Avb_algorithm *string
+ // Hash and signing algorithm for avbtool. Default is SHA256_RSA4096.
+ Avb_hash_algorithm *string
+
// Name of the partition stored in vbmeta desc. Defaults to the name of this module.
Partition_name *string
@@ -333,7 +336,11 @@
addStr("avb_algorithm", algorithm)
key := android.PathForModuleSrc(ctx, proptools.String(f.properties.Avb_private_key))
addPath("avb_key_path", key)
- addStr("avb_add_hashtree_footer_args", "--do_not_generate_fec")
+ avb_add_hashtree_footer_args := "--do_not_generate_fec"
+ if hashAlgorithm := proptools.String(f.properties.Avb_hash_algorithm); hashAlgorithm != "" {
+ avb_add_hashtree_footer_args += " --hash_algorithm " + hashAlgorithm
+ }
+ addStr("avb_add_hashtree_footer_args", avb_add_hashtree_footer_args)
partitionName := proptools.StringDefault(f.properties.Partition_name, f.Name())
addStr("partition_name", partitionName)
addStr("avb_salt", f.salt())
diff --git a/java/droiddoc.go b/java/droiddoc.go
index 8a291ad..aa55f37 100644
--- a/java/droiddoc.go
+++ b/java/droiddoc.go
@@ -598,7 +598,7 @@
// Droiddoc always gets "-source 1.8" because it doesn't support 1.9 sources. For modules with 1.9
// sources, droiddoc will get sources produced by metalava which will have already stripped out the
// 1.9 language features.
- cmd.FlagWithArg("-source ", "1.8").
+ cmd.FlagWithArg("-source ", getStubsJavaVersion().String()).
Flag("-J-Xmx1600m").
Flag("-J-XX:-OmitStackTraceInFastThrow").
Flag("-XDignore.symbol.file").
diff --git a/java/java.go b/java/java.go
index b3abc91..275abbe 100644
--- a/java/java.go
+++ b/java/java.go
@@ -521,6 +521,11 @@
}
}
+// Java version for stubs generation
+func getStubsJavaVersion() javaVersion {
+ return JAVA_VERSION_8
+}
+
type javaVersion int
const (
@@ -1718,6 +1723,7 @@
al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), "android.jar")
var flags javaBuilderFlags
+ flags.javaVersion = getStubsJavaVersion()
flags.javacFlags = strings.Join(al.properties.Javacflags, " ")
TransformJavaToClasses(ctx, al.stubsJar, 0, android.Paths{},