Loading cc/cc.go +31 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,7 @@ var ( vndkExtDepTag = dependencyTag{name: "vndk extends", library: true} runtimeDepTag = dependencyTag{name: "runtime lib"} coverageDepTag = dependencyTag{name: "coverage"} testPerSrcDepTag = dependencyTag{name: "test_per_src"} ) // Module contains the properties and members used by all C/C++ module types, and implements Loading Loading @@ -407,6 +408,9 @@ type Module struct { outputFile android.OptionalPath // Test output files, in the case of a test module using `test_per_src`. testPerSrcOutputFiles []android.Path cachedToolchain config.Toolchain subAndroidMkOnce map[subAndroidMkProvider]bool Loading @@ -429,6 +433,10 @@ func (c *Module) OutputFile() android.OptionalPath { return c.outputFile } func (c *Module) TestPerSrcOutputFiles() []android.Path { return c.testPerSrcOutputFiles } func (c *Module) UnstrippedOutputFile() android.Path { if c.linker != nil { return c.linker.unstrippedOutputFilePath() Loading Loading @@ -943,6 +951,29 @@ func orderStaticModuleDeps(module *Module, staticDeps []*Module, sharedDeps []*M } func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { // Handle the case of a test module split by `test_per_src` mutator. if test, ok := c.linker.(testPerSrc); ok { // The `test_per_src` mutator adds an extra variant named "", depending on all the // other `test_per_src` variants of the test module. Collect the output files of // these dependencies and record them in the `testPerSrcOutputFiles` for later use // (see e.g. `apexBundle.GenerateAndroidBuildActions`). if test.isAllTestsVariation() { var testPerSrcOutputFiles []android.Path for _, dep := range actx.GetDirectDepsWithTag(testPerSrcDepTag) { if ccDep, ok := dep.(*Module); ok { depOutputFile := ccDep.OutputFile().Path() testPerSrcOutputFiles = append(testPerSrcOutputFiles, depOutputFile) } } c.testPerSrcOutputFiles = testPerSrcOutputFiles // Set outputFile to an empty path, as this module does not produce an // output file per se. c.outputFile = android.OptionalPath{} return } } c.makeLinkType = c.getMakeLinkType(actx) ctx := &moduleContext{ Loading cc/test.go +31 −2 Original line number Diff line number Diff line Loading @@ -121,7 +121,9 @@ func BenchmarkHostFactory() android.Module { type testPerSrc interface { testPerSrc() bool srcs() []string isAllTestsVariation() bool setSrc(string, string) unsetSrc() } func (test *testBinary) testPerSrc() bool { Loading @@ -132,28 +134,55 @@ func (test *testBinary) srcs() []string { return test.baseCompiler.Properties.Srcs } func (test *testBinary) isAllTestsVariation() bool { stem := test.binaryDecorator.Properties.Stem return stem != nil && *stem == "" } func (test *testBinary) setSrc(name, src string) { test.baseCompiler.Properties.Srcs = []string{src} test.binaryDecorator.Properties.Stem = StringPtr(name) } func (test *testBinary) unsetSrc() { test.baseCompiler.Properties.Srcs = nil test.binaryDecorator.Properties.Stem = StringPtr("") } var _ testPerSrc = (*testBinary)(nil) func testPerSrcMutator(mctx android.BottomUpMutatorContext) { if m, ok := mctx.Module().(*Module); ok { if test, ok := m.linker.(testPerSrc); ok { if test.testPerSrc() && len(test.srcs()) > 0 { numTests := len(test.srcs()) if test.testPerSrc() && numTests > 0 { if duplicate, found := checkDuplicate(test.srcs()); found { mctx.PropertyErrorf("srcs", "found a duplicate entry %q", duplicate) return } testNames := make([]string, len(test.srcs())) testNames := make([]string, numTests) for i, src := range test.srcs() { testNames[i] = strings.TrimSuffix(filepath.Base(src), filepath.Ext(src)) } // In addition to creating one variation per test source file, // create an additional "all tests" variation named "", and have it // depends on all other test_per_src variations. This is useful to // create subsequent dependencies of a given module on all // test_per_src variations created above: by depending on // variation "", that module will transitively depend on all the // other test_per_src variations without the need to know their // name or even their number. testNames = append(testNames, "") tests := mctx.CreateLocalVariations(testNames...) all_tests := tests[numTests] all_tests.(*Module).linker.(testPerSrc).unsetSrc() // Prevent the "all tests" variation from being installable nor // exporting to Make, as it won't create any output file. all_tests.(*Module).Properties.PreventInstall = true all_tests.(*Module).Properties.HideFromMake = true for i, src := range test.srcs() { tests[i].(*Module).linker.(testPerSrc).setSrc(testNames[i], src) mctx.AddInterVariantDependency(testPerSrcDepTag, all_tests, tests[i]) } } } Loading Loading
cc/cc.go +31 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,7 @@ var ( vndkExtDepTag = dependencyTag{name: "vndk extends", library: true} runtimeDepTag = dependencyTag{name: "runtime lib"} coverageDepTag = dependencyTag{name: "coverage"} testPerSrcDepTag = dependencyTag{name: "test_per_src"} ) // Module contains the properties and members used by all C/C++ module types, and implements Loading Loading @@ -407,6 +408,9 @@ type Module struct { outputFile android.OptionalPath // Test output files, in the case of a test module using `test_per_src`. testPerSrcOutputFiles []android.Path cachedToolchain config.Toolchain subAndroidMkOnce map[subAndroidMkProvider]bool Loading @@ -429,6 +433,10 @@ func (c *Module) OutputFile() android.OptionalPath { return c.outputFile } func (c *Module) TestPerSrcOutputFiles() []android.Path { return c.testPerSrcOutputFiles } func (c *Module) UnstrippedOutputFile() android.Path { if c.linker != nil { return c.linker.unstrippedOutputFilePath() Loading Loading @@ -943,6 +951,29 @@ func orderStaticModuleDeps(module *Module, staticDeps []*Module, sharedDeps []*M } func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { // Handle the case of a test module split by `test_per_src` mutator. if test, ok := c.linker.(testPerSrc); ok { // The `test_per_src` mutator adds an extra variant named "", depending on all the // other `test_per_src` variants of the test module. Collect the output files of // these dependencies and record them in the `testPerSrcOutputFiles` for later use // (see e.g. `apexBundle.GenerateAndroidBuildActions`). if test.isAllTestsVariation() { var testPerSrcOutputFiles []android.Path for _, dep := range actx.GetDirectDepsWithTag(testPerSrcDepTag) { if ccDep, ok := dep.(*Module); ok { depOutputFile := ccDep.OutputFile().Path() testPerSrcOutputFiles = append(testPerSrcOutputFiles, depOutputFile) } } c.testPerSrcOutputFiles = testPerSrcOutputFiles // Set outputFile to an empty path, as this module does not produce an // output file per se. c.outputFile = android.OptionalPath{} return } } c.makeLinkType = c.getMakeLinkType(actx) ctx := &moduleContext{ Loading
cc/test.go +31 −2 Original line number Diff line number Diff line Loading @@ -121,7 +121,9 @@ func BenchmarkHostFactory() android.Module { type testPerSrc interface { testPerSrc() bool srcs() []string isAllTestsVariation() bool setSrc(string, string) unsetSrc() } func (test *testBinary) testPerSrc() bool { Loading @@ -132,28 +134,55 @@ func (test *testBinary) srcs() []string { return test.baseCompiler.Properties.Srcs } func (test *testBinary) isAllTestsVariation() bool { stem := test.binaryDecorator.Properties.Stem return stem != nil && *stem == "" } func (test *testBinary) setSrc(name, src string) { test.baseCompiler.Properties.Srcs = []string{src} test.binaryDecorator.Properties.Stem = StringPtr(name) } func (test *testBinary) unsetSrc() { test.baseCompiler.Properties.Srcs = nil test.binaryDecorator.Properties.Stem = StringPtr("") } var _ testPerSrc = (*testBinary)(nil) func testPerSrcMutator(mctx android.BottomUpMutatorContext) { if m, ok := mctx.Module().(*Module); ok { if test, ok := m.linker.(testPerSrc); ok { if test.testPerSrc() && len(test.srcs()) > 0 { numTests := len(test.srcs()) if test.testPerSrc() && numTests > 0 { if duplicate, found := checkDuplicate(test.srcs()); found { mctx.PropertyErrorf("srcs", "found a duplicate entry %q", duplicate) return } testNames := make([]string, len(test.srcs())) testNames := make([]string, numTests) for i, src := range test.srcs() { testNames[i] = strings.TrimSuffix(filepath.Base(src), filepath.Ext(src)) } // In addition to creating one variation per test source file, // create an additional "all tests" variation named "", and have it // depends on all other test_per_src variations. This is useful to // create subsequent dependencies of a given module on all // test_per_src variations created above: by depending on // variation "", that module will transitively depend on all the // other test_per_src variations without the need to know their // name or even their number. testNames = append(testNames, "") tests := mctx.CreateLocalVariations(testNames...) all_tests := tests[numTests] all_tests.(*Module).linker.(testPerSrc).unsetSrc() // Prevent the "all tests" variation from being installable nor // exporting to Make, as it won't create any output file. all_tests.(*Module).Properties.PreventInstall = true all_tests.(*Module).Properties.HideFromMake = true for i, src := range test.srcs() { tests[i].(*Module).linker.(testPerSrc).setSrc(testNames[i], src) mctx.AddInterVariantDependency(testPerSrcDepTag, all_tests, tests[i]) } } } Loading