1*1fa6dee9SAndroid Build Coastguard Workerpackage bootstrap 2*1fa6dee9SAndroid Build Coastguard Worker 3*1fa6dee9SAndroid Build Coastguard Workerimport ( 4*1fa6dee9SAndroid Build Coastguard Worker "fmt" 5*1fa6dee9SAndroid Build Coastguard Worker "maps" 6*1fa6dee9SAndroid Build Coastguard Worker "path/filepath" 7*1fa6dee9SAndroid Build Coastguard Worker "reflect" 8*1fa6dee9SAndroid Build Coastguard Worker 9*1fa6dee9SAndroid Build Coastguard Worker "github.com/google/blueprint" 10*1fa6dee9SAndroid Build Coastguard Worker "github.com/google/blueprint/bootstrap/bpdoc" 11*1fa6dee9SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 12*1fa6dee9SAndroid Build Coastguard Worker) 13*1fa6dee9SAndroid Build Coastguard Worker 14*1fa6dee9SAndroid Build Coastguard Worker// ModuleTypeDocs returns a list of bpdoc.ModuleType objects that contain information relevant 15*1fa6dee9SAndroid Build Coastguard Worker// to generating documentation for module types supported by the primary builder. 16*1fa6dee9SAndroid Build Coastguard Workerfunc ModuleTypeDocs(ctx *blueprint.Context, factories map[string]reflect.Value) ([]*bpdoc.Package, error) { 17*1fa6dee9SAndroid Build Coastguard Worker // Find the module that's marked as the "primary builder", which means it's 18*1fa6dee9SAndroid Build Coastguard Worker // creating the binary that we'll use to generate the non-bootstrap 19*1fa6dee9SAndroid Build Coastguard Worker // build.ninja file. 20*1fa6dee9SAndroid Build Coastguard Worker var primaryBuilders []blueprint.Module 21*1fa6dee9SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module blueprint.Module) { 22*1fa6dee9SAndroid Build Coastguard Worker if ctx.PrimaryModule(module) == module { 23*1fa6dee9SAndroid Build Coastguard Worker if _, ok := blueprint.SingletonModuleProvider(ctx, module, PrimaryBuilderProvider); ok { 24*1fa6dee9SAndroid Build Coastguard Worker primaryBuilders = append(primaryBuilders, module) 25*1fa6dee9SAndroid Build Coastguard Worker } 26*1fa6dee9SAndroid Build Coastguard Worker } 27*1fa6dee9SAndroid Build Coastguard Worker }) 28*1fa6dee9SAndroid Build Coastguard Worker 29*1fa6dee9SAndroid Build Coastguard Worker var primaryBuilder blueprint.Module 30*1fa6dee9SAndroid Build Coastguard Worker switch len(primaryBuilders) { 31*1fa6dee9SAndroid Build Coastguard Worker case 0: 32*1fa6dee9SAndroid Build Coastguard Worker return nil, fmt.Errorf("no primary builder module present") 33*1fa6dee9SAndroid Build Coastguard Worker 34*1fa6dee9SAndroid Build Coastguard Worker case 1: 35*1fa6dee9SAndroid Build Coastguard Worker primaryBuilder = primaryBuilders[0] 36*1fa6dee9SAndroid Build Coastguard Worker 37*1fa6dee9SAndroid Build Coastguard Worker default: 38*1fa6dee9SAndroid Build Coastguard Worker return nil, fmt.Errorf("multiple primary builder modules present") 39*1fa6dee9SAndroid Build Coastguard Worker } 40*1fa6dee9SAndroid Build Coastguard Worker 41*1fa6dee9SAndroid Build Coastguard Worker pkgFiles := make(map[string][]string) 42*1fa6dee9SAndroid Build Coastguard Worker ctx.VisitDepsDepthFirst(primaryBuilder, func(module blueprint.Module) { 43*1fa6dee9SAndroid Build Coastguard Worker if info, ok := blueprint.SingletonModuleProvider(ctx, module, DocsPackageProvider); ok { 44*1fa6dee9SAndroid Build Coastguard Worker pkgFiles[info.PkgPath] = pathtools.PrefixPaths(info.Srcs, 45*1fa6dee9SAndroid Build Coastguard Worker filepath.Join(ctx.SrcDir(), ctx.ModuleDir(module))) 46*1fa6dee9SAndroid Build Coastguard Worker } 47*1fa6dee9SAndroid Build Coastguard Worker }) 48*1fa6dee9SAndroid Build Coastguard Worker 49*1fa6dee9SAndroid Build Coastguard Worker mergedFactories := maps.Clone(factories) 50*1fa6dee9SAndroid Build Coastguard Worker 51*1fa6dee9SAndroid Build Coastguard Worker for moduleType, factory := range ctx.ModuleTypeFactories() { 52*1fa6dee9SAndroid Build Coastguard Worker if _, exists := mergedFactories[moduleType]; !exists { 53*1fa6dee9SAndroid Build Coastguard Worker mergedFactories[moduleType] = reflect.ValueOf(factory) 54*1fa6dee9SAndroid Build Coastguard Worker } 55*1fa6dee9SAndroid Build Coastguard Worker } 56*1fa6dee9SAndroid Build Coastguard Worker 57*1fa6dee9SAndroid Build Coastguard Worker return bpdoc.AllPackages(pkgFiles, mergedFactories, ctx.ModuleTypePropertyStructs()) 58*1fa6dee9SAndroid Build Coastguard Worker} 59