size-report.go raw

   1  package builder
   2  
   3  import (
   4  	_ "embed"
   5  	"fmt"
   6  	"html/template"
   7  	"os"
   8  )
   9  
  10  //go:embed size-report.html
  11  var sizeReportBase string
  12  
  13  func writeSizeReport(sizes *programSize, filename, pkgName string) error {
  14  	tmpl, err := template.New("report").Parse(sizeReportBase)
  15  	if err != nil {
  16  		return err
  17  	}
  18  
  19  	f, err := os.Create(filename)
  20  	if err != nil {
  21  		return fmt.Errorf("could not open report file: %w", err)
  22  	}
  23  	defer f.Close()
  24  
  25  	// Prepare data for the report.
  26  	type sizeLine struct {
  27  		Name string
  28  		Size *packageSize
  29  	}
  30  	programData := []sizeLine{}
  31  	for _, name := range sizes.sortedPackageNames() {
  32  		pkgSize := sizes.Packages[name]
  33  		programData = append(programData, sizeLine{
  34  			Name: name,
  35  			Size: pkgSize,
  36  		})
  37  	}
  38  	sizeTotal := map[string]uint64{
  39  		"code":   sizes.Code,
  40  		"rodata": sizes.ROData,
  41  		"data":   sizes.Data,
  42  		"bss":    sizes.BSS,
  43  		"flash":  sizes.Flash(),
  44  	}
  45  
  46  	// Write the report.
  47  	err = tmpl.Execute(f, map[string]any{
  48  		"pkgName":   pkgName,
  49  		"sizes":     programData,
  50  		"sizeTotal": sizeTotal,
  51  	})
  52  	if err != nil {
  53  		return fmt.Errorf("could not create report file: %w", err)
  54  	}
  55  	return nil
  56  }
  57