diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 94 | 
1 files changed, 68 insertions, 26 deletions
| diff --git a/java/java.go b/java/java.go index 5f59fe401..521aef301 100644 --- a/java/java.go +++ b/java/java.go @@ -21,6 +21,7 @@ package java  import (  	"fmt"  	"path/filepath" +	"sort"  	"strings"  	"android/soong/bazel" @@ -698,6 +699,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {  	}  	j.checkSdkVersions(ctx) +	j.checkHeadersOnly(ctx)  	if ctx.Device() {  		j.dexpreopter.installPath = j.dexpreopter.getInstallPath(  			ctx, android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar")) @@ -1733,7 +1735,6 @@ func metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder,  	cmd.Flag("--color").  		Flag("--quiet"). -		Flag("--format=v2").  		Flag("--include-annotations").  		// The flag makes nullability issues as warnings rather than errors by replacing  		// @Nullable/@NonNull in the listed packages APIs with @RecentlyNullable/@RecentlyNonNull, @@ -1745,14 +1746,13 @@ func metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder,  		FlagWithArg("--hide ", "InvalidNullabilityOverride").  		FlagWithArg("--hide ", "ChangedDefault") -	// Force metalava to ignore classes on the classpath when an API file contains missing classes. -	// See b/285140653 for more information. +	// The main purpose of the `--api-class-resolution api` option is to force metalava to ignore +	// classes on the classpath when an API file contains missing classes. However, as this command +	// does not specify `--classpath` this is not needed for that. However, this is also used as a +	// signal to the special metalava code for generating stubs from text files that it needs to add +	// some additional items into the API (e.g. default constructors).  	cmd.FlagWithArg("--api-class-resolution ", "api") -	// Force metalava to sort overloaded methods by their order in the source code. -	// See b/285312164 for more information. -	cmd.FlagWithArg("--api-overloaded-method-order ", "source") -  	return cmd  } @@ -1914,7 +1914,7 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {  		FlagWithArg("-C ", stubsDir.String()).  		FlagWithArg("-D ", stubsDir.String()) -	rule.Build("metalava", "metalava merged") +	rule.Build("metalava", "metalava merged text")  	if depApiSrcsStubsJar == nil {  		var flags javaBuilderFlags @@ -2755,32 +2755,41 @@ func addCLCFromDep(ctx android.ModuleContext, depModule android.Module,  type javaResourcesAttributes struct {  	Resources             bazel.LabelListAttribute  	Resource_strip_prefix *string +	Additional_resources  bazel.LabelListAttribute  } -func (m *Library) javaResourcesGetSingleFilegroupStripPrefix(ctx android.TopDownMutatorContext) (string, bool) { -	if otherM, ok := ctx.ModuleFromName(m.properties.Java_resources[0]); ok && len(m.properties.Java_resources) == 1 { +func (m *Library) getResourceFilegroupStripPrefix(ctx android.TopDownMutatorContext, resourceFilegroup string) (*string, bool) { +	if otherM, ok := ctx.ModuleFromName(resourceFilegroup); ok {  		if fg, isFilegroup := otherM.(android.FileGroupPath); isFilegroup { -			return filepath.Join(ctx.OtherModuleDir(otherM), fg.GetPath(ctx)), true +			return proptools.StringPtr(filepath.Join(ctx.OtherModuleDir(otherM), fg.GetPath(ctx))), true  		}  	} -	return "", false +	return proptools.StringPtr(""), false  }  func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorContext) *javaResourcesAttributes {  	var resources bazel.LabelList  	var resourceStripPrefix *string -	if m.properties.Java_resources != nil && len(m.properties.Java_resource_dirs) > 0 { -		ctx.ModuleErrorf("bp2build doesn't support both java_resources and java_resource_dirs being set on the same module.") -	} +	additionalJavaResourcesMap := make(map[string]*javaResourcesAttributes)  	if m.properties.Java_resources != nil { -		if prefix, ok := m.javaResourcesGetSingleFilegroupStripPrefix(ctx); ok { -			resourceStripPrefix = proptools.StringPtr(prefix) -		} else { +		for _, res := range m.properties.Java_resources { +			if prefix, isFilegroup := m.getResourceFilegroupStripPrefix(ctx, res); isFilegroup { +				otherM, _ := ctx.ModuleFromName(res) +				resourcesTargetName := ctx.ModuleName() + "_filegroup_resources_" + otherM.Name() +				additionalJavaResourcesMap[resourcesTargetName] = &javaResourcesAttributes{ +					Resources:             bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, []string{res})), +					Resource_strip_prefix: prefix, +				} +			} else { +				resources.Append(android.BazelLabelForModuleSrc(ctx, []string{res})) +			} +		} + +		if !resources.IsEmpty() {  			resourceStripPrefix = proptools.StringPtr(ctx.ModuleDir())  		} -		resources.Append(android.BazelLabelForModuleSrc(ctx, m.properties.Java_resources))  	}  	//TODO(b/179889880) handle case where glob includes files outside package @@ -2791,23 +2800,51 @@ func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorConte  		m.properties.Exclude_java_resources,  	) -	for i, resDep := range resDeps { +	for _, resDep := range resDeps {  		dir, files := resDep.dir, resDep.files -		resources.Append(bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, files))) -  		// Bazel includes the relative path from the WORKSPACE root when placing the resource  		// inside the JAR file, so we need to remove that prefix -		resourceStripPrefix = proptools.StringPtr(dir.String()) -		if i > 0 { -			// TODO(b/226423379) allow multiple resource prefixes -			ctx.ModuleErrorf("bp2build does not support more than one directory in java_resource_dirs (b/226423379)") +		prefix := proptools.StringPtr(dir.String()) +		resourcesTargetName := ctx.ModuleName() + "_resource_dir_" + dir.String() +		additionalJavaResourcesMap[resourcesTargetName] = &javaResourcesAttributes{ +			Resources:             bazel.MakeLabelListAttribute(bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, files))), +			Resource_strip_prefix: prefix,  		}  	} +	var additionalResourceLabels bazel.LabelList +	if len(additionalJavaResourcesMap) > 0 { +		var additionalResources []string +		for resName, _ := range additionalJavaResourcesMap { +			additionalResources = append(additionalResources, resName) +		} +		sort.Strings(additionalResources) + +		for i, resName := range additionalResources { +			resAttr := additionalJavaResourcesMap[resName] +			if resourceStripPrefix == nil && i == 0 { +				resourceStripPrefix = resAttr.Resource_strip_prefix +				resources = resAttr.Resources.Value +			} else { +				ctx.CreateBazelTargetModule( +					bazel.BazelTargetModuleProperties{ +						Rule_class:        "java_resources", +						Bzl_load_location: "//build/bazel/rules/java:java_resources.bzl", +					}, +					android.CommonAttributes{Name: resName}, +					resAttr, +				) +				additionalResourceLabels.Append(android.BazelLabelForModuleSrc(ctx, []string{resName})) +			} +		} + +	} +  	return &javaResourcesAttributes{  		Resources:             bazel.MakeLabelListAttribute(resources),  		Resource_strip_prefix: resourceStripPrefix, +		Additional_resources:  bazel.MakeLabelListAttribute(additionalResourceLabels),  	}  } @@ -2866,6 +2903,11 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)  	var deps bazel.LabelListAttribute  	var staticDeps bazel.LabelListAttribute +	if proptools.String(m.deviceProperties.Sdk_version) == "" && m.DeviceSupported() { +		ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "sdk_version unset") +		return &javaCommonAttributes{}, &bp2BuildJavaInfo{}, false +	} +  	archVariantProps := m.GetArchVariantProperties(ctx, &CommonProperties{})  	for axis, configToProps := range archVariantProps {  		for config, _props := range configToProps { |