func phonyGoTarget(ctx blueprint.ModuleContext, target string, srcs []string, gensrcs []string, intermediates []string) { var depTargets []string ctx.VisitDepsDepthFirstIf(isGoPackageProducer, func(module blueprint.Module) { dep := module.(goPackageProducer) target := dep.GoPackageTarget() depTargets = append(depTargets, target) }) moduleDir := ctx.ModuleDir() srcs = pathtools.PrefixPaths(srcs, filepath.Join("$srcDir", moduleDir)) srcs = append(srcs, gensrcs...) ctx.Build(pctx, blueprint.BuildParams{ Rule: phony, Outputs: []string{target}, Inputs: srcs, Implicits: depTargets, }) // If one of the source files gets deleted or renamed that will prevent the // re-bootstrapping happening because it depends on the missing source file. // To get around this we add a build statement using the built-in phony rule // for each source file, which will cause Ninja to treat it as dirty if its // missing. for _, src := range srcs { ctx.Build(pctx, blueprint.BuildParams{ Rule: blueprint.Phony, Outputs: []string{src}, }) } // If there is no rule to build the intermediate files of a bootstrap go package // the cleanup phase of the primary builder will delete the intermediate files, // forcing an unnecessary rebuild. Add phony rules for all of them. for _, intermediate := range intermediates { ctx.Build(pctx, blueprint.BuildParams{ Rule: blueprint.Phony, Outputs: []string{intermediate}, }) } }
// moduleSrcDir returns the path of the directory that all source file paths are // specified relative to. func moduleSrcDir(ctx blueprint.ModuleContext) string { return filepath.Join("$srcDir", ctx.ModuleDir()) }