diff --git a/android/config.go b/android/config.go index 16f3d7321..c25900b57 100644 --- a/android/config.go +++ b/android/config.go @@ -93,8 +93,9 @@ type config struct { deviceConfig *deviceConfig - srcDir string // the path of the root source directory - buildDir string // the path of the build output directory + srcDir string // the path of the root source directory + buildDir string // the path of the build output directory + moduleListFile string // the path to the file which lists blueprint files to parse. env map[string]string envLock sync.Mutex @@ -316,7 +317,7 @@ func TestArchConfig(buildDir string, env map[string]string, bp string, fs map[st // New creates a new Config object. The srcDir argument specifies the path to // the root source directory. It also loads the config file, if found. -func NewConfig(srcDir, buildDir string) (Config, error) { +func NewConfig(srcDir, buildDir string, moduleListFile string) (Config, error) { // Make a config with default options config := &config{ ConfigFileName: filepath.Join(buildDir, configFileName), @@ -328,7 +329,8 @@ func NewConfig(srcDir, buildDir string) (Config, error) { buildDir: buildDir, multilibConflicts: make(map[ArchType]bool), - fs: pathtools.NewOsFs(absSrcDir), + moduleListFile: moduleListFile, + fs: pathtools.NewOsFs(absSrcDir), } config.deviceConfig = &deviceConfig{ diff --git a/android/paths.go b/android/paths.go index bed6f3f58..8d2725b9a 100644 --- a/android/paths.go +++ b/android/paths.go @@ -904,6 +904,22 @@ func (p OutputPath) buildDir() string { var _ Path = OutputPath{} var _ WritablePath = OutputPath{} +// toolDepPath is a Path representing a dependency of the build tool. +type toolDepPath struct { + basePath +} + +var _ Path = toolDepPath{} + +// pathForBuildToolDep returns a toolDepPath representing the given path string. +// There is no validation for the path, as it is "trusted": It may fail +// normal validation checks. For example, it may be an absolute path. +// Only use this function to construct paths for dependencies of the build +// tool invocation. +func pathForBuildToolDep(ctx PathContext, path string) toolDepPath { + return toolDepPath{basePath{path, ctx.Config(), ""}} +} + // PathForOutput joins the provided paths and returns an OutputPath that is // validated to not escape the build dir. // On error, it will return a usable, but invalid OutputPath, and report a ModuleError. diff --git a/android/writedocs.go b/android/writedocs.go index 9e43e80a6..4eb15e61d 100644 --- a/android/writedocs.go +++ b/android/writedocs.go @@ -44,6 +44,10 @@ func primaryBuilderPath(ctx SingletonContext) Path { } func (c *docsSingleton) GenerateBuildActions(ctx SingletonContext) { + var deps Paths + deps = append(deps, pathForBuildToolDep(ctx, ctx.Config().moduleListFile)) + deps = append(deps, pathForBuildToolDep(ctx, ctx.Config().ProductVariablesFileName)) + // 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 @@ -63,6 +67,7 @@ func (c *docsSingleton) GenerateBuildActions(ctx SingletonContext) { ctx.Build(pctx, BuildParams{ Rule: soongDocs, Output: docsFile, + Inputs: deps, Args: map[string]string{ "outDir": PathForOutput(ctx, "docs").String(), }, diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 905f2068b..532d9e486 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -59,7 +59,7 @@ func main() { ctx := android.NewContext() ctx.Register() - configuration, err := android.NewConfig(srcDir, bootstrap.BuildDir) + configuration, err := android.NewConfig(srcDir, bootstrap.BuildDir, bootstrap.ModuleListFile) if err != nil { fmt.Fprintf(os.Stderr, "%s", err) os.Exit(1) diff --git a/ui/build/test_build.go b/ui/build/test_build.go index 4ff948343..83b38071f 100644 --- a/ui/build/test_build.go +++ b/ui/build/test_build.go @@ -66,6 +66,8 @@ func testForDanglingRules(ctx Context, config Config) { outDir := config.OutDir() bootstrapDir := filepath.Join(outDir, "soong", ".bootstrap") miniBootstrapDir := filepath.Join(outDir, "soong", ".minibootstrap") + modulePathsDir := filepath.Join(outDir, ".module_paths") + variablesFilePath := filepath.Join(outDir, "soong", "soong.variables") danglingRules := make(map[string]bool) @@ -76,7 +78,10 @@ func testForDanglingRules(ctx Context, config Config) { // Leaf node is not in the out directory. continue } - if strings.HasPrefix(line, bootstrapDir) || strings.HasPrefix(line, miniBootstrapDir) { + if strings.HasPrefix(line, bootstrapDir) || + strings.HasPrefix(line, miniBootstrapDir) || + strings.HasPrefix(line, modulePathsDir) || + line == variablesFilePath { // Leaf node is in one of Soong's bootstrap directories, which do not have // full build rules in the primary build.ninja file. continue