diff options
-rw-r--r-- | android/csuite_config.go | 20 | ||||
-rw-r--r-- | cc/proto.go | 2 | ||||
-rw-r--r-- | cmd/sbox/sbox.go | 29 | ||||
-rw-r--r-- | genrule/genrule.go | 63 | ||||
-rw-r--r-- | python/androidmk.go | 76 | ||||
-rw-r--r-- | python/python.go | 2 | ||||
-rw-r--r-- | rust/androidmk.go | 110 | ||||
-rw-r--r-- | rust/project_json.go | 4 | ||||
-rw-r--r-- | rust/project_json_test.go | 16 |
9 files changed, 148 insertions, 174 deletions
diff --git a/android/csuite_config.go b/android/csuite_config.go index 15c518a07..a5b15331a 100644 --- a/android/csuite_config.go +++ b/android/csuite_config.go @@ -14,11 +14,6 @@ package android -import ( - "fmt" - "io" -) - func init() { RegisterModuleType("csuite_config", CSuiteConfigFactory) } @@ -38,22 +33,21 @@ func (me *CSuiteConfig) GenerateAndroidBuildActions(ctx ModuleContext) { me.OutputFilePath = PathForModuleOut(ctx, me.BaseModuleName()).OutputPath } -func (me *CSuiteConfig) AndroidMk() AndroidMkData { - androidMkData := AndroidMkData{ +func (me *CSuiteConfig) AndroidMkEntries() []AndroidMkEntries { + androidMkEntries := AndroidMkEntries{ Class: "FAKE", Include: "$(BUILD_SYSTEM)/suite_host_config.mk", OutputFile: OptionalPathForPath(me.OutputFilePath), } - androidMkData.Extra = []AndroidMkExtraFunc{ - func(w io.Writer, outputFile Path) { + androidMkEntries.ExtraEntries = []AndroidMkExtraEntriesFunc{ + func(entries *AndroidMkEntries) { if me.properties.Test_config != nil { - fmt.Fprintf(w, "LOCAL_TEST_CONFIG := %s\n", - *me.properties.Test_config) + entries.SetString("LOCAL_TEST_CONFIG", *me.properties.Test_config) } - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE := csuite") + entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", "csuite") }, } - return androidMkData + return []AndroidMkEntries{androidMkEntries} } func InitCSuiteConfigModule(me *CSuiteConfig) { diff --git a/cc/proto.go b/cc/proto.go index ae988ec4d..9c102a216 100644 --- a/cc/proto.go +++ b/cc/proto.go @@ -130,6 +130,8 @@ func protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flag flags.protoC = true flags.protoOptionsFile = true flags.proto.OutTypeFlag = "--nanopb_out" + // Disable nanopb timestamps to support remote caching. + flags.proto.OutParams = append(flags.proto.OutParams, "-T") plugin = "protoc-gen-nanopb" case "full": flags.proto.OutTypeFlag = "--cpp_out" diff --git a/cmd/sbox/sbox.go b/cmd/sbox/sbox.go index db483f168..633c6b2cb 100644 --- a/cmd/sbox/sbox.go +++ b/cmd/sbox/sbox.go @@ -207,7 +207,7 @@ func runCommand(command *sbox_proto.Command, tempDir string) (depFile string, er } // Copy in any files specified by the manifest. - err = linkOrCopyFiles(command.CopyBefore, "", tempDir) + err = copyFiles(command.CopyBefore, "", tempDir) if err != nil { return "", err } @@ -315,12 +315,12 @@ func validateOutputFiles(copies []*sbox_proto.Copy, sandboxDir string) []error { return missingOutputErrors } -// linkOrCopyFiles hardlinks or copies files in or out of the sandbox. -func linkOrCopyFiles(copies []*sbox_proto.Copy, fromDir, toDir string) error { +// copyFiles copies files in or out of the sandbox. +func copyFiles(copies []*sbox_proto.Copy, fromDir, toDir string) error { for _, copyPair := range copies { fromPath := joinPath(fromDir, copyPair.GetFrom()) toPath := joinPath(toDir, copyPair.GetTo()) - err := linkOrCopyOneFile(fromPath, toPath) + err := copyOneFile(fromPath, toPath) if err != nil { return fmt.Errorf("error copying %q to %q: %w", fromPath, toPath, err) } @@ -328,30 +328,13 @@ func linkOrCopyFiles(copies []*sbox_proto.Copy, fromDir, toDir string) error { return nil } -// linkOrCopyOneFile first attempts to hardlink a file to a destination, and falls back to making -// a copy if the hardlink fails. -func linkOrCopyOneFile(from string, to string) error { +// copyOneFile copies a file. +func copyOneFile(from string, to string) error { err := os.MkdirAll(filepath.Dir(to), 0777) if err != nil { return err } - // First try hardlinking - err = os.Link(from, to) - if err != nil { - // Retry with copying in case the source an destination are on different filesystems. - // TODO: check for specific hardlink error? - err = copyOneFile(from, to) - if err != nil { - return err - } - } - - return nil -} - -// copyOneFile copies a file. -func copyOneFile(from string, to string) error { stat, err := os.Stat(from) if err != nil { return err diff --git a/genrule/genrule.go b/genrule/genrule.go index cd7c52f6b..d667e94a5 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -148,14 +148,16 @@ type Module struct { type taskFunc func(ctx android.ModuleContext, rawCommand string, srcFiles android.Paths) []generateTask type generateTask struct { - in android.Paths - out android.WritablePaths - depFile android.WritablePath - copyTo android.WritablePaths - genDir android.WritablePath - cmd string - shard int - shards int + in android.Paths + out android.WritablePaths + depFile android.WritablePath + copyTo android.WritablePaths + genDir android.WritablePath + extraTools android.Paths // dependencies on tools used by the generator + + cmd string + shard int + shards int } func (g *Module) GeneratedSourceFiles() android.Paths { @@ -434,6 +436,7 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) { cmd.ImplicitOutputs(task.out) cmd.Implicits(task.in) cmd.Implicits(g.deps) + cmd.Implicits(task.extraTools) if Bool(g.properties.Depfile) { cmd.ImplicitDepFile(task.depFile) } @@ -584,8 +587,8 @@ func NewGenSrcs() *Module { for i, shard := range shards { var commands []string var outFiles android.WritablePaths + var commandDepFiles []string var copyTo android.WritablePaths - var depFile android.WritablePath // When sharding is enabled (i.e. len(shards) > 1), the sbox rules for each // shard will be write to their own directories and then be merged together @@ -598,7 +601,7 @@ func NewGenSrcs() *Module { genDir := android.PathForModuleGen(ctx, genSubDir) - for j, in := range shard { + for _, in := range shard { outFile := android.GenPathWithExt(ctx, finalSubDir, in, String(properties.Output_extension)) // If sharding is enabled, then outFile is the path to the output file in @@ -610,10 +613,6 @@ func NewGenSrcs() *Module { outFile = shardFile } - if j == 0 { - depFile = outFile.ReplaceExtension(ctx, "d") - } - outFiles = append(outFiles, outFile) // pre-expand the command line to replace $in and $out with references to @@ -624,6 +623,12 @@ func NewGenSrcs() *Module { return in.String(), nil case "out": return android.SboxPathForOutput(outFile, genDir), nil + case "depfile": + // Generate a depfile for each output file. Store the list for + // later in order to combine them all into a single depfile. + depFile := android.SboxPathForOutput(outFile.ReplaceExtension(ctx, "d"), genDir) + commandDepFiles = append(commandDepFiles, depFile) + return depFile, nil default: return "$(" + name + ")", nil } @@ -638,15 +643,29 @@ func NewGenSrcs() *Module { } fullCommand := strings.Join(commands, " && ") + var outputDepfile android.WritablePath + var extraTools android.Paths + if len(commandDepFiles) > 0 { + // Each command wrote to a depfile, but ninja can only handle one + // depfile per rule. Use the dep_fixer tool at the end of the + // command to combine all the depfiles into a single output depfile. + outputDepfile = android.PathForModuleGen(ctx, genSubDir, "gensrcs.d") + depFixerTool := ctx.Config().HostToolPath(ctx, "dep_fixer") + fullCommand += fmt.Sprintf(" && %s -o $(depfile) %s", + depFixerTool.String(), strings.Join(commandDepFiles, " ")) + extraTools = append(extraTools, depFixerTool) + } + generateTasks = append(generateTasks, generateTask{ - in: shard, - out: outFiles, - depFile: depFile, - copyTo: copyTo, - genDir: genDir, - cmd: fullCommand, - shard: i, - shards: len(shards), + in: shard, + out: outFiles, + depFile: outputDepfile, + copyTo: copyTo, + genDir: genDir, + cmd: fullCommand, + shard: i, + shards: len(shards), + extraTools: extraTools, }) } diff --git a/python/androidmk.go b/python/androidmk.go index 040b6bef8..e60c5385b 100644 --- a/python/androidmk.go +++ b/python/androidmk.go @@ -15,8 +15,6 @@ package python import ( - "fmt" - "io" "path/filepath" "strings" @@ -24,86 +22,72 @@ import ( ) type subAndroidMkProvider interface { - AndroidMk(*Module, *android.AndroidMkData) + AndroidMk(*Module, *android.AndroidMkEntries) } -func (p *Module) subAndroidMk(data *android.AndroidMkData, obj interface{}) { +func (p *Module) subAndroidMk(entries *android.AndroidMkEntries, obj interface{}) { if p.subAndroidMkOnce == nil { p.subAndroidMkOnce = make(map[subAndroidMkProvider]bool) } if androidmk, ok := obj.(subAndroidMkProvider); ok { if !p.subAndroidMkOnce[androidmk] { p.subAndroidMkOnce[androidmk] = true - androidmk.AndroidMk(p, data) + androidmk.AndroidMk(p, entries) } } } -func (p *Module) AndroidMk() android.AndroidMkData { - ret := android.AndroidMkData{OutputFile: p.installSource} +func (p *Module) AndroidMkEntries() []android.AndroidMkEntries { + entries := android.AndroidMkEntries{OutputFile: p.installSource} - p.subAndroidMk(&ret, p.installer) + p.subAndroidMk(&entries, p.installer) - return ret + return []android.AndroidMkEntries{entries} } -func (p *binaryDecorator) AndroidMk(base *Module, ret *android.AndroidMkData) { - ret.Class = "EXECUTABLES" +func (p *binaryDecorator) AndroidMk(base *Module, entries *android.AndroidMkEntries) { + entries.Class = "EXECUTABLES" - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if len(p.binaryProperties.Test_suites) > 0 { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=", - strings.Join(p.binaryProperties.Test_suites, " ")) - } + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", p.binaryProperties.Test_suites...) }) - base.subAndroidMk(ret, p.pythonInstaller) + base.subAndroidMk(entries, p.pythonInstaller) } -func (p *testDecorator) AndroidMk(base *Module, ret *android.AndroidMkData) { - ret.Class = "NATIVE_TESTS" +func (p *testDecorator) AndroidMk(base *Module, entries *android.AndroidMkEntries) { + entries.Class = "NATIVE_TESTS" - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if len(p.binaryDecorator.binaryProperties.Test_suites) > 0 { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=", - strings.Join(p.binaryDecorator.binaryProperties.Test_suites, " ")) - } + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", p.binaryDecorator.binaryProperties.Test_suites...) if p.testConfig != nil { - fmt.Fprintln(w, "LOCAL_FULL_TEST_CONFIG :=", - p.testConfig.String()) + entries.SetString("LOCAL_FULL_TEST_CONFIG", p.testConfig.String()) } - if !BoolDefault(p.binaryProperties.Auto_gen_config, true) { - fmt.Fprintln(w, "LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG := true") - } + entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(p.binaryProperties.Auto_gen_config, true)) - if len(p.data) > 0 { - fmt.Fprintln(w, "LOCAL_TEST_DATA :=", - strings.Join(android.AndroidMkDataPaths(p.data), " ")) - } + entries.AddStrings("LOCAL_TEST_DATA", android.AndroidMkDataPaths(p.data)...) - if Bool(p.testProperties.Test_options.Unit_test) { - fmt.Fprintln(w, "LOCAL_IS_UNIT_TEST := true") - } + entries.SetBoolIfTrue("LOCAL_IS_UNIT_TEST", Bool(p.testProperties.Test_options.Unit_test)) }) - base.subAndroidMk(ret, p.binaryDecorator.pythonInstaller) + base.subAndroidMk(entries, p.binaryDecorator.pythonInstaller) } -func (installer *pythonInstaller) AndroidMk(base *Module, ret *android.AndroidMkData) { +func (installer *pythonInstaller) AndroidMk(base *Module, entries *android.AndroidMkEntries) { // Soong installation is only supported for host modules. Have Make // installation trigger Soong installation. if base.Target().Os.Class == android.Host { - ret.OutputFile = android.OptionalPathForPath(installer.path) + entries.OutputFile = android.OptionalPathForPath(installer.path) } - ret.Required = append(ret.Required, "libc++") - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { + entries.Required = append(entries.Required, "libc++") + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { path, file := filepath.Split(installer.path.ToMakePath().String()) stem := strings.TrimSuffix(file, filepath.Ext(file)) - fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+filepath.Ext(file)) - fmt.Fprintln(w, "LOCAL_MODULE_PATH := "+path) - fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) - fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(installer.androidMkSharedLibs, " ")) - fmt.Fprintln(w, "LOCAL_CHECK_ELF_FILES := false") + entries.SetString("LOCAL_MODULE_SUFFIX", filepath.Ext(file)) + entries.SetString("LOCAL_MODULE_PATH", path) + entries.SetString("LOCAL_MODULE_STEM", stem) + entries.AddStrings("LOCAL_SHARED_LIBRARIES", installer.androidMkSharedLibs...) + entries.SetBool("LOCAL_CHECK_ELF_FILES", false) }) } diff --git a/python/python.go b/python/python.go index c27a09641..7e376c608 100644 --- a/python/python.go +++ b/python/python.go @@ -197,7 +197,7 @@ func (p *Module) GetSrcsZip() android.Path { var _ PythonDependency = (*Module)(nil) -var _ android.AndroidMkDataProvider = (*Module)(nil) +var _ android.AndroidMkEntriesProvider = (*Module)(nil) func (p *Module) Init() android.Module { diff --git a/rust/androidmk.go b/rust/androidmk.go index f98360a32..74cd9bfa6 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -15,10 +15,7 @@ package rust import ( - "fmt" - "io" "path/filepath" - "strings" "android/soong/android" ) @@ -26,14 +23,14 @@ import ( type AndroidMkContext interface { Name() string Target() android.Target - SubAndroidMk(*android.AndroidMkData, interface{}) + SubAndroidMk(*android.AndroidMkEntries, interface{}) } type SubAndroidMkProvider interface { - AndroidMk(AndroidMkContext, *android.AndroidMkData) + AndroidMk(AndroidMkContext, *android.AndroidMkEntries) } -func (mod *Module) SubAndroidMk(data *android.AndroidMkData, obj interface{}) { +func (mod *Module) SubAndroidMk(data *android.AndroidMkEntries, obj interface{}) { if mod.subAndroidMkOnce == nil { mod.subAndroidMkOnce = make(map[SubAndroidMkProvider]bool) } @@ -45,33 +42,22 @@ func (mod *Module) SubAndroidMk(data *android.AndroidMkData, obj interface{}) { } } -func (mod *Module) AndroidMk() android.AndroidMkData { +func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries { if mod.Properties.HideFromMake { - return android.AndroidMkData{ - Disabled: true, - } + + return []android.AndroidMkEntries{android.AndroidMkEntries{Disabled: true}} } - ret := android.AndroidMkData{ + ret := android.AndroidMkEntries{ OutputFile: mod.outputFile, Include: "$(BUILD_SYSTEM)/soong_rust_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - if len(mod.Properties.AndroidMkRlibs) > 0 { - fmt.Fprintln(w, "LOCAL_RLIB_LIBRARIES := "+strings.Join(mod.Properties.AndroidMkRlibs, " ")) - } - if len(mod.Properties.AndroidMkDylibs) > 0 { - fmt.Fprintln(w, "LOCAL_DYLIB_LIBRARIES := "+strings.Join(mod.Properties.AndroidMkDylibs, " ")) - } - if len(mod.Properties.AndroidMkProcMacroLibs) > 0 { - fmt.Fprintln(w, "LOCAL_PROC_MACRO_LIBRARIES := "+strings.Join(mod.Properties.AndroidMkProcMacroLibs, " ")) - } - if len(mod.Properties.AndroidMkSharedLibs) > 0 { - fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(mod.Properties.AndroidMkSharedLibs, " ")) - } - if len(mod.Properties.AndroidMkStaticLibs) > 0 { - fmt.Fprintln(w, "LOCAL_STATIC_LIBRARIES := "+strings.Join(mod.Properties.AndroidMkStaticLibs, " ")) - } + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_RLIB_LIBRARIES", mod.Properties.AndroidMkRlibs...) + entries.AddStrings("LOCAL_DYLIB_LIBRARIES", mod.Properties.AndroidMkDylibs...) + entries.AddStrings("LOCAL_PROC_MACRO_LIBRARIES", mod.Properties.AndroidMkProcMacroLibs...) + entries.AddStrings("LOCAL_SHARED_LIBRARIES", mod.Properties.AndroidMkSharedLibs...) + entries.AddStrings("LOCAL_STATIC_LIBRARIES", mod.Properties.AndroidMkStaticLibs...) }, }, } @@ -84,10 +70,10 @@ func (mod *Module) AndroidMk() android.AndroidMkData { } ret.SubName += mod.Properties.SubName - return ret + return []android.AndroidMkEntries{ret} } -func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, binary.baseCompiler) if binary.distFile.Valid() { @@ -95,35 +81,26 @@ func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Andr } ret.Class = "EXECUTABLES" - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if binary.coverageOutputZipFile.Valid() { - fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE := "+binary.coverageOutputZipFile.String()) - } + ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.SetOptionalPath("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputZipFile) }) } -func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { test.binaryDecorator.AndroidMk(ctx, ret) ret.Class = "NATIVE_TESTS" - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if len(test.Properties.Test_suites) > 0 { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=", - strings.Join(test.Properties.Test_suites, " ")) - } + ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", test.Properties.Test_suites...) if test.testConfig != nil { - fmt.Fprintln(w, "LOCAL_FULL_TEST_CONFIG :=", test.testConfig.String()) - } - if !BoolDefault(test.Properties.Auto_gen_config, true) { - fmt.Fprintln(w, "LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG := true") - } - if Bool(test.Properties.Test_options.Unit_test) { - fmt.Fprintln(w, "LOCAL_IS_UNIT_TEST := true") + entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String()) } + entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(test.Properties.Auto_gen_config, true)) + entries.SetBoolIfTrue("LOCAL_IS_UNIT_TEST", Bool(test.Properties.Test_options.Unit_test)) }) // TODO(chh): add test data with androidMkWriteTestData(test.data, ctx, ret) } -func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, library.baseCompiler) if library.rlib() { @@ -140,15 +117,12 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An ret.DistFiles = android.MakeDefaultDistFiles(library.distFile.Path()) } - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if library.coverageOutputZipFile.Valid() { - fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE := "+library.coverageOutputZipFile.String()) - } - + ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.SetOptionalPath("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputZipFile) }) } -func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, procMacro.baseCompiler) ret.Class = "PROC_MACRO_LIBRARIES" @@ -158,29 +132,29 @@ func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *androi } -func (sourceProvider *BaseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (sourceProvider *BaseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { outFile := sourceProvider.OutputFiles[0] ret.Class = "ETC" ret.OutputFile = android.OptionalPathForPath(outFile) ret.SubName += sourceProvider.subName - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { + ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { _, file := filepath.Split(outFile.String()) stem, suffix, _ := android.SplitFileExt(file) - fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) - fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) - fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") + entries.SetString("LOCAL_MODULE_SUFFIX", suffix) + entries.SetString("LOCAL_MODULE_STEM", stem) + entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) }) } -func (bindgen *bindgenDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (bindgen *bindgenDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, bindgen.BaseSourceProvider) } -func (proto *protobufDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (proto *protobufDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, proto.BaseSourceProvider) } -func (compiler *baseCompiler) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { +func (compiler *baseCompiler) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { if compiler.path == (android.InstallPath{}) { return } @@ -194,14 +168,12 @@ func (compiler *baseCompiler) AndroidMk(ctx AndroidMkContext, ret *android.Andro unstrippedOutputFile = ret.OutputFile ret.OutputFile = compiler.strippedOutputFile } - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - if compiler.strippedOutputFile.Valid() { - fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", unstrippedOutputFile) - } + ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { + entries.SetOptionalPath("LOCAL_SOONG_UNSTRIPPED_BINARY", unstrippedOutputFile) path, file := filepath.Split(compiler.path.ToMakePath().String()) stem, suffix, _ := android.SplitFileExt(file) - fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) - fmt.Fprintln(w, "LOCAL_MODULE_PATH := "+path) - fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) + entries.SetString("LOCAL_MODULE_SUFFIX", suffix) + entries.SetString("LOCAL_MODULE_PATH", path) + entries.SetString("LOCAL_MODULE_STEM", stem) }) } diff --git a/rust/project_json.go b/rust/project_json.go index 569740831..8d9e50ca9 100644 --- a/rust/project_json.go +++ b/rust/project_json.go @@ -109,6 +109,10 @@ func (singleton *projectGeneratorSingleton) mergeDependencies(ctx android.Single if !ok { return } + // Skip intra-module dependencies (i.e., generated-source library depending on the source variant). + if module.Name() == child.Name() { + return + } if _, ok = deps[ctx.ModuleName(child)]; ok { return } diff --git a/rust/project_json_test.go b/rust/project_json_test.go index 69288fcfa..16699c19a 100644 --- a/rust/project_json_test.go +++ b/rust/project_json_test.go @@ -131,6 +131,22 @@ func TestProjectJsonBindGen(t *testing.T) { t.Errorf("The source path for libbindings2 does not contain the BuildOs, got %v; want %v", rootModule, android.BuildOs.String()) } + // Check that libbindings1 does not depend on itself. + if strings.Contains(rootModule, "libbindings1") { + deps, ok := crate["deps"].([]interface{}) + if !ok { + t.Errorf("Unexpected format for deps: %v", crate["deps"]) + } + for _, dep := range deps { + d, ok := dep.(map[string]interface{}) + if !ok { + t.Errorf("Unexpected format for dep: %v", dep) + } + if d["name"] == "bindings1" { + t.Errorf("libbindings1 depends on itself") + } + } + } } } |