Sort api files by api scope in java_api_library
Recent changes in metalava (aosp/2704325) enforces api files passed as inputs to generate stubs from txt to be sorted in the order from the narrower api scope to the wider api scope. In order to comply with this change, all api files passed as inputs to metalava invocations need to be sorted in the respective order. Test: m out/soong/.intermediates/packages/modules/IPsec/tests/cts/CtsIkeTestCases/android_common/e10894d3da5db41239526c9048962355/javac/CtsIkeTestCases.jar --build-from-text-stub --skip-soong-tests (Failing module from incorrect class hierarchy when building from text stub) Bug: 295429988 Change-Id: I1eb1f4bf8fa34fd7dc8a0e4c04aa056258a975c5
This commit is contained in:
24
java/java.go
24
java/java.go
@@ -1812,6 +1812,28 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||
}
|
||||
}
|
||||
|
||||
func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFiles android.Paths) android.Paths {
|
||||
sortedSrcFiles := android.Paths{}
|
||||
|
||||
// API signature file name sorted from
|
||||
// the narrowest api scope to the widest api scope
|
||||
scopeOrderedSourceFileNames := allApiScopes.Strings(
|
||||
func(s *apiScope) string { return s.apiFilePrefix + "current.txt" })
|
||||
|
||||
for _, scopeSourceFileName := range scopeOrderedSourceFileNames {
|
||||
for _, sourceFileName := range srcFiles {
|
||||
if sourceFileName.Base() == scopeSourceFileName {
|
||||
sortedSrcFiles = append(sortedSrcFiles, sourceFileName)
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(srcFiles) != len(sortedSrcFiles) {
|
||||
ctx.ModuleErrorf("Unrecognizable source file found within %s", srcFiles)
|
||||
}
|
||||
|
||||
return sortedSrcFiles
|
||||
}
|
||||
|
||||
func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
|
||||
rule := android.NewRuleBuilder(pctx, ctx)
|
||||
@@ -1862,6 +1884,8 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
ctx.ModuleErrorf("Error: %s has an empty api file.", ctx.ModuleName())
|
||||
}
|
||||
|
||||
srcFiles = al.sortApiFilesByApiScope(ctx, srcFiles)
|
||||
|
||||
cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir)
|
||||
|
||||
al.stubsFlags(ctx, cmd, stubsDir)
|
||||
|
@@ -1864,12 +1864,12 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
ctx, _ := testJavaWithFS(t, `
|
||||
@@ -1897,11 +1897,11 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
moduleName: "bar1",
|
||||
sourceTextFileDirs: []string{"a/foo1.txt"},
|
||||
sourceTextFileDirs: []string{"a/current.txt"},
|
||||
},
|
||||
{
|
||||
moduleName: "bar2",
|
||||
sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt", "api1/current.txt", "api2/current.txt"},
|
||||
sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "api1/current.txt", "api2/current.txt"},
|
||||
},
|
||||
}
|
||||
for _, c := range testcases {
|
||||
@@ -1918,25 +1918,25 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `
|
||||
java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_c := `
|
||||
java_api_contribution {
|
||||
name: "foo3",
|
||||
api_file: "foo3.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_d := `
|
||||
java_api_contribution {
|
||||
name: "foo4",
|
||||
api_file: "foo4.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
ctx, _ := testJavaWithFS(t, `
|
||||
@@ -1985,15 +1985,15 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
moduleName: "bar1",
|
||||
sourceTextFileDirs: []string{"a/foo1.txt"},
|
||||
sourceTextFileDirs: []string{"a/current.txt"},
|
||||
},
|
||||
{
|
||||
moduleName: "bar2",
|
||||
sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt"},
|
||||
sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
|
||||
},
|
||||
{
|
||||
moduleName: "bar3",
|
||||
sourceTextFileDirs: []string{"c/foo3.txt", "a/foo1.txt", "b/foo2.txt", "d/foo4.txt", "api1/current.txt", "api2/current.txt"},
|
||||
sourceTextFileDirs: []string{"c/current.txt", "a/current.txt", "b/current.txt", "d/current.txt", "api1/current.txt", "api2/current.txt"},
|
||||
},
|
||||
}
|
||||
for _, c := range testcases {
|
||||
@@ -2010,13 +2010,13 @@ func TestJavaApiLibraryJarGeneration(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `
|
||||
java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
ctx, _ := testJavaWithFS(t, `
|
||||
@@ -2063,13 +2063,13 @@ func TestJavaApiLibraryLibsLink(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `
|
||||
java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
lib_bp_a := `
|
||||
@@ -2138,13 +2138,13 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `
|
||||
java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
lib_bp_a := `
|
||||
@@ -2212,13 +2212,13 @@ func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) {
|
||||
provider_bp_a := `
|
||||
java_api_contribution {
|
||||
name: "foo1",
|
||||
api_file: "foo1.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
provider_bp_b := `
|
||||
java_api_contribution {
|
||||
name: "foo2",
|
||||
api_file: "foo2.txt",
|
||||
api_file: "current.txt",
|
||||
}
|
||||
`
|
||||
lib_bp_a := `
|
||||
|
Reference in New Issue
Block a user