Merge "Export defaultJavaLibraryName() identifier"
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index dd0aaeb..1ece9fa 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -132,6 +132,7 @@
"external/f2fs-tools": Bp2BuildDefaultTrue,
"external/flac": Bp2BuildDefaultTrueRecursively,
"external/fmtlib": Bp2BuildDefaultTrueRecursively,
+ "external/guava": Bp2BuildDefaultTrueRecursively,
"external/google-benchmark": Bp2BuildDefaultTrueRecursively,
"external/googletest": Bp2BuildDefaultTrueRecursively,
"external/gwp_asan": Bp2BuildDefaultTrueRecursively,
@@ -364,8 +365,6 @@
"system/testing/gtest_extras": Bp2BuildDefaultTrueRecursively,
"system/timezone/apex": Bp2BuildDefaultTrueRecursively,
"system/timezone/output_data": Bp2BuildDefaultTrueRecursively,
- "system/timezone/testdata": Bp2BuildDefaultTrueRecursively,
- "system/timezone/testing": Bp2BuildDefaultTrueRecursively,
"system/tools/aidl/build/tests_bp2build": Bp2BuildDefaultTrue,
"system/tools/aidl/metadata": Bp2BuildDefaultTrue,
"system/tools/hidl/metadata": Bp2BuildDefaultTrue,
@@ -387,6 +386,7 @@
"build/bazel":/* recursive = */ true,
"build/make/core":/* recursive = */ false,
"build/bazel_common_rules":/* recursive = */ true,
+ "build/make/target/product/security":/* recursive = */ false,
// build/make/tools/signapk BUILD file is generated, so build/make/tools is not recursive.
"build/make/tools":/* recursive = */ false,
"build/pesto":/* recursive = */ true,
@@ -398,7 +398,6 @@
"external/bazelbuild-rules_license":/* recursive = */ true,
"external/bazelbuild-kotlin-rules":/* recursive = */ true,
"external/bazel-skylib":/* recursive = */ true,
- "external/guava":/* recursive = */ true,
"external/protobuf":/* recursive = */ false,
"external/python/absl-py":/* recursive = */ true,
@@ -712,6 +711,8 @@
// allowlisting for kotlinx_coroutines
"kotlinx_coroutines",
+ "kotlinx_coroutines-device",
+ "kotlinx_coroutines-host",
"annotations",
"kotlinx-coroutines-android-annotation-stubs",
diff --git a/bp2build/Android.bp b/bp2build/Android.bp
index 6edd78a..598ca32 100644
--- a/bp2build/Android.bp
+++ b/bp2build/Android.bp
@@ -61,6 +61,7 @@
"genrule_conversion_test.go",
"gensrcs_conversion_test.go",
"java_binary_host_conversion_test.go",
+ "java_host_for_device_conversion_test.go",
"java_import_conversion_test.go",
"java_library_conversion_test.go",
"java_library_host_conversion_test.go",
diff --git a/bp2build/java_host_for_device_conversion_test.go b/bp2build/java_host_for_device_conversion_test.go
new file mode 100644
index 0000000..d908d00
--- /dev/null
+++ b/bp2build/java_host_for_device_conversion_test.go
@@ -0,0 +1,63 @@
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package bp2build
+
+import (
+ "testing"
+
+ "android/soong/android"
+ "android/soong/java"
+)
+
+func runJavaHostForDeviceTestCaseWithRegistrationCtxFunc(t *testing.T, tc Bp2buildTestCase, registrationCtxFunc func(ctx android.RegistrationContext)) {
+ t.Helper()
+ (&tc).ModuleTypeUnderTest = "java_host_for_device"
+ (&tc).ModuleTypeUnderTestFactory = java.HostForDeviceFactory
+ RunBp2BuildTestCase(t, registrationCtxFunc, tc)
+}
+
+func runJavaHostForDeviceTestCase(t *testing.T, tc Bp2buildTestCase) {
+ t.Helper()
+ runJavaHostForDeviceTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("java_library", java.LibraryFactory)
+ })
+}
+
+func TestJavaHostForDevice(t *testing.T) {
+ runJavaHostForDeviceTestCase(t, Bp2buildTestCase{
+ Description: "java_host_for_device test",
+ Blueprint: `java_host_for_device {
+ name: "java-lib-1",
+ libs: ["java-lib-2"],
+ bazel_module: { bp2build_available: true },
+}
+
+java_library {
+ name: "java-lib-2",
+ srcs: ["b.java"],
+ bazel_module: { bp2build_available: true },
+}`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("java_host_for_device", "java-lib-1", AttrNameToString{
+ "deps": `[":java-lib-2"]`,
+ }),
+ MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"),
+ MakeBazelTarget("java_library", "java-lib-2", AttrNameToString{
+ "srcs": `["b.java"]`,
+ }),
+ MakeNeverlinkDuplicateTarget("java_library", "java-lib-2"),
+ },
+ })
+}
diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go
index 69d0db9..683ee27 100644
--- a/bp2build/java_library_conversion_test.go
+++ b/bp2build/java_library_conversion_test.go
@@ -740,7 +740,7 @@
})
}
-func TestJavaLibraryArchVariantLibs(t *testing.T) {
+func TestJavaLibraryArchVariantDeps(t *testing.T) {
runJavaLibraryTestCase(t, Bp2buildTestCase{
Description: "java_library with arch variant libs",
Blueprint: `java_library {
@@ -750,6 +750,7 @@
target: {
android: {
libs: ["java-lib-3"],
+ static_libs: ["java-lib-4"],
},
},
bazel_module: { bp2build_available: true },
@@ -762,12 +763,23 @@
java_library{
name: "java-lib-3",
}
+
+ java_library{
+ name: "java-lib-4",
+}
`,
ExpectedBazelTargets: []string{
MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
"srcs": `["a.java"]`,
+ "exports": `select({
+ "//build/bazel/platforms/os:android": [":java-lib-4"],
+ "//conditions:default": [],
+ })`,
"deps": `[":java-lib-2-neverlink"] + select({
- "//build/bazel/platforms/os:android": [":java-lib-3-neverlink"],
+ "//build/bazel/platforms/os:android": [
+ ":java-lib-3-neverlink",
+ ":java-lib-4",
+ ],
"//conditions:default": [],
})`,
}),
@@ -776,6 +788,8 @@
MakeNeverlinkDuplicateTarget("java_library", "java-lib-2"),
MakeBazelTarget("java_library", "java-lib-3", AttrNameToString{}),
MakeNeverlinkDuplicateTarget("java_library", "java-lib-3"),
+ MakeBazelTarget("java_library", "java-lib-4", AttrNameToString{}),
+ MakeNeverlinkDuplicateTarget("java_library", "java-lib-4"),
},
})
}
diff --git a/bp2build/symlink_forest.go b/bp2build/symlink_forest.go
index aac5e7d..5c33308 100644
--- a/bp2build/symlink_forest.go
+++ b/bp2build/symlink_forest.go
@@ -21,10 +21,13 @@
"path/filepath"
"regexp"
"sort"
+ "strconv"
+ "strings"
"sync"
"sync/atomic"
"android/soong/shared"
+
"github.com/google/blueprint/pathtools"
)
@@ -35,6 +38,13 @@
// excluded from symlinking. Otherwise, the node is not excluded, but one of its
// descendants is (otherwise the node in question would not exist)
+// This is a version int written to a file called symlink_forest_version at the root of the
+// symlink forest. If the version here does not match the version in the file, then we'll
+// clean the whole symlink forest and recreate it. This number can be bumped whenever there's
+// an incompatible change to the forest layout or a bug in incrementality that needs to be fixed
+// on machines that may still have the bug present in their forest.
+const symlinkForestVersion = 1
+
type instructionsNode struct {
name string
excluded bool // If false, this is just an intermediate node
@@ -123,6 +133,34 @@
}
newContents = append(newContents, srcBuildFileContent...)
+ // Say you run bp2build 4 times:
+ // - The first time there's only an Android.bp file. bp2build will convert it to a build file
+ // under out/soong/bp2build, then symlink from the forest to that generated file
+ // - Then you add a handcrafted BUILD file in the same directory. bp2build will merge this with
+ // the generated one, and write the result to the output file in the forest. But the output
+ // file was a symlink to out/soong/bp2build from the previous step! So we erroneously update
+ // the file in out/soong/bp2build instead. So far this doesn't cause any problems...
+ // - You run a 3rd bp2build with no relevant changes. Everything continues to work.
+ // - You then add a comment to the handcrafted BUILD file. This causes a merge with the
+ // generated file again. But since we wrote to the generated file in step 2, the generated
+ // file has an old copy of the handcrafted file in it! This probably causes duplicate bazel
+ // targets.
+ // To solve this, if we see that the output file is a symlink from a previous build, remove it.
+ stat, err := os.Lstat(output)
+ if err != nil && !os.IsNotExist(err) {
+ return err
+ } else if err == nil {
+ if stat.Mode()&os.ModeSymlink == os.ModeSymlink {
+ if verbose {
+ fmt.Fprintf(os.Stderr, "Removing symlink so that we can replace it with a merged file: %s\n", output)
+ }
+ err = os.Remove(output)
+ if err != nil {
+ return err
+ }
+ }
+ }
+
return pathtools.WriteFileIfChanged(output, newContents, 0666)
}
@@ -202,6 +240,46 @@
return false
}
+// maybeCleanSymlinkForest will remove the whole symlink forest directory if the version recorded
+// in the symlink_forest_version file is not equal to symlinkForestVersion.
+func maybeCleanSymlinkForest(topdir, forest string, verbose bool) error {
+ versionFilePath := shared.JoinPath(topdir, forest, "symlink_forest_version")
+ versionFileContents, err := os.ReadFile(versionFilePath)
+ if err != nil && !os.IsNotExist(err) {
+ return err
+ }
+ versionFileString := strings.TrimSpace(string(versionFileContents))
+ symlinkForestVersionString := strconv.Itoa(symlinkForestVersion)
+ if err != nil || versionFileString != symlinkForestVersionString {
+ if verbose {
+ fmt.Fprintf(os.Stderr, "Old symlink_forest_version was %q, current is %q. Cleaning symlink forest before recreating...\n", versionFileString, symlinkForestVersionString)
+ }
+ err = os.RemoveAll(shared.JoinPath(topdir, forest))
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// maybeWriteVersionFile will write the symlink_forest_version file containing symlinkForestVersion
+// if it doesn't exist already. If it exists we know it must contain symlinkForestVersion because
+// we checked for that already in maybeCleanSymlinkForest
+func maybeWriteVersionFile(topdir, forest string) error {
+ versionFilePath := shared.JoinPath(topdir, forest, "symlink_forest_version")
+ _, err := os.Stat(versionFilePath)
+ if err != nil {
+ if !os.IsNotExist(err) {
+ return err
+ }
+ err = os.WriteFile(versionFilePath, []byte(strconv.Itoa(symlinkForestVersion)+"\n"), 0666)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
// Recursively plants a symlink forest at forestDir. The symlink tree will
// contain every file in buildFilesDir and srcDir excluding the files in
// instructions. Collects every directory encountered during the traversal of
@@ -395,6 +473,12 @@
symlinkCount: atomic.Uint64{},
}
+ err := maybeCleanSymlinkForest(topdir, forest, verbose)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+
instructions := instructionsFromExcludePathList(exclude)
go func() {
context.wg.Add(1)
@@ -407,5 +491,11 @@
deps = append(deps, dep)
}
+ err = maybeWriteVersionFile(topdir, forest)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+
return deps, context.mkdirCount.Load(), context.symlinkCount.Load()
}
diff --git a/cc/afdo.go b/cc/afdo.go
index 4a8498b..be4f50a 100644
--- a/cc/afdo.go
+++ b/cc/afdo.go
@@ -71,10 +71,10 @@
func (afdo *afdo) flags(ctx ModuleContext, flags Flags) Flags {
if path := afdo.Properties.FdoProfilePath; path != nil {
+ // The flags are prepended to allow overriding.
profileUseFlag := fmt.Sprintf(afdoCFlagsFormat, *path)
- flags.Local.CFlags = append(flags.Local.CFlags, profileUseFlag)
- flags.Local.LdFlags = append(flags.Local.LdFlags, profileUseFlag)
- flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-mllvm,-no-warn-sample-unused=true")
+ flags.Local.CFlags = append([]string{profileUseFlag}, flags.Local.CFlags...)
+ flags.Local.LdFlags = append([]string{profileUseFlag, "-Wl,-mllvm,-no-warn-sample-unused=true"}, flags.Local.LdFlags...)
// Update CFlagsDeps and LdFlagsDeps so the module is rebuilt
// if profileFile gets updated
diff --git a/java/config/config.go b/java/config/config.go
index 13670ee..b82a137 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -95,11 +95,13 @@
"-JXX:TieredStopAtLevel=1",
"-JDcom.android.tools.r8.emitRecordAnnotationsInDex",
"-JDcom.android.tools.r8.emitPermittedSubclassesAnnotationsInDex",
+ "-JDcom.android.tools.r8.emitRecordAnnotationsExInDex",
}, dexerJavaVmFlagsList...))
exportedVars.ExportStringListStaticVariable("R8Flags", append([]string{
"-JXmx2048M",
"-JDcom.android.tools.r8.emitRecordAnnotationsInDex",
"-JDcom.android.tools.r8.emitPermittedSubclassesAnnotationsInDex",
+ "-JDcom.android.tools.r8.emitRecordAnnotationsExInDex",
}, dexerJavaVmFlagsList...))
exportedVars.ExportStringListStaticVariable("CommonJdkFlags", []string{
diff --git a/java/core-libraries/TxtStubLibraries.bp b/java/core-libraries/TxtStubLibraries.bp
index b63ce42..813187e 100644
--- a/java/core-libraries/TxtStubLibraries.bp
+++ b/java/core-libraries/TxtStubLibraries.bp
@@ -33,8 +33,8 @@
"system-modules-no-annotations",
],
static_libs: [
- "core.current.stubs.from-txt",
- "core-lambda-stubs-for-system-modules",
+ "core.current.stubs.from-text",
+ "core-lambda-stubs.from-text",
],
// TODO: Enable after stub generation from .txt file is available
enabled: false,
@@ -58,8 +58,8 @@
"system-modules-no-annotations",
],
static_libs: [
- "core.module_lib.stubs.txt",
- "core-lambda-stubs-for-system-modules",
+ "core.module_lib.stubs.from-text",
+ "core-lambda-stubs.from-text",
],
// TODO: Enable after stub generation from .txt file is available
enabled: false,
@@ -89,7 +89,7 @@
visibility: core_platform_visibility,
libs: [
"legacy.core.platform.api.no.annotations.stubs.from-text",
- "core-lambda-stubs-for-system-modules",
+ "core-lambda-stubs.from-text",
],
// TODO: Enable after stub generation from .txt file is available
enabled: false,
@@ -118,7 +118,7 @@
visibility: core_platform_visibility,
libs: [
"stable.core.platform.api.no.annotations.stubs.from-text",
- "core-lambda-stubs-for-system-modules",
+ "core-lambda-stubs.from-text",
],
// TODO: Enable after stub generation from .txt file is available
enabled: false,
@@ -140,3 +140,17 @@
// TODO: Enable after stub generation from .txt file is available
enabled: false,
}
+
+java_api_library {
+ name: "core-lambda-stubs.from-text",
+ api_surface: "toolchain",
+ api_contributions: [
+ "art.module.toolchain.api.api.contribution",
+ ],
+ libs: [
+ // LambdaMetaFactory depends on CallSite etc. which is part of the Core API surface
+ "core.current.stubs.from-text",
+ ],
+ // TODO: Enable after stub generation from .txt file is available
+ enabled: false,
+}
diff --git a/java/device_host_converter.go b/java/device_host_converter.go
index 4abdcc6..656c866 100644
--- a/java/device_host_converter.go
+++ b/java/device_host_converter.go
@@ -19,12 +19,14 @@
"io"
"android/soong/android"
+ "android/soong/bazel"
"android/soong/dexpreopt"
)
type DeviceHostConverter struct {
android.ModuleBase
android.DefaultableModuleBase
+ android.BazelModuleBase
properties DeviceHostConverterProperties
@@ -76,6 +78,7 @@
module.AddProperties(&module.properties)
InitJavaModule(module, android.DeviceSupported)
+ android.InitBazelModule(module)
return module
}
@@ -186,3 +189,30 @@
},
}
}
+
+type bazelDeviceHostConverterAttributes struct {
+ Deps bazel.LabelListAttribute
+}
+
+func (d *DeviceHostConverter) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
+ ctx.CreateBazelTargetModule(
+ bazel.BazelTargetModuleProperties{
+ Rule_class: "java_host_for_device",
+ Bzl_load_location: "//build/bazel/rules/java:host_for_device.bzl",
+ },
+ android.CommonAttributes{Name: d.Name()},
+ &bazelDeviceHostConverterAttributes{
+ Deps: bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, d.properties.Libs)),
+ },
+ )
+ neverlinkProp := true
+ neverLinkAttrs := &javaLibraryAttributes{
+ Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + d.Name()}),
+ Neverlink: bazel.BoolAttribute{Value: &neverlinkProp},
+ }
+ ctx.CreateBazelTargetModule(
+ javaLibraryBazelTargetModuleProperties(),
+ android.CommonAttributes{Name: d.Name() + "-neverlink"},
+ neverLinkAttrs)
+
+}
diff --git a/java/java.go b/java/java.go
index c97f427..d400b0c 100644
--- a/java/java.go
+++ b/java/java.go
@@ -2907,10 +2907,6 @@
}
}
- if m.properties.Static_libs != nil {
- staticDeps.Append(android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(android.CopyOf(m.properties.Static_libs))))
- }
-
protoDepLabel := bp2buildProto(ctx, &m.Module, srcPartitions[protoSrcPartition])
// Soong does not differentiate between a java_library and the Bazel equivalent of
// a java_proto_library + proto_library pair. Instead, in Soong proto sources are
@@ -2922,7 +2918,18 @@
depLabels := &javaDependencyLabels{}
depLabels.Deps = deps
- depLabels.StaticDeps = bazel.MakeLabelListAttribute(staticDeps)
+
+ for axis, configToProps := range archVariantProps {
+ for config, _props := range configToProps {
+ if archProps, ok := _props.(*CommonProperties); ok {
+ archStaticLibs := android.BazelLabelForModuleDeps(
+ ctx,
+ android.LastUniqueStrings(android.CopyOf(archProps.Static_libs)))
+ depLabels.StaticDeps.SetSelectValue(axis, config, archStaticLibs)
+ }
+ }
+ }
+ depLabels.StaticDeps.Value.Append(staticDeps)
hasKotlin := !kotlinSrcs.IsEmpty()
commonAttrs.kotlinAttributes = &kotlinAttributes{
diff --git a/java/sdk.go b/java/sdk.go
index 1b18ba4..8b4918a 100644
--- a/java/sdk.go
+++ b/java/sdk.go
@@ -151,7 +151,7 @@
systemModules := android.JavaApiLibraryName(ctx.Config(), fmt.Sprintf("core-%s-stubs-system-modules", systemModulesKind))
return sdkDep{
useModule: true,
- bootclasspath: []string{module, config.DefaultLambdaStubsLibrary},
+ bootclasspath: []string{module, android.JavaApiLibraryName(ctx.Config(), config.DefaultLambdaStubsLibrary)},
systemModules: systemModules,
java9Classpath: []string{module},
frameworkResModule: "framework-res",
@@ -197,7 +197,7 @@
case android.SdkCore:
return sdkDep{
useModule: true,
- bootclasspath: []string{android.SdkCore.JavaLibraryName(ctx.Config()), config.DefaultLambdaStubsLibrary},
+ bootclasspath: []string{android.SdkCore.JavaLibraryName(ctx.Config()), android.JavaApiLibraryName(ctx.Config(), config.DefaultLambdaStubsLibrary)},
systemModules: android.JavaApiLibraryName(ctx.Config(), "core-public-stubs-system-modules"),
noFrameworksLibs: true,
}