aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/soong_build/writedocs.go154
1 files changed, 109 insertions, 45 deletions
diff --git a/cmd/soong_build/writedocs.go b/cmd/soong_build/writedocs.go
index 74c854a3..de2182fe 100644
--- a/cmd/soong_build/writedocs.go
+++ b/cmd/soong_build/writedocs.go
@@ -19,6 +19,7 @@ import (
"bytes"
"html/template"
"io/ioutil"
+ "path/filepath"
"reflect"
"sort"
@@ -26,6 +27,11 @@ import (
"github.com/google/blueprint/bootstrap/bpdoc"
)
+type perPackageTemplateData struct {
+ Name string
+ Modules []moduleTypeTemplateData
+}
+
type moduleTypeTemplateData struct {
Name string
Synopsis string
@@ -44,22 +50,7 @@ var propertyRank = map[string]int{
}
// For each module type, extract its documentation and convert it to the template data.
-func moduleTypeDocsToTemplates(ctx *android.Context) ([]moduleTypeTemplateData, error) {
- moduleTypeFactories := android.ModuleTypeFactories()
- bpModuleTypeFactories := make(map[string]reflect.Value)
- for moduleType, factory := range moduleTypeFactories {
- bpModuleTypeFactories[moduleType] = reflect.ValueOf(factory)
- }
-
- packages, err := bootstrap.ModuleTypeDocs(ctx.Context, bpModuleTypeFactories)
- if err != nil {
- return []moduleTypeTemplateData{}, err
- }
- var moduleTypeList []*bpdoc.ModuleType
- for _, pkg := range packages {
- moduleTypeList = append(moduleTypeList, pkg.ModuleTypes...)
- }
-
+func moduleTypeDocsToTemplates(moduleTypeList []*bpdoc.ModuleType) []moduleTypeTemplateData {
result := make([]moduleTypeTemplateData, 0)
// Combine properties from all PropertyStruct's and reorder them -- first the ones
@@ -101,39 +92,121 @@ func moduleTypeDocsToTemplates(ctx *android.Context) ([]moduleTypeTemplateData,
result = append(result, item)
}
sort.Slice(result, func(i, j int) bool { return result[i].Name < result[j].Name })
- return result, err
+ return result
}
func writeDocs(ctx *android.Context, filename string) error {
- buf := &bytes.Buffer{}
+ moduleTypeFactories := android.ModuleTypeFactories()
+ bpModuleTypeFactories := make(map[string]reflect.Value)
+ for moduleType, factory := range moduleTypeFactories {
+ bpModuleTypeFactories[moduleType] = reflect.ValueOf(factory)
+ }
+
+ packages, err := bootstrap.ModuleTypeDocs(ctx.Context, bpModuleTypeFactories)
+ if err != nil {
+ return err
+ }
- // We need a module name getter/setter function because I couldn't
- // find a way to keep it in a variable defined within the template.
- currentModuleName := ""
- data, err := moduleTypeDocsToTemplates(ctx)
+ // Produce the top-level, package list page first.
+ tmpl, err := template.New("file").Parse(packageListTemplate)
if err != nil {
return err
}
- tmpl, err := template.New("file").Funcs(map[string]interface{}{
- "setModule": func(moduleName string) string {
- currentModuleName = moduleName
- return ""
- },
- "getModule": func() string {
- return currentModuleName
- },
- }).Parse(fileTemplate)
+ buf := &bytes.Buffer{}
if err == nil {
- err = tmpl.Execute(buf, data)
+ err = tmpl.Execute(buf, packages)
}
if err == nil {
err = ioutil.WriteFile(filename, buf.Bytes(), 0666)
}
+
+ // Now, produce per-package module lists with detailed information.
+ for _, pkg := range packages {
+ // We need a module name getter/setter function because I couldn't
+ // find a way to keep it in a variable defined within the template.
+ currentModuleName := ""
+ tmpl, err := template.New("file").Funcs(map[string]interface{}{
+ "setModule": func(moduleName string) string {
+ currentModuleName = moduleName
+ return ""
+ },
+ "getModule": func() string {
+ return currentModuleName
+ },
+ }).Parse(perPackageTemplate)
+ if err != nil {
+ return err
+ }
+ buf := &bytes.Buffer{}
+ modules := moduleTypeDocsToTemplates(pkg.ModuleTypes)
+ data := perPackageTemplateData{Name: pkg.Name, Modules: modules}
+ err = tmpl.Execute(buf, data)
+ if err != nil {
+ return err
+ }
+ pkgFileName := filepath.Join(filepath.Dir(filename), pkg.Name+".html")
+ err = ioutil.WriteFile(pkgFileName, buf.Bytes(), 0666)
+ if err != nil {
+ return err
+ }
+ }
return err
}
+// TODO(jungjw): Consider ordering by name.
const (
- fileTemplate = `
+ packageListTemplate = `
+<html>
+<head>
+<title>Build Docs</title>
+<link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/vc67ef93e81a468795c57df87eca3f8427d65cbe85f09fbb51c82a12b89aa3d7e/androidsource/css/app.css">
+<style>
+#main {
+ padding: 48px;
+}
+
+table{
+ table-layout: fixed;
+}
+
+td {
+ word-wrap:break-word;
+}
+</style>
+</head>
+<body>
+<div id="main">
+<H1>Soong Modules Reference</H1>
+The latest versions of Android use the Soong build system, which greatly simplifies build
+configuration over the previous Make-based system. This site contains the generated reference
+files for the Soong build system.
+
+<table class="module_types" summary="Table of Soong module types sorted by package">
+ <thead>
+ <tr>
+ <th style="width:20%">Package</th>
+ <th style="width:80%">Module types</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{range $pkg := .}}
+ <tr>
+ <td>{{.Path}}</td>
+ <td>
+ {{range $i, $mod := .ModuleTypes}}{{if $i}}, {{end}}<a href="{{$pkg.Name}}.html#{{$mod.Name}}">{{$mod.Name}}</a>{{end}}
+ </td>
+ </tr>
+ {{end}}
+ </tbody>
+</table>
+</div>
+</body>
+</html>
+`
+)
+
+const (
+ perPackageTemplate = `
<html>
<head>
<title>Build Docs</title>
@@ -174,21 +247,13 @@ li a:hover:not(.active) {
<body>
{{- /* Fixed sidebar with module types */ -}}
<ul>
-<li><h3>Module Types:</h3></li>
-{{range $moduleType := .}}<li><a href="#{{$moduleType.Name}}">{{$moduleType.Name}}</a></li>
+<li><h3>{{.Name}} package</h3></li>
+{{range $moduleType := .Modules}}<li><a href="#{{$moduleType.Name}}">{{$moduleType.Name}}</a></li>
{{end -}}
</ul>
{{/* Main panel with H1 section per module type */}}
<div style="margin-left:30ch;padding:1px 16px;">
-<H1>Soong Modules Reference</H1>
-The latest versions of Android use the Soong build system, which greatly simplifies build
-configuration over the previous Make-based system. This site contains the generated reference
-files for the Soong build system.
-<p>
-See the <a href=https://source.android.com/setup/build/build-system>Android Build System</a>
-description for an overview of Soong and examples for its use.
-
-{{range $imodule, $moduleType := .}}
+{{range $moduleType := .Modules}}
{{setModule $moduleType.Name}}
<p>
<h2 id="{{$moduleType.Name}}">{{$moduleType.Name}}</h2>
@@ -225,7 +290,6 @@ description for an overview of Soong and examples for its use.
{{- end}}
{{- end -}}
{{- end -}}
-
</div>
<script>
accordions = document.getElementsByClassName('accordion');