emulate java_library static_deps with Bazel exports
In Soong, java_library can specify static_deps which are dependencies that get aggregated into the final jar (akin to static linking). This is useful because it allows dependencies higher up in the chain to compile against the APIs exported by transitive dependencies. Bazel does not support this functionality directly, but it can be emulated via the exports attribute which makes any targets listed in the attribute public to targets further up the chain. Bug: 217236083 Bug: 219908977 Test: b build //external/error_prone:error_prone_core Test: b build //external/bouncycastle:bouncycastle-host Test: b build --platforms=//build/bazel/platforms:linux_x86 //prebuilts/sdk/tools/jetifier/jetifier-standalone:jetifier Change-Id: I2867e3f816de720a6f4bd9ff7a847d1b0c2da2d6
This commit is contained in:
125
java/java.go
125
java/java.go
@@ -2023,13 +2023,23 @@ func addCLCFromDep(ctx android.ModuleContext, depModule android.Module,
|
||||
}
|
||||
}
|
||||
|
||||
type javaLibraryAttributes struct {
|
||||
type javaCommonAttributes struct {
|
||||
Srcs bazel.LabelListAttribute
|
||||
Deps bazel.LabelListAttribute
|
||||
Javacopts bazel.StringListAttribute
|
||||
}
|
||||
|
||||
func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) *javaLibraryAttributes {
|
||||
type javaDependencyLabels struct {
|
||||
// Dependencies which DO NOT contribute to the API visible to upstream dependencies.
|
||||
Deps bazel.LabelListAttribute
|
||||
// Dependencies which DO contribute to the API visible to upstream dependencies.
|
||||
StaticDeps bazel.LabelListAttribute
|
||||
}
|
||||
|
||||
// convertLibraryAttrsBp2Build converts a few shared attributes from java_* modules
|
||||
// and also separates dependencies into dynamic dependencies and static dependencies.
|
||||
// Each corresponding Bazel target type, can have a different method for handling
|
||||
// dynamic vs. static dependencies, and so these are returned to the calling function.
|
||||
func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) (*javaCommonAttributes, *javaDependencyLabels) {
|
||||
var srcs bazel.LabelListAttribute
|
||||
archVariantProps := m.GetArchVariantProperties(ctx, &CommonProperties{})
|
||||
for axis, configToProps := range archVariantProps {
|
||||
@@ -2048,40 +2058,68 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
||||
protoSrcPartition: android.ProtoSrcLabelPartition,
|
||||
})
|
||||
|
||||
attrs := &javaLibraryAttributes{
|
||||
commonAttrs := &javaCommonAttributes{
|
||||
Srcs: srcPartitions[javaSrcPartition],
|
||||
}
|
||||
|
||||
if m.properties.Javacflags != nil {
|
||||
attrs.Javacopts = bazel.MakeStringListAttribute(m.properties.Javacflags)
|
||||
commonAttrs.Javacopts = bazel.MakeStringListAttribute(m.properties.Javacflags)
|
||||
}
|
||||
|
||||
depLabels := &javaDependencyLabels{}
|
||||
|
||||
var deps bazel.LabelList
|
||||
sdkVersion := m.SdkVersion(ctx)
|
||||
if sdkVersion.Kind == android.SdkPublic && sdkVersion.ApiLevel == android.FutureApiLevel {
|
||||
// TODO(b/220869005) remove forced dependency on current public android.jar
|
||||
deps.Add(&bazel.Label{Label: "//prebuilts/sdk:public_current_android_sdk_java_import"})
|
||||
}
|
||||
if m.properties.Libs != nil {
|
||||
deps.Append(android.BazelLabelForModuleDeps(ctx, m.properties.Libs))
|
||||
}
|
||||
|
||||
var staticDeps bazel.LabelList
|
||||
if m.properties.Static_libs != nil {
|
||||
//TODO(b/217236083) handle static libs similarly to Soong
|
||||
deps.Append(android.BazelLabelForModuleDeps(ctx, m.properties.Static_libs))
|
||||
staticDeps.Append(android.BazelLabelForModuleDeps(ctx, m.properties.Static_libs))
|
||||
}
|
||||
|
||||
protoDeps := bp2buildProto(ctx, &m.Module, srcPartitions[protoSrcPartition])
|
||||
if protoDeps != nil {
|
||||
deps.Add(protoDeps)
|
||||
}
|
||||
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
|
||||
// listed directly in the srcs of a java_library, and the classes produced
|
||||
// by protoc are included directly in the resulting JAR. Thus upstream dependencies
|
||||
// that depend on a java_library with proto sources can link directly to the protobuf API,
|
||||
// and so this should be a static dependency.
|
||||
staticDeps.Add(protoDepLabel)
|
||||
|
||||
attrs.Deps = bazel.MakeLabelListAttribute(deps)
|
||||
depLabels.Deps = bazel.MakeLabelListAttribute(deps)
|
||||
depLabels.StaticDeps = bazel.MakeLabelListAttribute(staticDeps)
|
||||
|
||||
return attrs
|
||||
return commonAttrs, depLabels
|
||||
}
|
||||
|
||||
type javaLibraryAttributes struct {
|
||||
*javaCommonAttributes
|
||||
Deps bazel.LabelListAttribute
|
||||
Exports bazel.LabelListAttribute
|
||||
}
|
||||
|
||||
func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) {
|
||||
attrs := m.convertLibraryAttrsBp2Build(ctx)
|
||||
commonAttrs, depLabels := m.convertLibraryAttrsBp2Build(ctx)
|
||||
|
||||
deps := depLabels.Deps
|
||||
if !commonAttrs.Srcs.IsEmpty() {
|
||||
deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
|
||||
|
||||
sdkVersion := m.SdkVersion(ctx)
|
||||
if sdkVersion.Kind == android.SdkPublic && sdkVersion.ApiLevel == android.FutureApiLevel {
|
||||
// TODO(b/220869005) remove forced dependency on current public android.jar
|
||||
deps.Add(bazel.MakeLabelAttribute("//prebuilts/sdk:public_current_android_sdk_java_import"))
|
||||
}
|
||||
} else if !depLabels.Deps.IsEmpty() {
|
||||
ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
|
||||
}
|
||||
|
||||
attrs := &javaLibraryAttributes{
|
||||
javaCommonAttributes: commonAttrs,
|
||||
Deps: deps,
|
||||
Exports: depLabels.StaticDeps,
|
||||
}
|
||||
|
||||
props := bazel.BazelTargetModuleProperties{
|
||||
Rule_class: "java_library",
|
||||
@@ -2092,15 +2130,30 @@ func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) {
|
||||
}
|
||||
|
||||
type javaBinaryHostAttributes struct {
|
||||
Srcs bazel.LabelListAttribute
|
||||
Deps bazel.LabelListAttribute
|
||||
Main_class string
|
||||
Jvm_flags bazel.StringListAttribute
|
||||
Javacopts bazel.StringListAttribute
|
||||
*javaCommonAttributes
|
||||
Deps bazel.LabelListAttribute
|
||||
Runtime_deps bazel.LabelListAttribute
|
||||
Main_class string
|
||||
Jvm_flags bazel.StringListAttribute
|
||||
}
|
||||
|
||||
// JavaBinaryHostBp2Build is for java_binary_host bp2build.
|
||||
func javaBinaryHostBp2Build(ctx android.TopDownMutatorContext, m *Binary) {
|
||||
commonAttrs, depLabels := m.convertLibraryAttrsBp2Build(ctx)
|
||||
|
||||
deps := depLabels.Deps
|
||||
deps.Append(depLabels.StaticDeps)
|
||||
if m.binaryProperties.Jni_libs != nil {
|
||||
deps.Append(bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, m.binaryProperties.Jni_libs)))
|
||||
}
|
||||
|
||||
var runtimeDeps bazel.LabelListAttribute
|
||||
if commonAttrs.Srcs.IsEmpty() {
|
||||
// if there are no sources, then the dependencies can only be used at runtime
|
||||
runtimeDeps = deps
|
||||
deps = bazel.LabelListAttribute{}
|
||||
}
|
||||
|
||||
mainClass := ""
|
||||
if m.binaryProperties.Main_class != nil {
|
||||
mainClass = *m.binaryProperties.Main_class
|
||||
@@ -2112,26 +2165,12 @@ func javaBinaryHostBp2Build(ctx android.TopDownMutatorContext, m *Binary) {
|
||||
}
|
||||
mainClass = mainClassInManifest
|
||||
}
|
||||
srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.properties.Srcs, m.properties.Exclude_srcs))
|
||||
|
||||
attrs := &javaBinaryHostAttributes{
|
||||
Srcs: srcs,
|
||||
Main_class: mainClass,
|
||||
}
|
||||
|
||||
if m.properties.Javacflags != nil {
|
||||
attrs.Javacopts = bazel.MakeStringListAttribute(m.properties.Javacflags)
|
||||
}
|
||||
|
||||
// Attribute deps
|
||||
deps := []string{}
|
||||
if m.properties.Static_libs != nil {
|
||||
deps = append(deps, m.properties.Static_libs...)
|
||||
}
|
||||
if m.binaryProperties.Jni_libs != nil {
|
||||
deps = append(deps, m.binaryProperties.Jni_libs...)
|
||||
}
|
||||
if len(deps) > 0 {
|
||||
attrs.Deps = bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, deps))
|
||||
javaCommonAttributes: commonAttrs,
|
||||
Deps: deps,
|
||||
Runtime_deps: runtimeDeps,
|
||||
Main_class: mainClass,
|
||||
}
|
||||
|
||||
// Attribute jvm_flags
|
||||
|
Reference in New Issue
Block a user