diff --git a/android/config.go b/android/config.go index a4990576e..e87a4ac2a 100644 --- a/android/config.go +++ b/android/config.go @@ -974,13 +974,21 @@ func (c *config) ModulesLoadedByPrivilegedModules() []string { return c.productVariables.ModulesLoadedByPrivilegedModules } -func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) { +func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath { if c.productVariables.DexpreoptGlobalConfig == nil { + return OptionalPathForPath(nil) + } + return OptionalPathForPath( + pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig)) +} + +func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) { + path := c.DexpreoptGlobalConfigPath(ctx) + if !path.Valid() { return nil, nil } - path := absolutePath(*c.productVariables.DexpreoptGlobalConfig) - ctx.AddNinjaFileDeps(path) - return ioutil.ReadFile(path) + ctx.AddNinjaFileDeps(path.String()) + return ioutil.ReadFile(absolutePath(path.String())) } func (c *config) FrameworksBaseDirExists(ctx PathContext) bool { diff --git a/android/writedocs.go b/android/writedocs.go index 4eb15e61d..91c2318f1 100644 --- a/android/writedocs.go +++ b/android/writedocs.go @@ -48,6 +48,13 @@ func (c *docsSingleton) GenerateBuildActions(ctx SingletonContext) { deps = append(deps, pathForBuildToolDep(ctx, ctx.Config().moduleListFile)) deps = append(deps, pathForBuildToolDep(ctx, ctx.Config().ProductVariablesFileName)) + // The dexpreopt configuration may not exist, but if it does, it's a dependency + // of soong_build. + dexpreoptConfigPath := ctx.Config().DexpreoptGlobalConfigPath(ctx) + if dexpreoptConfigPath.Valid() { + deps = append(deps, dexpreoptConfigPath.Path()) + } + // Generate build system docs for the primary builder. Generating docs reads the source // files used to build the primary builder, but that dependency will be picked up through // the dependency on the primary builder itself. There are no dependencies on the diff --git a/ui/build/test_build.go b/ui/build/test_build.go index 83b38071f..31646802e 100644 --- a/ui/build/test_build.go +++ b/ui/build/test_build.go @@ -68,6 +68,12 @@ func testForDanglingRules(ctx Context, config Config) { miniBootstrapDir := filepath.Join(outDir, "soong", ".minibootstrap") modulePathsDir := filepath.Join(outDir, ".module_paths") variablesFilePath := filepath.Join(outDir, "soong", "soong.variables") + // dexpreopt.config is an input to the soong_docs action, which runs the + // soong_build primary builder. However, this file is created from $(shell) + // invocation at Kati parse time, so it's not an explicit output of any + // Ninja action, but it is present during the build itself and can be + // treated as an source file. + dexpreoptConfigFilePath := filepath.Join(outDir, "soong", "dexpreopt.config") danglingRules := make(map[string]bool) @@ -81,7 +87,8 @@ func testForDanglingRules(ctx Context, config Config) { if strings.HasPrefix(line, bootstrapDir) || strings.HasPrefix(line, miniBootstrapDir) || strings.HasPrefix(line, modulePathsDir) || - line == variablesFilePath { + line == variablesFilePath || + line == dexpreoptConfigFilePath { // Leaf node is in one of Soong's bootstrap directories, which do not have // full build rules in the primary build.ninja file. continue