You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2019/01/04 18:21:08 UTC
[mynewt-newt] 03/17: builder - reduce scope
This is an automated email from the ASF dual-hosted git repository.
ccollins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git
commit 111666cfc2819d1df71b147377ef44f34a424665
Author: Christopher Collins <cc...@apache.org>
AuthorDate: Tue Nov 20 17:49:16 2018 -0800
builder - reduce scope
It is difficult to reuse parts of the builder package in other parts of
newt (or other tools) because they only work in the context of a longer
sequence of operations.
This commit removes some functionality from the `builder` package. The
following guidelines are observed:
`builder` is only used for operations that directly involve the
Builder's package list or TargetBuilder's dependency graphs. The
builder package no longer knows about higher-level concepts like images
and manifests.
The `builder` package also doesn't read or write files to disk, except
indirectly via the `toolchain` package. Data is passed into and out of
`builder` using data structures and byte slices, not filenames.
---
newt/builder/build.go | 38 +-----
newt/builder/buildutil.go | 2 +-
newt/builder/paths.go | 4 +
newt/builder/size.go | 55 +--------
newt/builder/size_report.go | 1 -
newt/builder/targetbuild.go | 274 +++-----------------------------------------
6 files changed, 21 insertions(+), 353 deletions(-)
diff --git a/newt/builder/build.go b/newt/builder/build.go
index ecedfe8..e1fe17c 100644
--- a/newt/builder/build.go
+++ b/newt/builder/build.go
@@ -29,7 +29,6 @@ import (
log "github.com/Sirupsen/logrus"
- "mynewt.apache.org/newt/newt/image"
"mynewt.apache.org/newt/newt/interfaces"
"mynewt.apache.org/newt/newt/newtutil"
"mynewt.apache.org/newt/newt/pkg"
@@ -92,7 +91,7 @@ func NewBuilder(
for api, rpkg := range apiMap {
bpkg := b.PkgMap[rpkg]
if bpkg == nil {
- for _, rpkg := range b.sortedRpkgs() {
+ for _, rpkg := range b.SortedRpkgs() {
log.Debugf(" * %s", rpkg.Lpkg.Name())
}
return nil, util.FmtNewtError(
@@ -798,41 +797,6 @@ func (b *Builder) buildRomElf(common *symbol.SymbolMap) error {
return nil
}
-func (b *Builder) CreateImage(version string,
- keystrs []string, keyId uint8,
- loaderImg *image.Image) (*image.Image, error) {
-
- img, err := image.NewImage(b.AppBinPath(), b.AppImgPath())
- if err != nil {
- return nil, err
- }
-
- err = img.SetVersion(version)
- if err != nil {
- return nil, err
- }
-
- if len(keystrs) == 1 {
- if err := img.SetKeyV1(keystrs[0], keyId); err != nil {
- return nil, err
- }
- } else {
- if err := img.SetKeys(keystrs); err != nil {
- return nil, err
- }
- }
-
- img.HeaderSize = uint(b.targetBuilder.target.HeaderSize)
- if err := img.Generate(loaderImg); err != nil {
- return nil, err
- }
-
- util.StatusMessage(util.VERBOSITY_DEFAULT,
- "App image succesfully generated: %s\n", img.TargetImg)
-
- return img, nil
-}
-
// Deletes files that should never be reused for a subsequent build. This
// list includes:
// <app>.img
diff --git a/newt/builder/buildutil.go b/newt/builder/buildutil.go
index 113cbfd..260ef53 100644
--- a/newt/builder/buildutil.go
+++ b/newt/builder/buildutil.go
@@ -83,7 +83,7 @@ func (b *Builder) sortedBuildPackages() []*BuildPackage {
return sorter.bpkgs
}
-func (b *Builder) sortedRpkgs() []*resolve.ResolvePackage {
+func (b *Builder) SortedRpkgs() []*resolve.ResolvePackage {
bpkgs := b.sortedBuildPackages()
rpkgs := make([]*resolve.ResolvePackage, len(bpkgs), len(bpkgs))
diff --git a/newt/builder/paths.go b/newt/builder/paths.go
index becba56..17995fe 100644
--- a/newt/builder/paths.go
+++ b/newt/builder/paths.go
@@ -166,6 +166,10 @@ func (b *Builder) AppHexPath() string {
".hex"
}
+func (b *Builder) AppMapPath() string {
+ return b.AppElfPath() + ".map"
+}
+
func (b *Builder) AppBinPath() string {
return b.AppElfPath() + ".bin"
}
diff --git a/newt/builder/size.go b/newt/builder/size.go
index 4753433..8da6f1a 100644
--- a/newt/builder/size.go
+++ b/newt/builder/size.go
@@ -28,9 +28,8 @@ import (
"strconv"
"strings"
- "mynewt.apache.org/newt/newt/image"
- "mynewt.apache.org/newt/util"
"mynewt.apache.org/newt/newt/interfaces"
+ "mynewt.apache.org/newt/util"
)
/*
@@ -420,58 +419,6 @@ func (b *Builder) FindPkgNameByArName(arName string) string {
return filepath.Base(arName)
}
-func (b *Builder) PkgSizes() (*image.ImageManifestSizeCollector, error) {
- if b.appPkg == nil {
- return nil, util.NewNewtError("app package not specified for this target")
- }
-
- if b.targetBuilder.bspPkg.Arch == "sim" {
- return nil, util.NewNewtError("'newt size' not supported for sim targets")
- }
- mapFile := b.AppElfPath() + ".map"
-
- libs, err := ParseMapFileSizes(mapFile)
- if err != nil {
- return nil, err
- }
-
- /*
- * Order libraries by name.
- */
- pkgSizes := make(PkgSizeArray, len(libs))
- i := 0
- for _, es := range libs {
- pkgSizes[i] = es
- i++
- }
- sort.Sort(pkgSizes)
-
- c := image.NewImageManifestSizeCollector()
- for _, es := range pkgSizes {
- p := c.AddPkg(b.FindPkgNameByArName(es.Name))
-
- /*
- * Order symbols by name.
- */
- symbols := make(SymbolDataArray, len(es.Syms))
- i := 0
- for _, sym := range es.Syms {
- symbols[i] = sym
- i++
- }
- sort.Sort(symbols)
- for _, sym := range symbols {
- for area, areaSz := range sym.Sizes {
- if areaSz != 0 {
- p.AddSymbol(sym.ObjName, sym.Name, area, areaSz)
- }
- }
- }
- }
-
- return c, nil
-}
-
func (b *Builder) Size() error {
if b.appPkg == nil {
return util.NewNewtError("app package not specified for this target")
diff --git a/newt/builder/size_report.go b/newt/builder/size_report.go
index 0673fef..d62f5b2 100644
--- a/newt/builder/size_report.go
+++ b/newt/builder/size_report.go
@@ -76,7 +76,6 @@ func runAddr2lineCommand(elfFilePath string, address string) ([]byte, error) {
return cmdOut, err
}
-
func loadSymbolsAndPaths(elfFilePath, pathToStrip string) (map[string]string,
error) {
symbolsPath := make(map[string]string)
diff --git a/newt/builder/targetbuild.go b/newt/builder/targetbuild.go
index 3f10dbb..23c361a 100644
--- a/newt/builder/targetbuild.go
+++ b/newt/builder/targetbuild.go
@@ -24,22 +24,18 @@ import (
"crypto/ecdsa"
"crypto/rsa"
"crypto/x509"
- "encoding/json"
"encoding/pem"
"fmt"
"io/ioutil"
"os"
- "path/filepath"
- "sort"
"strings"
- "time"
log "github.com/Sirupsen/logrus"
- "mynewt.apache.org/newt/newt/flash"
- "mynewt.apache.org/newt/newt/image"
+ "mynewt.apache.org/newt/artifact/flash"
+ "mynewt.apache.org/newt/artifact/image"
+ "mynewt.apache.org/newt/newt/flashmap"
"mynewt.apache.org/newt/newt/interfaces"
- "mynewt.apache.org/newt/newt/newtutil"
"mynewt.apache.org/newt/newt/pkg"
"mynewt.apache.org/newt/newt/project"
"mynewt.apache.org/newt/newt/resolve"
@@ -106,6 +102,10 @@ func NewTargetBuilder(target *target.Target) (*TargetBuilder, error) {
return NewTargetTester(target, nil)
}
+func (t *TargetBuilder) BspPkg() *pkg.BspPackage {
+ return t.bspPkg
+}
+
func (t *TargetBuilder) NewCompiler(dstDir string, buildProfile string) (
*toolchain.Compiler, error) {
@@ -288,7 +288,10 @@ func (t *TargetBuilder) validateAndWriteCfg() error {
}
// Generate flash map.
- if err := t.bspPkg.FlashMap.EnsureWritten(srcDir, incDir,
+ if err := flashmap.EnsureFlashMapWritten(
+ t.bspPkg.FlashMap,
+ srcDir,
+ incDir,
pkg.ShortName(t.target.Package())); err != nil {
return err
@@ -504,11 +507,6 @@ func (t *TargetBuilder) Build() error {
return err
}
- /* Create manifest. */
- if err := t.createManifest(); err != nil {
- return err
- }
-
return nil
}
@@ -522,11 +520,11 @@ func (t *TargetBuilder) RelinkLoader() (error, map[string]bool,
/* fetch symbols from the elf and from the libraries themselves */
log.Debugf("Loader packages:")
- for _, rpkg := range t.LoaderBuilder.sortedRpkgs() {
+ for _, rpkg := range t.LoaderBuilder.SortedRpkgs() {
log.Debugf(" * %s", rpkg.Lpkg.Name())
}
log.Debugf("App packages:")
- for _, rpkg := range t.AppBuilder.sortedRpkgs() {
+ for _, rpkg := range t.AppBuilder.SortedRpkgs() {
log.Debugf(" * %s", rpkg.Lpkg.Name())
}
err, appLibSym := t.AppBuilder.ExtractSymbolInfo()
@@ -651,137 +649,6 @@ func (t *TargetBuilder) InjectSetting(key string, value string) {
t.injectedSettings[key] = value
}
-func readManifest(path string) (*image.ImageManifest, error) {
- content, err := ioutil.ReadFile(path)
- if err != nil {
- return nil, util.ChildNewtError(err)
- }
-
- manifest := &image.ImageManifest{}
- if err := json.Unmarshal(content, &manifest); err != nil {
- return nil, util.FmtNewtError(
- "Failure decoding manifest with path \"%s\": %s", err.Error())
- }
-
- return manifest, nil
-}
-
-func (t *TargetBuilder) createManifest() error {
- manifest := &image.ImageManifest{
- Date: time.Now().Format(time.RFC3339),
- Name: t.GetTarget().FullName(),
- }
-
- rm := image.NewRepoManager()
- for _, rpkg := range t.AppBuilder.sortedRpkgs() {
- manifest.Pkgs = append(manifest.Pkgs,
- rm.GetImageManifestPkg(rpkg.Lpkg))
- }
-
- if t.LoaderBuilder != nil {
- for _, rpkg := range t.LoaderBuilder.sortedRpkgs() {
- manifest.LoaderPkgs = append(manifest.LoaderPkgs,
- rm.GetImageManifestPkg(rpkg.Lpkg))
- }
- }
-
- manifest.Repos = rm.AllRepos()
-
- vars := t.GetTarget().TargetY.AllSettingsAsStrings()
- keys := make([]string, 0, len(vars))
- for k := range vars {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- for _, k := range keys {
- manifest.TgtVars = append(manifest.TgtVars, k+"="+vars[k])
- }
- syscfgKV := t.GetTarget().Package().SyscfgY.GetValStringMapString(
- "syscfg.vals", nil)
- if len(syscfgKV) > 0 {
- tgtSyscfg := fmt.Sprintf("target.syscfg=%s",
- syscfg.KeyValueToStr(syscfgKV))
- manifest.TgtVars = append(manifest.TgtVars, tgtSyscfg)
- }
-
- c, err := t.AppBuilder.PkgSizes()
- if err == nil {
- manifest.PkgSizes = c.Pkgs
- }
- if t.LoaderBuilder != nil {
- c, err = t.LoaderBuilder.PkgSizes()
- if err == nil {
- manifest.LoaderPkgSizes = c.Pkgs
- }
- }
- file, err := os.Create(t.AppBuilder.ManifestPath())
- if err != nil {
- return util.FmtNewtError("Cannot create manifest file %s: %s",
- t.AppBuilder.ManifestPath(), err.Error())
- }
- defer file.Close()
-
- buffer, err := json.MarshalIndent(manifest, "", " ")
- if err != nil {
- return util.FmtNewtError("Cannot encode manifest: %s", err.Error())
- }
- _, err = file.Write(buffer)
- if err != nil {
- return util.FmtNewtError("Cannot write manifest file: %s",
- err.Error())
- }
-
- return nil
-}
-
-// Reads an existing manifest file and augments it with image fields:
-// * Image version
-// * App image path
-// * App image hash
-// * Loader image path
-// * Loader image hash
-// * Build ID
-func (t *TargetBuilder) augmentManifest(
- appImg *image.Image,
- loaderImg *image.Image,
- buildId []byte) error {
-
- manifest, err := readManifest(t.AppBuilder.ManifestPath())
- if err != nil {
- return err
- }
-
- manifest.Version = appImg.Version.String()
- manifest.ImageHash = fmt.Sprintf("%x", appImg.Hash)
- manifest.Image = filepath.Base(appImg.TargetImg)
-
- if loaderImg != nil {
- manifest.Loader = filepath.Base(loaderImg.TargetImg)
- manifest.LoaderHash = fmt.Sprintf("%x", loaderImg.Hash)
- }
-
- manifest.BuildID = fmt.Sprintf("%x", buildId)
-
- file, err := os.Create(t.AppBuilder.ManifestPath())
- if err != nil {
- return util.FmtNewtError("Cannot create manifest file %s: %s",
- t.AppBuilder.ManifestPath(), err.Error())
- }
- defer file.Close()
-
- buffer, err := json.MarshalIndent(manifest, "", " ")
- if err != nil {
- return util.FmtNewtError("Cannot encode manifest: %s", err.Error())
- }
- _, err = file.Write(buffer)
- if err != nil {
- return util.FmtNewtError("Cannot write manifest file: %s",
- err.Error())
- }
-
- return nil
-}
-
// Calculates the size of a single boot trailer. This is the amount of flash
// that must be reserved at the end of each image slot.
func (t *TargetBuilder) bootTrailerSize() int {
@@ -835,7 +702,7 @@ func (t *TargetBuilder) bootTrailerSize() int {
// Calculates the size of the largest image that can be written to each image
// slot.
-func (t *TargetBuilder) maxImgSizes() []int {
+func (t *TargetBuilder) MaxImgSizes() []int {
sz0 := t.bspPkg.FlashMap.Areas[flash.FLASH_AREA_NAME_IMAGE_0].Size
sz1 := t.bspPkg.FlashMap.Areas[flash.FLASH_AREA_NAME_IMAGE_1].Size
trailerSz := t.bootTrailerSize()
@@ -846,119 +713,6 @@ func (t *TargetBuilder) maxImgSizes() []int {
}
}
-// Verifies that each already-built image leaves enough room for a boot trailer
-// a the end of its slot.
-func (t *TargetBuilder) verifyImgSizes(li *image.Image, ai *image.Image) error {
- maxSizes := t.maxImgSizes()
-
- errLines := []string{}
- if li != nil {
- if overflow := int(li.TotalSize) - maxSizes[0]; overflow > 0 {
- errLines = append(errLines,
- fmt.Sprintf("loader overflows slot-0 by %d bytes "+
- "(image=%d max=%d)",
- overflow, li.TotalSize, maxSizes[0]))
- }
- if overflow := int(ai.TotalSize) - maxSizes[1]; overflow > 0 {
- errLines = append(errLines,
- fmt.Sprintf("app overflows slot-1 by %d bytes "+
- "(image=%d max=%d)",
- overflow, ai.TotalSize, maxSizes[1]))
-
- }
- } else {
- if overflow := int(ai.TotalSize) - maxSizes[0]; overflow > 0 {
- errLines = append(errLines,
- fmt.Sprintf("app overflows slot-0 by %d bytes "+
- "(image=%d max=%d)",
- overflow, ai.TotalSize, maxSizes[0]))
- }
- }
-
- if len(errLines) > 0 {
- if !newtutil.NewtForce {
- return util.NewNewtError(strings.Join(errLines, "; "))
- } else {
- for _, e := range errLines {
- util.StatusMessage(util.VERBOSITY_QUIET,
- "* Warning: %s (ignoring due to force flag)\n", e)
- }
- }
- }
-
- return nil
-}
-
-// @return app-image, loader-image, error
-func (t *TargetBuilder) CreateImages(version string,
- keystrs []string, keyId uint8) (*image.Image, *image.Image, error) {
-
- if err := t.Build(); err != nil {
- return nil, nil, err
- }
-
- var err error
- var appImg *image.Image
- var loaderImg *image.Image
-
- c, err := t.NewCompiler("", "")
- if err != nil {
- return nil, nil, err
- }
-
- if t.LoaderBuilder != nil {
- loaderImg, err = t.LoaderBuilder.CreateImage(version, keystrs, keyId,
- nil)
- if err != nil {
- return nil, nil, err
- }
- tgtArea := t.bspPkg.FlashMap.Areas[flash.FLASH_AREA_NAME_IMAGE_0]
- log.Debugf("Convert %s -> %s at offset 0x%x",
- t.LoaderBuilder.AppImgPath(),
- t.LoaderBuilder.AppHexPath(),
- tgtArea.Offset)
- err = c.ConvertBinToHex(t.LoaderBuilder.AppImgPath(),
- t.LoaderBuilder.AppHexPath(), tgtArea.Offset)
- if err != nil {
- log.Errorf("Can't convert to hexfile %s\n", err.Error())
- }
- }
-
- appImg, err = t.AppBuilder.CreateImage(version, keystrs, keyId, loaderImg)
- if err != nil {
- return nil, nil, err
- }
-
- flashTargetArea := ""
- if t.LoaderBuilder == nil {
- flashTargetArea = flash.FLASH_AREA_NAME_IMAGE_0
- } else {
- flashTargetArea = flash.FLASH_AREA_NAME_IMAGE_1
- }
- tgtArea := t.bspPkg.FlashMap.Areas[flashTargetArea]
- if tgtArea.Name != "" {
- log.Debugf("Convert %s -> %s at offset 0x%x",
- t.AppBuilder.AppImgPath(),
- t.AppBuilder.AppHexPath(),
- tgtArea.Offset)
- err = c.ConvertBinToHex(t.AppBuilder.AppImgPath(),
- t.AppBuilder.AppHexPath(), tgtArea.Offset)
- if err != nil {
- log.Errorf("Can't convert to hexfile %s\n", err.Error())
- }
- }
- buildId := image.CreateBuildId(appImg, loaderImg)
- if err := t.augmentManifest(appImg, loaderImg, buildId); err != nil {
- return nil, nil, err
- }
-
- if err := t.verifyImgSizes(loaderImg, appImg); err != nil {
- return nil, nil, err
- }
-
- return appImg, loaderImg, nil
-}
-
func (t *TargetBuilder) CreateDepGraph() (DepGraph, error) {
if err := t.ensureResolved(); err != nil {
return nil, err