diff options
-rw-r--r-- | android/license.go | 13 | ||||
-rw-r--r-- | android/licenses.go | 26 | ||||
-rw-r--r-- | android/licenses_test.go | 196 | ||||
-rw-r--r-- | android/module.go | 7 | ||||
-rw-r--r-- | android/module_proxy.go | 4 | ||||
-rw-r--r-- | cc/builder.go | 4 | ||||
-rw-r--r-- | cc/test.go | 18 | ||||
-rw-r--r-- | java/androidmk.go | 60 | ||||
-rw-r--r-- | java/app.go | 13 | ||||
-rw-r--r-- | java/builder.go | 8 | ||||
-rw-r--r-- | java/droidstubs.go | 189 | ||||
-rw-r--r-- | java/java.go | 87 | ||||
-rw-r--r-- | java/robolectric.go | 13 | ||||
-rw-r--r-- | java/sdk_library.go | 242 | ||||
-rwxr-xr-x | python/tests/runtest.sh | 16 | ||||
-rw-r--r-- | rust/library.go | 2 | ||||
-rw-r--r-- | snapshot/snapshot_base.go | 11 | ||||
-rw-r--r-- | tradefed_modules/test_suite.go | 10 |
18 files changed, 439 insertions, 480 deletions
diff --git a/android/license.go b/android/license.go index ffda58b37..7b4aeeb5d 100644 --- a/android/license.go +++ b/android/license.go @@ -19,7 +19,6 @@ import ( ) type LicenseInfo struct { - EffectiveLicenses []string PackageName *string EffectiveLicenseText NamedPaths EffectiveLicenseKinds []string @@ -79,23 +78,23 @@ func (m *licenseModule) DepsMutator(ctx BottomUpMutatorContext) { func (m *licenseModule) GenerateAndroidBuildActions(ctx ModuleContext) { // license modules have no licenses, but license_kinds must refer to license_kind modules - mergeStringProps(&m.base().commonProperties.Effective_licenses, ctx.ModuleName()) namePathProps(&m.base().commonProperties.Effective_license_text, m.properties.Package_name, PathsForModuleSrc(ctx, m.properties.License_text)...) + var conditions []string + var kinds []string for _, module := range ctx.GetDirectDepsProxyWithTag(licenseKindTag) { if lk, ok := OtherModuleProvider(ctx, module, LicenseKindInfoProvider); ok { - mergeStringProps(&m.base().commonProperties.Effective_license_conditions, lk.Conditions...) - mergeStringProps(&m.base().commonProperties.Effective_license_kinds, ctx.OtherModuleName(module)) + conditions = append(conditions, lk.Conditions...) + kinds = append(kinds, ctx.OtherModuleName(module)) } else { ctx.ModuleErrorf("license_kinds property %q is not a license_kind module", ctx.OtherModuleName(module)) } } SetProvider(ctx, LicenseInfoProvider, LicenseInfo{ - EffectiveLicenses: m.base().commonProperties.Effective_licenses, PackageName: m.properties.Package_name, EffectiveLicenseText: m.base().commonProperties.Effective_license_text, - EffectiveLicenseKinds: m.base().commonProperties.Effective_license_kinds, - EffectiveLicenseConditions: m.base().commonProperties.Effective_license_conditions, + EffectiveLicenseKinds: SortedUniqueStrings(kinds), + EffectiveLicenseConditions: SortedUniqueStrings(conditions), }) } diff --git a/android/licenses.go b/android/licenses.go index 77f563f8c..32d12c8a2 100644 --- a/android/licenses.go +++ b/android/licenses.go @@ -227,16 +227,18 @@ func licensesPropertyFlattener(ctx ModuleContext) { } var licenses []string + var texts NamedPaths + var conditions []string + var kinds []string for _, module := range ctx.GetDirectDepsProxyWithTag(licensesTag) { if l, ok := OtherModuleProvider(ctx, module, LicenseInfoProvider); ok { licenses = append(licenses, ctx.OtherModuleName(module)) if m.base().commonProperties.Effective_package_name == nil && l.PackageName != nil { m.base().commonProperties.Effective_package_name = l.PackageName } - mergeStringProps(&m.base().commonProperties.Effective_licenses, l.EffectiveLicenses...) - mergeNamedPathProps(&m.base().commonProperties.Effective_license_text, l.EffectiveLicenseText...) - mergeStringProps(&m.base().commonProperties.Effective_license_kinds, l.EffectiveLicenseKinds...) - mergeStringProps(&m.base().commonProperties.Effective_license_conditions, l.EffectiveLicenseConditions...) + texts = append(texts, l.EffectiveLicenseText...) + kinds = append(kinds, l.EffectiveLicenseKinds...) + conditions = append(conditions, l.EffectiveLicenseConditions...) } else { propertyName := "licenses" primaryProperty := m.base().primaryLicensesProperty @@ -247,6 +249,10 @@ func licensesPropertyFlattener(ctx ModuleContext) { } } + m.base().commonProperties.Effective_license_text = SortedUniqueNamedPaths(texts) + m.base().commonProperties.Effective_license_kinds = SortedUniqueStrings(kinds) + m.base().commonProperties.Effective_license_conditions = SortedUniqueStrings(conditions) + // Make the license information available for other modules. licenseInfo := LicensesInfo{ Licenses: licenses, @@ -254,12 +260,6 @@ func licensesPropertyFlattener(ctx ModuleContext) { SetProvider(ctx, LicensesInfoProvider, licenseInfo) } -// Update a property string array with a distinct union of its values and a list of new values. -func mergeStringProps(prop *[]string, values ...string) { - *prop = append(*prop, values...) - *prop = SortedUniqueStrings(*prop) -} - // Update a property NamedPath array with a distinct union of its values and a list of new values. func namePathProps(prop *NamedPaths, name *string, values ...Path) { if name == nil { @@ -274,12 +274,6 @@ func namePathProps(prop *NamedPaths, name *string, values ...Path) { *prop = SortedUniqueNamedPaths(*prop) } -// Update a property NamedPath array with a distinct union of its values and a list of new values. -func mergeNamedPathProps(prop *NamedPaths, values ...NamedPath) { - *prop = append(*prop, values...) - *prop = SortedUniqueNamedPaths(*prop) -} - // Get the licenses property falling back to the package default. func getLicenses(ctx BaseModuleContext, module Module) []string { if exemptFromRequiredApplicableLicensesProperty(module) { diff --git a/android/licenses_test.go b/android/licenses_test.go index 8a81e1294..0c371e8e9 100644 --- a/android/licenses_test.go +++ b/android/licenses_test.go @@ -7,15 +7,13 @@ import ( ) var licensesTests = []struct { - name string - fs MockFS - expectedErrors []string - effectiveLicenses map[string][]string - effectiveInheritedLicenses map[string][]string - effectivePackage map[string]string - effectiveNotices map[string][]string - effectiveKinds map[string][]string - effectiveConditions map[string][]string + name string + fs MockFS + expectedErrors []string + effectivePackage map[string]string + effectiveNotices map[string][]string + effectiveKinds map[string][]string + effectiveConditions map[string][]string }{ { name: "invalid module type without licenses property", @@ -69,11 +67,6 @@ var licensesTests = []struct { licenses: ["top_Apache2"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample1": []string{"top_Apache2"}, - "libnested": []string{"top_Apache2"}, - "libother": []string{"top_Apache2"}, - }, effectiveKinds: map[string][]string{ "libexample1": []string{"notice"}, "libnested": []string{"notice"}, @@ -146,18 +139,6 @@ var licensesTests = []struct { deps: ["libexample"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample": []string{"nested_other", "top_other"}, - "libsamepackage": []string{}, - "libnested": []string{}, - "libother": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "libexample": []string{"nested_other", "top_other"}, - "libsamepackage": []string{"nested_other", "top_other"}, - "libnested": []string{"nested_other", "top_other"}, - "libother": []string{"nested_other", "top_other"}, - }, effectiveKinds: map[string][]string{ "libexample": []string{"nested_notice", "top_notice"}, "libsamepackage": []string{}, @@ -217,20 +198,6 @@ var licensesTests = []struct { deps: ["libexample"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample": []string{"other", "top_nested"}, - "libsamepackage": []string{}, - "libnested": []string{}, - "libother": []string{}, - "liboutsider": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "libexample": []string{"other", "top_nested"}, - "libsamepackage": []string{"other", "top_nested"}, - "libnested": []string{"other", "top_nested"}, - "libother": []string{"other", "top_nested"}, - "liboutsider": []string{"other", "top_nested"}, - }, effectiveKinds: map[string][]string{ "libexample": []string{}, "libsamepackage": []string{}, @@ -284,14 +251,6 @@ var licensesTests = []struct { defaults: ["top_defaults"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample": []string{"by_exception_only"}, - "libdefaults": []string{"notice"}, - }, - effectiveInheritedLicenses: map[string][]string{ - "libexample": []string{"by_exception_only"}, - "libdefaults": []string{"notice"}, - }, }, // Package default_applicable_licenses tests @@ -326,14 +285,6 @@ var licensesTests = []struct { deps: ["libexample"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample": []string{"top_notice"}, - "liboutsider": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "libexample": []string{"top_notice"}, - "liboutsider": []string{"top_notice"}, - }, }, { name: "package default_applicable_licenses not inherited to subpackages", @@ -369,18 +320,6 @@ var licensesTests = []struct { deps: ["libexample", "libother", "libnested"], }`), }, - effectiveLicenses: map[string][]string{ - "libexample": []string{"top_notice"}, - "libnested": []string{"outsider"}, - "libother": []string{}, - "liboutsider": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "libexample": []string{"top_notice"}, - "libnested": []string{"outsider"}, - "libother": []string{}, - "liboutsider": []string{"top_notice", "outsider"}, - }, }, { name: "verify that prebuilt dependencies are included", @@ -409,12 +348,6 @@ var licensesTests = []struct { deps: [":module"], }`), }, - effectiveLicenses: map[string][]string{ - "other": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "other": []string{"prebuilt", "top_sources"}, - }, }, { name: "verify that prebuilt dependencies are ignored for licenses reasons (preferred)", @@ -444,13 +377,6 @@ var licensesTests = []struct { deps: [":module"], }`), }, - effectiveLicenses: map[string][]string{ - "other": []string{}, - }, - effectiveInheritedLicenses: map[string][]string{ - "module": []string{"prebuilt", "top_sources"}, - "other": []string{"prebuilt", "top_sources"}, - }, }, } @@ -470,10 +396,6 @@ func TestLicenses(t *testing.T) { ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). RunTest(t) - if test.effectiveLicenses != nil { - checkEffectiveLicenses(t, result, test.effectiveLicenses) - } - if test.effectivePackage != nil { checkEffectivePackage(t, result, test.effectivePackage) } @@ -489,114 +411,10 @@ func TestLicenses(t *testing.T) { if test.effectiveConditions != nil { checkEffectiveConditions(t, result, test.effectiveConditions) } - - if test.effectiveInheritedLicenses != nil { - checkEffectiveInheritedLicenses(t, result, test.effectiveInheritedLicenses) - } }) } } -func checkEffectiveLicenses(t *testing.T, result *TestResult, effectiveLicenses map[string][]string) { - actualLicenses := make(map[string][]string) - result.Context.Context.VisitAllModules(func(m blueprint.Module) { - if _, ok := m.(*licenseModule); ok { - return - } - if _, ok := m.(*licenseKindModule); ok { - return - } - if _, ok := m.(*packageModule); ok { - return - } - module, ok := m.(Module) - if !ok { - t.Errorf("%q not a module", m.Name()) - return - } - base := module.base() - if base == nil { - return - } - actualLicenses[m.Name()] = base.commonProperties.Effective_licenses - }) - - for moduleName, expectedLicenses := range effectiveLicenses { - licenses, ok := actualLicenses[moduleName] - if !ok { - licenses = []string{} - } - if !compareUnorderedStringArrays(expectedLicenses, licenses) { - t.Errorf("effective licenses mismatch for module %q: expected %q, found %q", moduleName, expectedLicenses, licenses) - } - } -} - -func checkEffectiveInheritedLicenses(t *testing.T, result *TestResult, effectiveInheritedLicenses map[string][]string) { - actualLicenses := make(map[string][]string) - result.Context.Context.VisitAllModules(func(m blueprint.Module) { - if _, ok := m.(*licenseModule); ok { - return - } - if _, ok := m.(*licenseKindModule); ok { - return - } - if _, ok := m.(*packageModule); ok { - return - } - module, ok := m.(Module) - if !ok { - t.Errorf("%q not a module", m.Name()) - return - } - base := module.base() - if base == nil { - return - } - inherited := make(map[string]bool) - for _, l := range base.commonProperties.Effective_licenses { - inherited[l] = true - } - result.Context.Context.VisitDepsDepthFirst(m, func(c blueprint.Module) { - if _, ok := c.(*licenseModule); ok { - return - } - if _, ok := c.(*licenseKindModule); ok { - return - } - if _, ok := c.(*packageModule); ok { - return - } - cmodule, ok := c.(Module) - if !ok { - t.Errorf("%q not a module", c.Name()) - return - } - cbase := cmodule.base() - if cbase == nil { - return - } - for _, l := range cbase.commonProperties.Effective_licenses { - inherited[l] = true - } - }) - actualLicenses[m.Name()] = []string{} - for l := range inherited { - actualLicenses[m.Name()] = append(actualLicenses[m.Name()], l) - } - }) - - for moduleName, expectedInheritedLicenses := range effectiveInheritedLicenses { - licenses, ok := actualLicenses[moduleName] - if !ok { - licenses = []string{} - } - if !compareUnorderedStringArrays(expectedInheritedLicenses, licenses) { - t.Errorf("effective inherited licenses mismatch for module %q: expected %q, found %q", moduleName, expectedInheritedLicenses, licenses) - } - } -} - func checkEffectivePackage(t *testing.T, result *TestResult, effectivePackage map[string]string) { actualPackage := make(map[string]string) result.Context.Context.VisitAllModules(func(m blueprint.Module) { diff --git a/android/module.go b/android/module.go index 788c21b59..39a165463 100644 --- a/android/module.go +++ b/android/module.go @@ -94,7 +94,6 @@ type Module interface { ReplacedByPrebuilt() IsReplacedByPrebuilt() bool ExportedToMake() bool - EffectiveLicenseKinds() []string EffectiveLicenseFiles() Paths AddProperties(props ...interface{}) @@ -317,8 +316,6 @@ type commonProperties struct { // Describes the licenses applicable to this module. Must reference license modules. Licenses []string - // Flattened from direct license dependencies. Equal to Licenses unless particular module adds more. - Effective_licenses []string `blueprint:"mutated"` // Override of module name when reporting licenses Effective_package_name *string `blueprint:"mutated"` // Notice files @@ -1467,10 +1464,6 @@ func (m *ModuleBase) ExportedToMake() bool { return m.commonProperties.NamespaceExportedToMake } -func (m *ModuleBase) EffectiveLicenseKinds() []string { - return m.commonProperties.Effective_license_kinds -} - func (m *ModuleBase) EffectiveLicenseFiles() Paths { result := make(Paths, 0, len(m.commonProperties.Effective_license_text)) for _, p := range m.commonProperties.Effective_license_text { diff --git a/android/module_proxy.go b/android/module_proxy.go index afca0d72b..77abc11e6 100644 --- a/android/module_proxy.go +++ b/android/module_proxy.go @@ -164,10 +164,6 @@ func (m ModuleProxy) ExportedToMake() bool { panic("method is not implemented on ModuleProxy") } -func (m ModuleProxy) EffectiveLicenseKinds() []string { - panic("method is not implemented on ModuleProxy") -} - func (m ModuleProxy) EffectiveLicenseFiles() Paths { panic("method is not implemented on ModuleProxy") } diff --git a/cc/builder.go b/cc/builder.go index 532511628..27c847f78 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -852,7 +852,7 @@ func genRustStaticlibSrcFile(crateNames []string) string { } func BuildRustStubs(ctx android.ModuleContext, outputFile android.ModuleOutPath, - crtBegin, crtEnd android.Paths, stubObjs Objects, ccFlags Flags) { + stubObjs Objects, ccFlags Flags) { // Instantiate paths sharedLibs := android.Paths{} @@ -862,6 +862,8 @@ func BuildRustStubs(ctx android.ModuleContext, outputFile android.ModuleOutPath, deps := android.Paths{} implicitOutputs := android.WritablePaths{} validations := android.Paths{} + crtBegin := android.Paths{} + crtEnd := android.Paths{} groupLate := false builderFlags := flagsToBuilderFlags(ccFlags) diff --git a/cc/test.go b/cc/test.go index 9a339def1..dad4afa47 100644 --- a/cc/test.go +++ b/cc/test.go @@ -397,20 +397,24 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) { test.Properties.Test_options.Unit_test = proptools.BoolPtr(true) } - if ctx.PrimaryArch() && !ctx.Config().KatiEnabled() { // TODO(spandandas): Remove the special case for kati + if !ctx.Config().KatiEnabled() { // TODO(spandandas): Remove the special case for kati // Install the test config in testcases/ directory for atest. - // Use PrimaryArch and SubName to prevent duplicate installation rules c, ok := ctx.Module().(*Module) if !ok { ctx.ModuleErrorf("Not a cc_test module") } + // Install configs in the root of $PRODUCT_OUT/testcases/$module testCases := android.PathForModuleInPartitionInstall(ctx, "testcases", ctx.ModuleName()+c.SubName()) - if test.testConfig != nil { - ctx.InstallFile(testCases, test.testConfig.Base(), test.testConfig) - } - for _, extraTestConfig := range test.extraTestConfigs { - ctx.InstallFile(testCases, extraTestConfig.Base(), extraTestConfig) + if ctx.PrimaryArch() { + if test.testConfig != nil { + ctx.InstallFile(testCases, ctx.ModuleName()+".config", test.testConfig) + } + for _, extraTestConfig := range test.extraTestConfigs { + ctx.InstallFile(testCases, extraTestConfig.Base(), extraTestConfig) + } } + // Install tests and data in arch specific subdir $PRODUCT_OUT/testcases/$module/$arch + testCases = testCases.Join(ctx, ctx.Target().Arch.ArchType.String()) ctx.InstallTestData(testCases, test.data) ctx.InstallFile(testCases, file.Base(), file) } diff --git a/java/androidmk.go b/java/androidmk.go index e0a86b597..fe3c7a217 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -554,73 +554,13 @@ func (dstubs *Droidstubs) AndroidMkEntries() []android.AndroidMkEntries { }, ExtraFooters: []android.AndroidMkExtraFootersFunc{ func(w io.Writer, name, prefix, moduleDir string) { - if dstubs.apiFile != nil { - fmt.Fprintf(w, ".PHONY: %s %s.txt\n", dstubs.Name(), dstubs.Name()) - fmt.Fprintf(w, "%s %s.txt: %s\n", dstubs.Name(), dstubs.Name(), dstubs.apiFile) - } - if dstubs.removedApiFile != nil { - fmt.Fprintf(w, ".PHONY: %s %s.txt\n", dstubs.Name(), dstubs.Name()) - fmt.Fprintf(w, "%s %s.txt: %s\n", dstubs.Name(), dstubs.Name(), dstubs.removedApiFile) - } - if dstubs.checkCurrentApiTimestamp != nil { - fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-check-current-api") - fmt.Fprintln(w, dstubs.Name()+"-check-current-api:", - dstubs.checkCurrentApiTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: checkapi") - fmt.Fprintln(w, "checkapi:", - dstubs.checkCurrentApiTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: droidcore") - fmt.Fprintln(w, "droidcore: checkapi") - } - if dstubs.updateCurrentApiTimestamp != nil { - fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-update-current-api") - fmt.Fprintln(w, dstubs.Name()+"-update-current-api:", - dstubs.updateCurrentApiTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: update-api") - fmt.Fprintln(w, "update-api:", - dstubs.updateCurrentApiTimestamp.String()) - } - if dstubs.checkLastReleasedApiTimestamp != nil { - fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-check-last-released-api") - fmt.Fprintln(w, dstubs.Name()+"-check-last-released-api:", - dstubs.checkLastReleasedApiTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: checkapi") - fmt.Fprintln(w, "checkapi:", - dstubs.checkLastReleasedApiTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: droidcore") - fmt.Fprintln(w, "droidcore: checkapi") - } if dstubs.apiLintTimestamp != nil { - fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-api-lint") - fmt.Fprintln(w, dstubs.Name()+"-api-lint:", - dstubs.apiLintTimestamp.String()) - - fmt.Fprintln(w, ".PHONY: checkapi") - fmt.Fprintln(w, "checkapi:", - dstubs.Name()+"-api-lint") - - fmt.Fprintln(w, ".PHONY: droidcore") - fmt.Fprintln(w, "droidcore: checkapi") - if dstubs.apiLintReport != nil { fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", dstubs.Name()+"-api-lint", dstubs.apiLintReport.String(), "apilint/"+dstubs.Name()+"-lint-report.txt") fmt.Fprintf(w, "$(call declare-0p-target,%s)\n", dstubs.apiLintReport.String()) } } - if dstubs.checkNullabilityWarningsTimestamp != nil { - fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-check-nullability-warnings") - fmt.Fprintln(w, dstubs.Name()+"-check-nullability-warnings:", - dstubs.checkNullabilityWarningsTimestamp.String()) - - fmt.Fprintln(w, ".PHONY:", "droidcore") - fmt.Fprintln(w, "droidcore: ", dstubs.Name()+"-check-nullability-warnings") - } }, }, }} diff --git a/java/app.go b/java/app.go index 17c7b22b2..da7eb02ec 100644 --- a/java/app.go +++ b/java/app.go @@ -1616,6 +1616,19 @@ func (a *AndroidTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.data = append(a.data, android.PathsForModuleSrc(ctx, a.testProperties.Device_first_data)...) a.data = append(a.data, android.PathsForModuleSrc(ctx, a.testProperties.Device_first_prefer32_data)...) + // Install test deps + if !ctx.Config().KatiEnabled() { + pathInTestCases := android.PathForModuleInstall(ctx, ctx.Module().Name()) + if a.testConfig != nil { + ctx.InstallFile(pathInTestCases, ctx.Module().Name()+".config", a.testConfig) + } + testDeps := append(a.data, a.extraTestConfigs...) + for _, data := range android.SortedUniquePaths(testDeps) { + dataPath := android.DataPath{SrcPath: data} + ctx.InstallTestData(pathInTestCases, []android.DataPath{dataPath}) + } + } + android.SetProvider(ctx, tradefed.BaseTestProviderKey, tradefed.BaseTestProviderData{ TestcaseRelDataFiles: testcaseRel(a.data), OutputFile: a.OutputFile(), diff --git a/java/builder.go b/java/builder.go index f1d5e9944..22dad103b 100644 --- a/java/builder.go +++ b/java/builder.go @@ -750,9 +750,9 @@ func TransformJarToR8Rules(ctx android.ModuleContext, outputFile android.Writabl jar android.Path) { ctx.Build(pctx, android.BuildParams{ - Rule: extractR8Rules, - Output: outputFile, - Input: jar, + Rule: extractR8Rules, + Output: outputFile, + Input: jar, }) } @@ -796,7 +796,7 @@ func TransformJarJarWithShards(ctx android.ModuleContext, outputFile android.Wri totalStr := strconv.Itoa(totalShards) for i := 0; i < totalShards; i++ { iStr := strconv.Itoa(i) - tempOut := android.PathForOutput(ctx, outputFile.String()+"-"+iStr+".jar") + tempOut := outputFile.ReplaceExtension(ctx, "-"+iStr+".jar") ctx.Build(pctx, android.BuildParams{ Rule: jarjar, Description: "jarjar (" + iStr + "/" + totalStr + ")", diff --git a/java/droidstubs.go b/java/droidstubs.go index e0c2e637c..22f4d981d 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -28,18 +28,28 @@ import ( "android/soong/remoteexec" ) -type StubsArtifactsInfo struct { - ApiVersionsXml android.WritablePath +type StubsInfo struct { + ApiVersionsXml android.Path + AnnotationsZip android.Path + ApiFile android.Path + RemovedApiFile android.Path } type DroidStubsInfo struct { CurrentApiTimestamp android.Path - EverythingArtifacts StubsArtifactsInfo - ExportableArtifacts StubsArtifactsInfo + EverythingStubsInfo StubsInfo + ExportableStubsInfo StubsInfo } var DroidStubsInfoProvider = blueprint.NewProvider[DroidStubsInfo]() +type StubsSrcInfo struct { + EverythingStubsSrcJar android.Path + ExportableStubsSrcJar android.Path +} + +var StubsSrcInfoProvider = blueprint.NewProvider[StubsSrcInfo]() + // The values allowed for Droidstubs' Api_levels_sdk_type var allowedApiLevelSdkTypes = []string{"public", "system", "module-lib", "system-server"} @@ -541,9 +551,9 @@ func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *a ctx.VisitDirectDepsProxyWithTag(metalavaAPILevelsModuleTag, func(m android.ModuleProxy) { if s, ok := android.OtherModuleProvider(ctx, m, DroidStubsInfoProvider); ok { if stubsType == Everything { - apiVersions = s.EverythingArtifacts.ApiVersionsXml + apiVersions = s.EverythingStubsInfo.ApiVersionsXml } else if stubsType == Exportable { - apiVersions = s.ExportableArtifacts.ApiVersionsXml + apiVersions = s.ExportableStubsInfo.ApiVersionsXml } else { ctx.ModuleErrorf("%s stubs type does not generate api-versions.xml file", stubsType.String()) } @@ -710,7 +720,8 @@ func metalavaUseRbe(ctx android.ModuleContext) bool { } func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths, - srcJarList android.Path, homeDir android.WritablePath, params stubsCommandConfigParams, configFiles android.Paths) *android.RuleBuilderCommand { + srcJarList android.Path, homeDir android.WritablePath, params stubsCommandConfigParams, + configFiles android.Paths, apiSurface *string) *android.RuleBuilderCommand { rule.Command().Text("rm -rf").Flag(homeDir.String()) rule.Command().Text("mkdir -p").Flag(homeDir.String()) @@ -756,6 +767,8 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs andr addMetalavaConfigFilesToCmd(cmd, configFiles) + addOptionalApiSurfaceToCmd(cmd, apiSurface) + return cmd } @@ -774,6 +787,14 @@ func addMetalavaConfigFilesToCmd(cmd *android.RuleBuilderCommand, configFiles an cmd.FlagForEachInput("--config-file ", configFiles) } +// addOptionalApiSurfaceToCmd adds --api-surface option is apiSurface is not `nil`. +func addOptionalApiSurfaceToCmd(cmd *android.RuleBuilderCommand, apiSurface *string) { + if apiSurface != nil { + cmd.Flag("--api-surface") + cmd.Flag(*apiSurface) + } +} + // Pass flagged apis related flags to metalava. When aconfig_declarations property is not // defined for a module, simply revert all flagged apis annotations. If aconfig_declarations // property is defined, apply transformations and only revert the flagged apis that are not @@ -848,7 +869,8 @@ func (d *Droidstubs) commonMetalavaStubCmd(ctx android.ModuleContext, rule *andr configFiles := android.PathsForModuleSrc(ctx, d.properties.ConfigFiles) - cmd := metalavaCmd(ctx, rule, d.Javadoc.srcFiles, srcJarList, homeDir, params.stubConfig, configFiles) + cmd := metalavaCmd(ctx, rule, d.Javadoc.srcFiles, srcJarList, homeDir, params.stubConfig, + configFiles, d.properties.Api_surface) cmd.Implicits(d.Javadoc.implicits) d.stubsFlags(ctx, cmd, params.stubsDir, params.stubConfig.stubsType, params.stubConfig.checkApi) @@ -1187,6 +1209,34 @@ func (d *Droidstubs) optionalStubCmd(ctx android.ModuleContext, params stubsComm rule.Build(fmt.Sprintf("metalava_%s", params.stubConfig.stubsType.String()), "metalava merged") } +func (d *Droidstubs) setPhonyRules(ctx android.ModuleContext) { + if d.apiFile != nil { + ctx.Phony(d.Name(), d.apiFile) + ctx.Phony(fmt.Sprintf("%s.txt", d.Name()), d.apiFile) + } + if d.removedApiFile != nil { + ctx.Phony(d.Name(), d.removedApiFile) + ctx.Phony(fmt.Sprintf("%s.txt", d.Name()), d.removedApiFile) + } + if d.checkCurrentApiTimestamp != nil { + ctx.Phony(fmt.Sprintf("%s-check-current-api", d.Name()), d.checkCurrentApiTimestamp) + ctx.Phony("checkapi", d.checkCurrentApiTimestamp) + } + if d.updateCurrentApiTimestamp != nil { + ctx.Phony(fmt.Sprintf("%s-update-current-api", d.Name()), d.updateCurrentApiTimestamp) + ctx.Phony("update-api", d.updateCurrentApiTimestamp) + } + if d.checkLastReleasedApiTimestamp != nil { + ctx.Phony(fmt.Sprintf("%s-check-last-released-api", d.Name()), d.checkLastReleasedApiTimestamp) + } + if d.apiLintTimestamp != nil { + ctx.Phony(fmt.Sprintf("%s-api-lint", d.Name()), d.apiLintTimestamp) + } + if d.checkNullabilityWarningsTimestamp != nil { + ctx.Phony(fmt.Sprintf("%s-check-nullability-warnings", d.Name()), d.checkNullabilityWarningsTimestamp) + } +} + func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { deps := d.Javadoc.collectDeps(ctx) @@ -1230,6 +1280,41 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { stubCmdParams.stubsType = Exportable d.exportableStubCmd(ctx, stubCmdParams) + if String(d.properties.Check_nullability_warnings) != "" { + if d.everythingArtifacts.nullabilityWarningsFile == nil { + ctx.PropertyErrorf("check_nullability_warnings", + "Cannot specify check_nullability_warnings unless validating nullability") + } + + checkNullabilityWarningsPath := android.PathForModuleSrc(ctx, String(d.properties.Check_nullability_warnings)) + + d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, Everything.String(), "check_nullability_warnings.timestamp") + + msg := fmt.Sprintf(`\n******************************\n`+ + `The warnings encountered during nullability annotation validation did\n`+ + `not match the checked in file of expected warnings. The diffs are shown\n`+ + `above. You have two options:\n`+ + ` 1. Resolve the differences by editing the nullability annotations.\n`+ + ` 2. Update the file of expected warnings by running:\n`+ + ` cp %s %s\n`+ + ` and submitting the updated file as part of your change.`, + d.everythingArtifacts.nullabilityWarningsFile, checkNullabilityWarningsPath) + + rule := android.NewRuleBuilder(pctx, ctx) + + rule.Command(). + Text("("). + Text("diff").Input(checkNullabilityWarningsPath).Input(d.everythingArtifacts.nullabilityWarningsFile). + Text("&&"). + Text("touch").Output(d.checkNullabilityWarningsTimestamp). + Text(") || ("). + Text("echo").Flag("-e").Flag(`"` + msg + `"`). + Text("; exit 38"). + Text(")") + + rule.Build("nullabilityWarningsCheck", "nullability warnings check") + } + if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") { if len(d.Javadoc.properties.Out) > 0 { @@ -1279,13 +1364,25 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { `Note that DISABLE_STUB_VALIDATION=true does not bypass checkapi.\n`+ `******************************\n`, ctx.ModuleName()) - rule.Command(). + cmd := rule.Command(). Text("touch").Output(d.checkCurrentApiTimestamp). Text(") || ("). Text("echo").Flag("-e").Flag(`"` + msg + `"`). Text("; exit 38"). Text(")") + if d.apiLintTimestamp != nil { + cmd.Validation(d.apiLintTimestamp) + } + + if d.checkLastReleasedApiTimestamp != nil { + cmd.Validation(d.checkLastReleasedApiTimestamp) + } + + if d.checkNullabilityWarningsTimestamp != nil { + cmd.Validation(d.checkNullabilityWarningsTimestamp) + } + rule.Build("metalavaCurrentApiCheck", "check current API") d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, Everything.String(), "update_current_api.timestamp") @@ -1315,52 +1412,39 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { rule.Build("metalavaCurrentApiUpdate", "update current API") } - if String(d.properties.Check_nullability_warnings) != "" { - if d.everythingArtifacts.nullabilityWarningsFile == nil { - ctx.PropertyErrorf("check_nullability_warnings", - "Cannot specify check_nullability_warnings unless validating nullability") - } - - checkNullabilityWarnings := android.PathForModuleSrc(ctx, String(d.properties.Check_nullability_warnings)) - - d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, Everything.String(), "check_nullability_warnings.timestamp") - - msg := fmt.Sprintf(`\n******************************\n`+ - `The warnings encountered during nullability annotation validation did\n`+ - `not match the checked in file of expected warnings. The diffs are shown\n`+ - `above. You have two options:\n`+ - ` 1. Resolve the differences by editing the nullability annotations.\n`+ - ` 2. Update the file of expected warnings by running:\n`+ - ` cp %s %s\n`+ - ` and submitting the updated file as part of your change.`, - d.everythingArtifacts.nullabilityWarningsFile, checkNullabilityWarnings) - - rule := android.NewRuleBuilder(pctx, ctx) - - rule.Command(). - Text("("). - Text("diff").Input(checkNullabilityWarnings).Input(d.everythingArtifacts.nullabilityWarningsFile). - Text("&&"). - Text("touch").Output(d.checkNullabilityWarningsTimestamp). - Text(") || ("). - Text("echo").Flag("-e").Flag(`"` + msg + `"`). - Text("; exit 38"). - Text(")") - - rule.Build("nullabilityWarningsCheck", "nullability warnings check") + droidInfo := DroidStubsInfo{ + CurrentApiTimestamp: d.CurrentApiTimestamp(), + EverythingStubsInfo: StubsInfo{}, + ExportableStubsInfo: StubsInfo{}, } + setDroidInfo(ctx, d, &droidInfo.EverythingStubsInfo, Everything) + setDroidInfo(ctx, d, &droidInfo.ExportableStubsInfo, Exportable) + android.SetProvider(ctx, DroidStubsInfoProvider, droidInfo) - android.SetProvider(ctx, DroidStubsInfoProvider, DroidStubsInfo{ - CurrentApiTimestamp: d.CurrentApiTimestamp(), - EverythingArtifacts: StubsArtifactsInfo{ - ApiVersionsXml: d.everythingArtifacts.apiVersionsXml, - }, - ExportableArtifacts: StubsArtifactsInfo{ - ApiVersionsXml: d.exportableArtifacts.apiVersionsXml, - }, + android.SetProvider(ctx, StubsSrcInfoProvider, StubsSrcInfo{ + EverythingStubsSrcJar: d.stubsSrcJar, + ExportableStubsSrcJar: d.exportableStubsSrcJar, }) d.setOutputFiles(ctx) + + d.setPhonyRules(ctx) +} + +func setDroidInfo(ctx android.ModuleContext, d *Droidstubs, info *StubsInfo, typ StubsType) { + if typ == Everything { + info.ApiFile = d.apiFile + info.RemovedApiFile = d.removedApiFile + info.AnnotationsZip = d.everythingArtifacts.annotationsZip + info.ApiVersionsXml = d.everythingArtifacts.apiVersionsXml + } else if typ == Exportable { + info.ApiFile = d.exportableApiFile + info.RemovedApiFile = d.exportableRemovedApiFile + info.AnnotationsZip = d.exportableArtifacts.annotationsZip + info.ApiVersionsXml = d.exportableArtifacts.apiVersionsXml + } else { + ctx.ModuleErrorf("failed to set ApiVersionsXml, stubs type not supported: %d", typ) + } } // This method sets the outputFiles property, which is used to set the @@ -1528,6 +1612,11 @@ func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleCon p.stubsSrcJar = outPath } + android.SetProvider(ctx, StubsSrcInfoProvider, StubsSrcInfo{ + EverythingStubsSrcJar: p.stubsSrcJar, + ExportableStubsSrcJar: p.stubsSrcJar, + }) + ctx.SetOutputFiles(android.Paths{p.stubsSrcJar}, "") // prebuilt droidstubs does not output "exportable" stubs. // Output the "everything" stubs srcjar file if the tag is ".exportable". diff --git a/java/java.go b/java/java.go index 66550d562..8d10e3bd2 100644 --- a/java/java.go +++ b/java/java.go @@ -363,6 +363,8 @@ type JavaInfo struct { // output file of the module, which may be a classes jar or a dex jar OutputFile android.Path + ExtraOutputFiles android.Paths + AndroidLibraryDependencyInfo *AndroidLibraryDependencyInfo UsesLibraryDependencyInfo *UsesLibraryDependencyInfo @@ -374,6 +376,62 @@ type JavaInfo struct { ModuleWithUsesLibraryInfo *ModuleWithUsesLibraryInfo ModuleWithSdkDepInfo *ModuleWithSdkDepInfo + + // output file containing classes.dex and resources + DexJarFile OptionalDexJarPath + + // installed file for binary dependency + InstallFile android.Path + + // The path to the dex jar that is in the boot class path. If this is unset then the associated + // module is not a boot jar, but could be one of the <x>-hiddenapi modules that provide additional + // annotations for the <x> boot dex jar but which do not actually provide a boot dex jar + // themselves. + // + // This must be the path to the unencoded dex jar as the encoded dex jar indirectly depends on + // this file so using the encoded dex jar here would result in a cycle in the ninja rules. + BootDexJarPath OptionalDexJarPath + + // The compressed state of the dex file being encoded. This is used to ensure that the encoded + // dex file has the same state. + UncompressDexState *bool + + // True if the module containing this structure contributes to the hiddenapi information or has + // that information encoded within it. + Active bool + + BuiltInstalled string + + BuiltInstalledForApex []dexpreopterInstall + + // The config is used for two purposes: + // - Passing dexpreopt information about libraries from Soong to Make. This is needed when + // a <uses-library> is defined in Android.bp, but used in Android.mk (see dex_preopt_config_merger.py). + // Note that dexpreopt.config might be needed even if dexpreopt is disabled for the library itself. + // - Dexpreopt post-processing (using dexpreopt artifacts from a prebuilt system image to incrementally + // dexpreopt another partition). + ConfigPath android.WritablePath + + // The path to the profile on host that dexpreopter generates. This is used as the input for + // dex2oat. + OutputProfilePathOnHost android.Path + + LogtagsSrcs android.Paths + + ProguardDictionary android.OptionalPath + + ProguardUsageZip android.OptionalPath + + LinterReports android.Paths + + // installed file for hostdex copy + HostdexInstallFile android.InstallPath + + // Additional srcJars tacked in by GeneratedJavaLibraryModule + GeneratedSrcjars []android.Path + + // True if profile-guided optimization is actually enabled. + ProfileGuided bool } var JavaInfoProvider = blueprint.NewProvider[*JavaInfo]() @@ -1065,11 +1123,33 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { if javaInfo != nil { setExtraJavaInfo(ctx, j, javaInfo) + javaInfo.ExtraOutputFiles = j.extraOutputFiles + javaInfo.DexJarFile = j.dexJarFile + javaInfo.InstallFile = j.installFile + javaInfo.BootDexJarPath = j.bootDexJarPath + javaInfo.UncompressDexState = j.uncompressDexState + javaInfo.Active = j.active + javaInfo.BuiltInstalledForApex = j.builtInstalledForApex + javaInfo.BuiltInstalled = j.builtInstalled + javaInfo.ConfigPath = j.configPath + javaInfo.OutputProfilePathOnHost = j.outputProfilePathOnHost + javaInfo.LogtagsSrcs = j.logtagsSrcs + javaInfo.ProguardDictionary = j.proguardDictionary + javaInfo.ProguardUsageZip = j.proguardUsageZip + javaInfo.LinterReports = j.reports + javaInfo.HostdexInstallFile = j.hostdexInstallFile + javaInfo.GeneratedSrcjars = j.properties.Generated_srcjars + javaInfo.ProfileGuided = j.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided + android.SetProvider(ctx, JavaInfoProvider, javaInfo) } setOutputFiles(ctx, j.Module) + j.javaLibraryModuleInfoJSON(ctx) +} + +func (j *Library) javaLibraryModuleInfoJSON(ctx android.ModuleContext) *android.ModuleInfoJSON { moduleInfoJSON := ctx.ModuleInfoJSON() moduleInfoJSON.Class = []string{"JAVA_LIBRARIES"} if j.implementationAndResourcesJar != nil { @@ -1092,6 +1172,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { moduleInfoJSON.Disabled = true j.dexpreopter.ModuleInfoJSONForApex(ctx) } + return moduleInfoJSON } func (j *Library) getJarInstallDir(ctx android.ModuleContext) android.InstallPath { @@ -2258,7 +2339,7 @@ func (al *ApiLibrary) StubsJar() android.Path { func metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths, homeDir android.WritablePath, - classpath android.Paths, configFiles android.Paths) *android.RuleBuilderCommand { + classpath android.Paths, configFiles android.Paths, apiSurface *string) *android.RuleBuilderCommand { rule.Command().Text("rm -rf").Flag(homeDir.String()) rule.Command().Text("mkdir -p").Flag(homeDir.String()) @@ -2299,6 +2380,8 @@ func metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder, addMetalavaConfigFilesToCmd(cmd, configFiles) + addOptionalApiSurfaceToCmd(cmd, apiSurface) + if len(classpath) == 0 { // 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 @@ -2503,7 +2586,7 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { combinedPaths := append(([]android.Path)(nil), systemModulesPaths...) combinedPaths = append(combinedPaths, classPaths...) combinedPaths = append(combinedPaths, bootclassPaths...) - cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, combinedPaths, configFiles) + cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, combinedPaths, configFiles, al.properties.Api_surface) al.stubsFlags(ctx, cmd, stubsDir) diff --git a/java/robolectric.go b/java/robolectric.go index ff0c850d5..ed3fc9a63 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -261,6 +261,19 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) setExtraJavaInfo(ctx, r, javaInfo) android.SetProvider(ctx, JavaInfoProvider, javaInfo) } + + moduleInfoJSON := r.javaLibraryModuleInfoJSON(ctx) + if _, ok := r.testConfig.(android.WritablePath); ok { + moduleInfoJSON.AutoTestConfig = []string{"true"} + } + if r.testConfig != nil { + moduleInfoJSON.TestConfig = append(moduleInfoJSON.TestConfig, r.testConfig.String()) + } + if len(r.testProperties.Test_suites) > 0 { + moduleInfoJSON.CompatibilitySuites = append(moduleInfoJSON.CompatibilitySuites, r.testProperties.Test_suites...) + } else { + moduleInfoJSON.CompatibilitySuites = append(moduleInfoJSON.CompatibilitySuites, "null-suite") + } } func generateSameDirRoboTestConfigJar(ctx android.ModuleContext, outputFile android.ModuleOutPath) { diff --git a/java/sdk_library.go b/java/sdk_library.go index fda87f8fd..05a5b4920 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -693,9 +693,9 @@ func (paths *scopePaths) extractStubsLibraryInfoFromDependency(ctx android.Modul paths.stubsHeaderPath = lib.HeaderJars paths.stubsImplPath = lib.ImplementationJars - libDep := dep.(UsesLibraryDependency) - paths.stubsDexJarPath = libDep.DexJarBuildPath(ctx) - paths.exportableStubsDexJarPath = libDep.DexJarBuildPath(ctx) + libDep := android.OtherModuleProviderOrDefault(ctx, dep, JavaInfoProvider).UsesLibraryDependencyInfo + paths.stubsDexJarPath = libDep.DexJarBuildPath + paths.exportableStubsDexJarPath = libDep.DexJarBuildPath return nil } else { return fmt.Errorf("expected module that has JavaInfoProvider, e.g. java_library") @@ -709,8 +709,8 @@ func (paths *scopePaths) extractEverythingStubsLibraryInfoFromDependency(ctx and paths.stubsImplPath = lib.ImplementationJars } - libDep := dep.(UsesLibraryDependency) - paths.stubsDexJarPath = libDep.DexJarBuildPath(ctx) + libDep := android.OtherModuleProviderOrDefault(ctx, dep, JavaInfoProvider).UsesLibraryDependencyInfo + paths.stubsDexJarPath = libDep.DexJarBuildPath return nil } else { return fmt.Errorf("expected module that has JavaInfoProvider, e.g. java_library") @@ -723,58 +723,67 @@ func (paths *scopePaths) extractExportableStubsLibraryInfoFromDependency(ctx and paths.stubsImplPath = lib.ImplementationJars } - libDep := dep.(UsesLibraryDependency) - paths.exportableStubsDexJarPath = libDep.DexJarBuildPath(ctx) + libDep := android.OtherModuleProviderOrDefault(ctx, dep, JavaInfoProvider).UsesLibraryDependencyInfo + paths.exportableStubsDexJarPath = libDep.DexJarBuildPath return nil } else { return fmt.Errorf("expected module that has JavaInfoProvider, e.g. java_library") } } -func (paths *scopePaths) treatDepAsApiStubsProvider(dep android.Module, action func(provider ApiStubsProvider) error) error { - if apiStubsProvider, ok := dep.(ApiStubsProvider); ok { - err := action(apiStubsProvider) - if err != nil { - return err - } - return nil - } else { - return fmt.Errorf("expected module that implements ExportableApiStubsSrcProvider, e.g. droidstubs") +func (paths *scopePaths) treatDepAsApiStubsProvider(ctx android.ModuleContext, dep android.Module, + action func(*DroidStubsInfo, *StubsSrcInfo) error) error { + apiStubsProvider, ok := android.OtherModuleProvider(ctx, dep, DroidStubsInfoProvider) + if !ok { + return fmt.Errorf("expected module that provides DroidStubsInfo, e.g. droidstubs") + } + + apiStubsSrcProvider, ok := android.OtherModuleProvider(ctx, dep, StubsSrcInfoProvider) + if !ok { + return fmt.Errorf("expected module that provides StubsSrcInfo, e.g. droidstubs") } + return action(&apiStubsProvider, &apiStubsSrcProvider) } -func (paths *scopePaths) treatDepAsApiStubsSrcProvider(dep android.Module, action func(provider ApiStubsSrcProvider) error) error { - if apiStubsProvider, ok := dep.(ApiStubsSrcProvider); ok { - err := action(apiStubsProvider) +func (paths *scopePaths) treatDepAsApiStubsSrcProvider( + ctx android.ModuleContext, dep android.Module, action func(provider *StubsSrcInfo) error) error { + if apiStubsProvider, ok := android.OtherModuleProvider(ctx, dep, StubsSrcInfoProvider); ok { + err := action(&apiStubsProvider) if err != nil { return err } return nil } else { - return fmt.Errorf("expected module that implements ApiStubsSrcProvider, e.g. droidstubs") + return fmt.Errorf("expected module that provides DroidStubsInfo, e.g. droidstubs") } } -func (paths *scopePaths) extractApiInfoFromApiStubsProvider(provider ApiStubsProvider, stubsType StubsType) error { - var annotationsZip, currentApiFilePath, removedApiFilePath android.Path - annotationsZip, annotationsZipErr := provider.AnnotationsZip(stubsType) - currentApiFilePath, currentApiFilePathErr := provider.ApiFilePath(stubsType) - removedApiFilePath, removedApiFilePathErr := provider.RemovedApiFilePath(stubsType) - - combinedError := errors.Join(annotationsZipErr, currentApiFilePathErr, removedApiFilePathErr) +func (paths *scopePaths) extractApiInfoFromApiStubsProvider(provider *DroidStubsInfo, stubsType StubsType) error { + var currentApiFilePathErr, removedApiFilePathErr error + info, err := getStubsInfoForType(provider, stubsType) + if err != nil { + return err + } + if info.ApiFile == nil { + currentApiFilePathErr = fmt.Errorf("expected module that provides ApiFile") + } + if info.RemovedApiFile == nil { + removedApiFilePathErr = fmt.Errorf("expected module that provides RemovedApiFile") + } + combinedError := errors.Join(currentApiFilePathErr, removedApiFilePathErr) if combinedError == nil { - paths.annotationsZip = android.OptionalPathForPath(annotationsZip) - paths.currentApiFilePath = android.OptionalPathForPath(currentApiFilePath) - paths.removedApiFilePath = android.OptionalPathForPath(removedApiFilePath) + paths.annotationsZip = android.OptionalPathForPath(info.AnnotationsZip) + paths.currentApiFilePath = android.OptionalPathForPath(info.ApiFile) + paths.removedApiFilePath = android.OptionalPathForPath(info.RemovedApiFile) } return combinedError } -func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsSrcProvider, stubsType StubsType) error { - stubsSrcJar, err := provider.StubsSrcJar(stubsType) +func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider *StubsSrcInfo, stubsType StubsType) error { + path, err := getStubsSrcInfoForType(provider, stubsType) if err == nil { - paths.stubsSrcJar = android.OptionalPathForPath(stubsSrcJar) + paths.stubsSrcJar = android.OptionalPathForPath(path) } return err } @@ -784,7 +793,7 @@ func (paths *scopePaths) extractStubsSourceInfoFromDep(ctx android.ModuleContext if ctx.Config().ReleaseHiddenApiExportableStubs() { stubsType = Exportable } - return paths.treatDepAsApiStubsSrcProvider(dep, func(provider ApiStubsSrcProvider) error { + return paths.treatDepAsApiStubsSrcProvider(ctx, dep, func(provider *StubsSrcInfo) error { return paths.extractStubsSourceInfoFromApiStubsProviders(provider, stubsType) }) } @@ -794,17 +803,17 @@ func (paths *scopePaths) extractStubsSourceAndApiInfoFromApiStubsProvider(ctx an if ctx.Config().ReleaseHiddenApiExportableStubs() { stubsType = Exportable } - return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error { - extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, stubsType) - extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, stubsType) + return paths.treatDepAsApiStubsProvider(ctx, dep, func(apiStubsProvider *DroidStubsInfo, apiStubsSrcProvider *StubsSrcInfo) error { + extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(apiStubsProvider, stubsType) + extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(apiStubsSrcProvider, stubsType) return errors.Join(extractApiInfoErr, extractStubsSourceInfoErr) }) } -func extractOutputPaths(dep android.Module) (android.Paths, error) { +func extractOutputPaths(ctx android.ModuleContext, dep android.Module) (android.Paths, error) { var paths android.Paths - if sourceFileProducer, ok := dep.(android.SourceFileProducer); ok { - paths = sourceFileProducer.Srcs() + if sourceFileProducer, ok := android.OtherModuleProvider(ctx, dep, android.SourceFilesInfoProvider); ok { + paths = sourceFileProducer.Srcs return paths, nil } else { return nil, fmt.Errorf("module %q does not produce source files", dep) @@ -812,17 +821,47 @@ func extractOutputPaths(dep android.Module) (android.Paths, error) { } func (paths *scopePaths) extractLatestApiPath(ctx android.ModuleContext, dep android.Module) error { - outputPaths, err := extractOutputPaths(dep) + outputPaths, err := extractOutputPaths(ctx, dep) paths.latestApiPaths = outputPaths return err } func (paths *scopePaths) extractLatestRemovedApiPath(ctx android.ModuleContext, dep android.Module) error { - outputPaths, err := extractOutputPaths(dep) + outputPaths, err := extractOutputPaths(ctx, dep) paths.latestRemovedApiPaths = outputPaths return err } +func getStubsInfoForType(info *DroidStubsInfo, stubsType StubsType) (ret *StubsInfo, err error) { + switch stubsType { + case Everything: + ret, err = &info.EverythingStubsInfo, nil + case Exportable: + ret, err = &info.ExportableStubsInfo, nil + default: + ret, err = nil, fmt.Errorf("stubs info not supported for the stub type %s", stubsType.String()) + } + if ret == nil && err == nil { + err = fmt.Errorf("stubs info is null for the stub type %s", stubsType.String()) + } + return ret, err +} + +func getStubsSrcInfoForType(info *StubsSrcInfo, stubsType StubsType) (ret android.Path, err error) { + switch stubsType { + case Everything: + ret, err = info.EverythingStubsSrcJar, nil + case Exportable: + ret, err = info.ExportableStubsSrcJar, nil + default: + ret, err = nil, fmt.Errorf("stubs src info not supported for the stub type %s", stubsType.String()) + } + if ret == nil && err == nil { + err = fmt.Errorf("stubs src info is null for the stub type %s", stubsType.String()) + } + return ret, err +} + type commonToSdkLibraryAndImportProperties struct { // Specifies whether this module can be used as an Android shared library; defaults // to true. @@ -911,9 +950,9 @@ type commonToSdkLibraryAndImport struct { // This is non-empty only when api_only is false. implLibraryHeaderJars android.Paths - // The reference to the implementation library created by the source module. - // Is nil if the source module does not exist. - implLibraryModule *Library + // The reference to the JavaInfo provided by implementation library created by + // the source module. Is nil if the source module does not exist. + implLibraryInfo *JavaInfo } func (c *commonToSdkLibraryAndImport) initCommon(module commonSdkLibraryAndImportModule) { @@ -1218,16 +1257,16 @@ var _ UsesLibraryDependency = (*SdkLibrary)(nil) // To satisfy the UsesLibraryDependency interface func (module *SdkLibrary) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { - if module.implLibraryModule != nil { - return module.implLibraryModule.DexJarBuildPath(ctx) + if module.implLibraryInfo != nil { + return module.implLibraryInfo.DexJarFile } return makeUnsetDexJarPath() } // To satisfy the UsesLibraryDependency interface func (module *SdkLibrary) DexJarInstallPath() android.Path { - if module.implLibraryModule != nil { - return module.implLibraryModule.DexJarInstallPath() + if module.implLibraryInfo != nil { + return module.implLibraryInfo.InstallFile } return nil } @@ -1414,11 +1453,11 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) // Collate the components exported by this module. All scope specific modules are exported but // the impl and xml component modules are not. exportedComponents := map[string]struct{}{} - + var implLib android.ModuleProxy // Record the paths to the header jars of the library (stubs and impl). // When this java_sdk_library is depended upon from others via "libs" property, // the recorded paths will be returned depending on the link type of the caller. - ctx.VisitDirectDeps(func(to android.Module) { + ctx.VisitDirectDepsProxy(func(to android.ModuleProxy) { tag := ctx.OtherModuleDependencyTag(to) // Extract information from any of the scope specific dependencies. @@ -1438,7 +1477,8 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) if tag == implLibraryTag { if dep, ok := android.OtherModuleProvider(ctx, to, JavaInfoProvider); ok { module.implLibraryHeaderJars = append(module.implLibraryHeaderJars, dep.HeaderJars...) - module.implLibraryModule = to.(*Library) + module.implLibraryInfo = dep + implLib = to } } }) @@ -1449,39 +1489,39 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) module.hideApexVariantFromMake = true } - if module.implLibraryModule != nil { + if module.implLibraryInfo != nil { if ctx.Device() { - module.classesJarPaths = android.Paths{module.implLibraryModule.implementationJarFile} - module.bootDexJarPath = module.implLibraryModule.bootDexJarPath - module.uncompressDexState = module.implLibraryModule.uncompressDexState - module.active = module.implLibraryModule.active + module.classesJarPaths = module.implLibraryInfo.ImplementationJars + module.bootDexJarPath = module.implLibraryInfo.BootDexJarPath + module.uncompressDexState = module.implLibraryInfo.UncompressDexState + module.active = module.implLibraryInfo.Active } - module.outputFile = module.implLibraryModule.outputFile - module.dexJarFile = makeDexJarPathFromPath(module.implLibraryModule.dexJarFile.Path()) - module.headerJarFile = module.implLibraryModule.headerJarFile - module.implementationAndResourcesJar = module.implLibraryModule.implementationAndResourcesJar - module.builtInstalledForApex = module.implLibraryModule.builtInstalledForApex - module.dexpreopter.configPath = module.implLibraryModule.dexpreopter.configPath - module.dexpreopter.outputProfilePathOnHost = module.implLibraryModule.dexpreopter.outputProfilePathOnHost + module.outputFile = module.implLibraryInfo.OutputFile + module.dexJarFile = makeDexJarPathFromPath(module.implLibraryInfo.DexJarFile.Path()) + module.headerJarFile = module.implLibraryInfo.HeaderJars[0] + module.implementationAndResourcesJar = module.implLibraryInfo.ImplementationAndResourcesJars[0] + module.builtInstalledForApex = module.implLibraryInfo.BuiltInstalledForApex + module.dexpreopter.configPath = module.implLibraryInfo.ConfigPath + module.dexpreopter.outputProfilePathOnHost = module.implLibraryInfo.OutputProfilePathOnHost // Properties required for Library.AndroidMkEntries - module.logtagsSrcs = module.implLibraryModule.logtagsSrcs - module.dexpreopter.builtInstalled = module.implLibraryModule.dexpreopter.builtInstalled - module.jacocoReportClassesFile = module.implLibraryModule.jacocoReportClassesFile - module.dexer.proguardDictionary = module.implLibraryModule.dexer.proguardDictionary - module.dexer.proguardUsageZip = module.implLibraryModule.dexer.proguardUsageZip - module.linter.reports = module.implLibraryModule.linter.reports - - if lintInfo, ok := android.OtherModuleProvider(ctx, module.implLibraryModule, LintProvider); ok { + module.logtagsSrcs = module.implLibraryInfo.LogtagsSrcs + module.dexpreopter.builtInstalled = module.implLibraryInfo.BuiltInstalled + module.jacocoReportClassesFile = module.implLibraryInfo.JacocoReportClassesFile + module.dexer.proguardDictionary = module.implLibraryInfo.ProguardDictionary + module.dexer.proguardUsageZip = module.implLibraryInfo.ProguardUsageZip + module.linter.reports = module.implLibraryInfo.LinterReports + + if lintInfo, ok := android.OtherModuleProvider(ctx, implLib, LintProvider); ok { android.SetProvider(ctx, LintProvider, lintInfo) } if !module.Host() { - module.hostdexInstallFile = module.implLibraryModule.hostdexInstallFile + module.hostdexInstallFile = module.implLibraryInfo.HostdexInstallFile } - if installFilesInfo, ok := android.OtherModuleProvider(ctx, module.implLibraryModule, android.InstallFilesProvider); ok { + if installFilesInfo, ok := android.OtherModuleProvider(ctx, implLib, android.InstallFilesProvider); ok { if installFilesInfo.CheckbuildTarget != nil { ctx.CheckbuildFile(installFilesInfo.CheckbuildTarget) } @@ -1524,15 +1564,26 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) } } - if module.requiresRuntimeImplementationLibrary() && module.implLibraryModule != nil { + if module.requiresRuntimeImplementationLibrary() && module.implLibraryInfo != nil { generatingLibs = append(generatingLibs, module.implLibraryModuleName()) - setOutputFiles(ctx, module.implLibraryModule.Module) + setOutputFilesFromJavaInfo(ctx, module.implLibraryInfo) } sdkLibInfo.GeneratingLibs = generatingLibs android.SetProvider(ctx, SdkLibraryInfoProvider, sdkLibInfo) } +func setOutputFilesFromJavaInfo(ctx android.ModuleContext, info *JavaInfo) { + ctx.SetOutputFiles(append(android.PathsIfNonNil(info.OutputFile), info.ExtraOutputFiles...), "") + ctx.SetOutputFiles(android.PathsIfNonNil(info.OutputFile), android.DefaultDistTag) + ctx.SetOutputFiles(info.ImplementationAndResourcesJars, ".jar") + ctx.SetOutputFiles(info.HeaderJars, ".hjar") + if info.ProguardDictionary.Valid() { + ctx.SetOutputFiles(android.Paths{info.ProguardDictionary.Path()}, ".proguard_map") + } + ctx.SetOutputFiles(info.GeneratedSrcjars, ".generated_srcjars") +} + func (module *SdkLibrary) BuiltInstalledForApex() []dexpreopterInstall { return module.builtInstalledForApex } @@ -1906,10 +1957,6 @@ type SdkLibraryImport struct { commonToSdkLibraryAndImport - // The reference to the xml permissions module created by the source module. - // Is nil if the source module does not exist. - xmlPermissionsFileModule *sdkLibraryXml - // Build path to the dex implementation jar obtained from the prebuilt_apex, if any. dexJarFile OptionalDexJarPath dexJarFileErr error @@ -2098,7 +2145,7 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo module.installFile = android.PathForModuleInstall(ctx, "framework", module.Stem()+".jar") // Record the paths to the prebuilt stubs library and stubs source. - ctx.VisitDirectDeps(func(to android.Module) { + ctx.VisitDirectDepsProxy(func(to android.ModuleProxy) { tag := ctx.OtherModuleDependencyTag(to) // Extract information from any of the scope specific dependencies. @@ -2110,17 +2157,11 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo // is determined by the nature of the dependency which is determined by the tag. scopeTag.extractDepInfo(ctx, to, scopePaths) } else if tag == implLibraryTag { - if implLibrary, ok := to.(*Library); ok { - module.implLibraryModule = implLibrary + if implInfo, ok := android.OtherModuleProvider(ctx, to, JavaInfoProvider); ok { + module.implLibraryInfo = implInfo } else { ctx.ModuleErrorf("implementation library must be of type *java.Library but was %T", to) } - } else if tag == xmlPermissionsFileTag { - if xmlPermissionsFileModule, ok := to.(*sdkLibraryXml); ok { - module.xmlPermissionsFileModule = xmlPermissionsFileModule - } else { - ctx.ModuleErrorf("xml permissions file module must be of type *sdkLibraryXml but was %T", to) - } } }) sdkLibInfo := module.generateCommonBuildActions(ctx) @@ -2160,9 +2201,9 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo } module.setOutputFiles(ctx) - if module.implLibraryModule != nil { + if module.implLibraryInfo != nil { generatingLibs = append(generatingLibs, module.implLibraryModuleName()) - setOutputFiles(ctx, module.implLibraryModule.Module) + setOutputFilesFromJavaInfo(ctx, module.implLibraryInfo) } sdkLibInfo.GeneratingLibs = generatingLibs @@ -2181,10 +2222,10 @@ func (module *SdkLibraryImport) DexJarBuildPath(ctx android.ModuleErrorfContext) if module.dexJarFile.IsSet() { return module.dexJarFile } - if module.implLibraryModule == nil { + if module.implLibraryInfo == nil { return makeUnsetDexJarPath() } else { - return module.implLibraryModule.DexJarBuildPath(ctx) + return module.implLibraryInfo.DexJarFile } } @@ -2200,10 +2241,10 @@ func (module *SdkLibraryImport) ClassLoaderContexts() dexpreopt.ClassLoaderConte // to satisfy apex.javaDependency interface func (module *SdkLibraryImport) JacocoReportClassesFile() android.Path { - if module.implLibraryModule == nil { + if module.implLibraryInfo == nil { return nil } else { - return module.implLibraryModule.JacocoReportClassesFile() + return module.implLibraryInfo.JacocoReportClassesFile } } @@ -2216,19 +2257,19 @@ var _ ApexDependency = (*SdkLibraryImport)(nil) // to satisfy java.ApexDependency interface func (module *SdkLibraryImport) HeaderJars() android.Paths { - if module.implLibraryModule == nil { + if module.implLibraryInfo == nil { return nil } else { - return module.implLibraryModule.HeaderJars() + return module.implLibraryInfo.HeaderJars } } // to satisfy java.ApexDependency interface func (module *SdkLibraryImport) ImplementationAndResourcesJars() android.Paths { - if module.implLibraryModule == nil { + if module.implLibraryInfo == nil { return nil } else { - return module.implLibraryModule.ImplementationAndResourcesJars() + return module.implLibraryInfo.ImplementationAndResourcesJars } } @@ -2393,8 +2434,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe s.Min_device_sdk = sdk.commonSdkLibraryProperties.Min_device_sdk s.Max_device_sdk = sdk.commonSdkLibraryProperties.Max_device_sdk - implLibrary := sdk.implLibraryModule - if implLibrary != nil && implLibrary.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided { + if sdk.implLibraryInfo != nil && sdk.implLibraryInfo.ProfileGuided { s.DexPreoptProfileGuided = proptools.BoolPtr(true) } } diff --git a/python/tests/runtest.sh b/python/tests/runtest.sh index c44ec582a..916756165 100755 --- a/python/tests/runtest.sh +++ b/python/tests/runtest.sh @@ -25,15 +25,9 @@ fi if [[ ( ! -f $ANDROID_HOST_OUT/nativetest64/par_test/par_test ) || ( ! -f $ANDROID_HOST_OUT/bin/py3-cmd )]]; then - echo "Run 'm par_test py2-cmd py3-cmd' first" + echo "Run 'm par_test py3-cmd' first" exit 1 fi -if [ $(uname -s) = Linux ]; then - if [[ ! -f $ANDROID_HOST_OUT/bin/py2-cmd ]]; then - echo "Run 'm par_test py2-cmd py3-cmd' first" - exit 1 - fi -fi export LD_LIBRARY_PATH=$ANDROID_HOST_OUT/lib64 @@ -47,16 +41,8 @@ ARGTEST=true $ANDROID_HOST_OUT/nativetest64/par_test/par_test --arg1 arg2 cd $(dirname ${BASH_SOURCE[0]}) -if [ $(uname -s) = Linux ]; then - PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py2-cmd py-cmd_test.py -fi PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py3-cmd py-cmd_test.py -if [ $(uname -s) = Linux ]; then - ARGTEST=true PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py2-cmd py-cmd_test.py arg1 arg2 - ARGTEST2=true PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py2-cmd py-cmd_test.py --arg1 arg2 -fi - ARGTEST=true PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py3-cmd py-cmd_test.py arg1 arg2 ARGTEST2=true PYTHONPATH=/extra $ANDROID_HOST_OUT/bin/py3-cmd py-cmd_test.py --arg1 arg2 diff --git a/rust/library.go b/rust/library.go index 49169ac08..77280d959 100644 --- a/rust/library.go +++ b/rust/library.go @@ -708,7 +708,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa if library.stubs() { ccFlags := library.getApiStubsCcFlags(ctx) stubObjs := library.compileModuleLibApiStubs(ctx, ccFlags) - cc.BuildRustStubs(ctx, outputFile, deps.CrtBegin, deps.CrtEnd, stubObjs, ccFlags) + cc.BuildRustStubs(ctx, outputFile, stubObjs, ccFlags) } else if library.rlib() { ret.kytheFile = TransformSrctoRlib(ctx, crateRootPath, deps, flags, outputFile).kytheFile } else if library.dylib() { diff --git a/snapshot/snapshot_base.go b/snapshot/snapshot_base.go index 6bf3c87a2..510e9cf72 100644 --- a/snapshot/snapshot_base.go +++ b/snapshot/snapshot_base.go @@ -45,14 +45,3 @@ type SnapshotJsonFlags struct { LicenseKinds []string `json:",omitempty"` LicenseTexts []string `json:",omitempty"` } - -func (prop *SnapshotJsonFlags) InitBaseSnapshotPropsWithName(m android.Module, name string) { - prop.ModuleName = name - - prop.LicenseKinds = m.EffectiveLicenseKinds() - prop.LicenseTexts = m.EffectiveLicenseFiles().Strings() -} - -func (prop *SnapshotJsonFlags) InitBaseSnapshotProps(m android.Module) { - prop.InitBaseSnapshotPropsWithName(m, m.Name()) -} diff --git a/tradefed_modules/test_suite.go b/tradefed_modules/test_suite.go index 00585f5f6..8b7babf52 100644 --- a/tradefed_modules/test_suite.go +++ b/tradefed_modules/test_suite.go @@ -26,12 +26,12 @@ import ( const testSuiteModuleType = "test_suite" -type testSuiteTag struct{ +type testSuiteTag struct { blueprint.BaseDependencyTag } type testSuiteManifest struct { - Name string `json:"name"` + Name string `json:"name"` Files []string `json:"files"` } @@ -49,7 +49,7 @@ var PrepareForTestWithTestSuiteBuildComponents = android.GroupFixturePreparers( type testSuiteProperties struct { Description string - Tests []string `android:"path,arch_variant"` + Tests []string `android:"path,arch_variant"` } type testSuiteModule struct { @@ -109,7 +109,7 @@ func (t *testSuiteModule) GenerateAndroidBuildActions(ctx android.ModuleContext) } manifestPath := android.PathForSuiteInstall(ctx, suiteName, suiteName+".json") - b, err := json.Marshal(testSuiteManifest{Name: suiteName, Files: files}) + b, err := json.Marshal(testSuiteManifest{Name: suiteName, Files: android.SortedUniqueStrings(files)}) if err != nil { ctx.ModuleErrorf("Failed to marshal manifest: %v", err) return @@ -160,7 +160,7 @@ func packageModuleFiles(ctx android.ModuleContext, suiteName string, module andr // Install config file. if tp.TestConfig != nil { moduleRoot := suiteRoot.Join(ctx, hostOrTarget, "testcases", module.Name()) - installed = append(installed, ctx.InstallFile(moduleRoot, module.Name() + ".config", tp.TestConfig)) + installed = append(installed, ctx.InstallFile(moduleRoot, module.Name()+".config", tp.TestConfig)) } // Add to phony and manifest, manifestpaths are relative to suiteRoot. |