| package bootstrap |
| |
| import ( |
| "fmt" |
| "path/filepath" |
| |
| "github.com/google/blueprint" |
| "github.com/google/blueprint/bootstrap/bpdoc" |
| "github.com/google/blueprint/pathtools" |
| ) |
| |
| func writeDocs(ctx *blueprint.Context, srcDir, filename string) error { |
| // Find the module that's marked as the "primary builder", which means it's |
| // creating the binary that we'll use to generate the non-bootstrap |
| // build.ninja file. |
| var primaryBuilders []*goBinary |
| var minibp *goBinary |
| ctx.VisitAllModulesIf(isBootstrapBinaryModule, |
| func(module blueprint.Module) { |
| binaryModule := module.(*goBinary) |
| if binaryModule.properties.PrimaryBuilder { |
| primaryBuilders = append(primaryBuilders, binaryModule) |
| } |
| if ctx.ModuleName(binaryModule) == "minibp" { |
| minibp = binaryModule |
| } |
| }) |
| |
| if minibp == nil { |
| panic("missing minibp") |
| } |
| |
| var primaryBuilder *goBinary |
| switch len(primaryBuilders) { |
| case 0: |
| // If there's no primary builder module then that means we'll use minibp |
| // as the primary builder. |
| primaryBuilder = minibp |
| |
| case 1: |
| primaryBuilder = primaryBuilders[0] |
| |
| default: |
| return fmt.Errorf("multiple primary builder modules present") |
| } |
| |
| pkgFiles := make(map[string][]string) |
| ctx.VisitDepsDepthFirst(primaryBuilder, func(module blueprint.Module) { |
| switch m := module.(type) { |
| case (*goPackage): |
| pkgFiles[m.properties.PkgPath] = pathtools.PrefixPaths(m.properties.Srcs, |
| filepath.Join(srcDir, ctx.ModuleDir(m))) |
| default: |
| panic(fmt.Errorf("unknown dependency type %T", module)) |
| } |
| }) |
| |
| return bpdoc.Write(filename, pkgFiles, ctx.ModuleTypePropertyStructs()) |
| } |