xref: /aosp_15_r20/build/blueprint/bootstrap/writedocs.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
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