This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git

commit 4a69df862aed41e37a9b2a9e075457566a8c7cb1
Author: Andrzej Kaczmarek <[email protected]>
AuthorDate: Fri Mar 3 11:20:41 2023 +0100

    builder: Allow to override some bsp settings in target
    
    Target can now override some settings defined in BSP:
    - bsp.compiler
    - bsp.image_offset
    - bsp.image_pad
    - bsp.flash_map
    - bsp.linkerscript
    - bsp.part2linkerscript
    
    To override, simply define the same key in target.yml and it will take
    precedence over the one defined in bsp.yml.
---
 newt/builder/targetbuild.go |  2 +-
 newt/mfg/build.go           |  2 +-
 newt/pkg/bsp_package.go     | 70 ++++++++++++++++++++++++++++++++++-----------
 newt/target/target.go       |  4 +++
 4 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/newt/builder/targetbuild.go b/newt/builder/targetbuild.go
index edd80107..98b96695 100644
--- a/newt/builder/targetbuild.go
+++ b/newt/builder/targetbuild.go
@@ -71,7 +71,7 @@ func NewTargetTester(target *target.Target,
                return nil, err
        }
 
-       bspPkg, err := pkg.NewBspPackage(target.Bsp())
+       bspPkg, err := pkg.NewBspPackage(target.Bsp(), 
target.GetBspYCfgOverride())
        if err != nil {
                return nil, err
        }
diff --git a/newt/mfg/build.go b/newt/mfg/build.go
index 3122687b..ab3ed3a2 100644
--- a/newt/mfg/build.go
+++ b/newt/mfg/build.go
@@ -163,7 +163,7 @@ func calcBsp(dm DecodedMfg,
                return nil, util.FmtNewtError("multiple BSPs detected")
        }
 
-       bsp, err := pkg.NewBspPackage(bspLpkg)
+       bsp, err := pkg.NewBspPackage(bspLpkg, nil)
        if err != nil {
                return nil, util.FmtNewtError(err.Error())
        }
diff --git a/newt/pkg/bsp_package.go b/newt/pkg/bsp_package.go
index 633956cc..afa7a30c 100644
--- a/newt/pkg/bsp_package.go
+++ b/newt/pkg/bsp_package.go
@@ -34,9 +34,16 @@ import (
 
 const BSP_YAML_FILENAME = "bsp.yml"
 
+type BspYCfgOverride struct {
+       Pkg  *LocalPackage
+       PkgY *ycfg.YCfg
+}
+
 type BspPackage struct {
        *LocalPackage
+       yov                *BspYCfgOverride
        CompilerName       string
+       CompilerNamePkg    *LocalPackage /* package which defines compiler name 
*/
        Arch               string
        LinkerScripts      []string
        Part2LinkerScripts []string /* scripts to link app to second partition 
*/
@@ -55,19 +62,22 @@ func (bsp *BspPackage) BspYamlPath() string {
 
 func (bsp *BspPackage) resolvePathSetting(
        settings *cfgv.Settings, key string) (string, error) {
+       var ypkg *LocalPackage
+       var ycfg *ycfg.YCfg
 
        proj := interfaces.GetProject()
 
-       val, err := bsp.BspV.GetValString(key, settings)
+       ypkg, ycfg = bsp.selectKey(key)
+       val, err := ycfg.GetValString(key, settings)
        util.OneTimeWarningError(err)
        if val == "" {
                return "", nil
        }
-       path, err := proj.ResolvePath(bsp.Repo().Path(), val)
+       path, err := proj.ResolvePath(ypkg.Repo().Path(), val)
        if err != nil {
                return "", util.PreNewtError(err,
-                       "BSP \"%s\" specifies invalid %s setting",
-                       bsp.Name(), key)
+                       "Package \"%s\" specifies invalid %s setting",
+                       ypkg.FullName(), key)
        }
        return path, nil
 }
@@ -76,11 +86,14 @@ func (bsp *BspPackage) resolvePathSetting(
 // scripts.
 func (bsp *BspPackage) resolveLinkerScriptSetting(
        settings *cfgv.Settings, key string) ([]string, error) {
+       var ypkg *LocalPackage
+       var ycfg *ycfg.YCfg
 
        paths := []string{}
 
        // Assume config file specifies a list of scripts.
-       vals, err := bsp.BspV.GetValStringSlice(key, settings)
+       ypkg, ycfg = bsp.selectKey(key)
+       vals, err := ycfg.GetValStringSlice(key, settings)
        util.OneTimeWarningError(err)
        if vals == nil {
                // Couldn't read a list of scripts; try to interpret setting as 
a
@@ -98,11 +111,11 @@ func (bsp *BspPackage) resolveLinkerScriptSetting(
 
                // Read each linker script from the list.
                for _, val := range vals {
-                       path, err := proj.ResolvePath(bsp.Repo().Path(), val)
+                       path, err := proj.ResolvePath(ypkg.Repo().Path(), val)
                        if err != nil {
                                return nil, util.PreNewtError(err,
-                                       "BSP \"%s\" specifies invalid %s 
setting",
-                                       bsp.Name(), key)
+                                       "Package \"%s\" specifies invalid %s 
setting",
+                                       ypkg.FullName(), key)
                        }
 
                        if path != "" {
@@ -114,7 +127,17 @@ func (bsp *BspPackage) resolveLinkerScriptSetting(
        return paths, nil
 }
 
+func (bsp *BspPackage) selectKey(key string) (*LocalPackage, *ycfg.YCfg) {
+       if bsp.yov != nil && bsp.yov.PkgY.HasKey(key) {
+               return bsp.yov.Pkg, bsp.yov.PkgY
+       } else {
+               return bsp.LocalPackage, &bsp.BspV
+       }
+}
+
 func (bsp *BspPackage) Reload(settings *cfgv.Settings) error {
+       var ypkg *LocalPackage
+       var ycfg *ycfg.YCfg
        var err error
 
        if settings == nil {
@@ -128,26 +151,28 @@ func (bsp *BspPackage) Reload(settings *cfgv.Settings) 
error {
        }
        bsp.AddCfgFilename(bsp.BspYamlPath())
 
-       bsp.CompilerName, err = bsp.BspV.GetValString("bsp.compiler", settings)
+       ypkg, ycfg = bsp.selectKey("bsp.compiler")
+       bsp.CompilerNamePkg = ypkg
+       bsp.CompilerName, err = ycfg.GetValString("bsp.compiler", settings)
        util.OneTimeWarningError(err)
 
        bsp.Arch, err = bsp.BspV.GetValString("bsp.arch", settings)
        util.OneTimeWarningError(err)
 
-       bsp.ImageOffset, err = bsp.BspV.GetValInt("bsp.image_offset", settings)
+       _, ycfg = bsp.selectKey("bsp.image_offset")
+       bsp.ImageOffset, err = ycfg.GetValInt("bsp.image_offset", settings)
        util.OneTimeWarningError(err)
 
-       bsp.ImagePad, err = bsp.BspV.GetValInt("bsp.image_pad", settings)
+       _, ycfg = bsp.selectKey("bsp.image_pad")
+       bsp.ImagePad, err = ycfg.GetValInt("bsp.image_pad", settings)
        util.OneTimeWarningError(err)
 
-       bsp.LinkerScripts, err = bsp.resolveLinkerScriptSetting(
-               settings, "bsp.linkerscript")
+       bsp.LinkerScripts, err = bsp.resolveLinkerScriptSetting(settings, 
"bsp.linkerscript")
        if err != nil {
                return err
        }
 
-       bsp.Part2LinkerScripts, err = bsp.resolveLinkerScriptSetting(
-               settings, "bsp.part2linkerscript")
+       bsp.Part2LinkerScripts, err = bsp.resolveLinkerScriptSetting(settings, 
"bsp.part2linkerscript")
        if err != nil {
                return err
        }
@@ -175,7 +200,8 @@ func (bsp *BspPackage) Reload(settings *cfgv.Settings) 
error {
                        "(bsp.arch)")
        }
 
-       ymlFlashMap, err := bsp.BspV.GetValStringMap("bsp.flash_map", settings)
+       _, ycfg = bsp.selectKey("bsp.flash_map")
+       ymlFlashMap, err := ycfg.GetValStringMap("bsp.flash_map", settings)
        util.OneTimeWarningError(err)
        if ymlFlashMap == nil {
                return util.NewNewtError("BSP does not specify a flash map " +
@@ -189,8 +215,9 @@ func (bsp *BspPackage) Reload(settings *cfgv.Settings) 
error {
        return nil
 }
 
-func NewBspPackage(lpkg *LocalPackage) (*BspPackage, error) {
+func NewBspPackage(lpkg *LocalPackage, yov *BspYCfgOverride) (*BspPackage, 
error) {
        bsp := &BspPackage{
+               yov:            yov,
                CompilerName:   "",
                DownloadScript: "",
                DebugScript:    "",
@@ -204,3 +231,12 @@ func NewBspPackage(lpkg *LocalPackage) (*BspPackage, 
error) {
 
        return bsp, err
 }
+
+func NewBspYCfgOverride(lpkg *LocalPackage, ycfg *ycfg.YCfg) *BspYCfgOverride {
+       ov := &BspYCfgOverride{
+               Pkg:  lpkg,
+               PkgY: ycfg,
+       }
+
+       return ov
+}
diff --git a/newt/target/target.go b/newt/target/target.go
index 45845b5e..ef91c73b 100644
--- a/newt/target/target.go
+++ b/newt/target/target.go
@@ -77,6 +77,10 @@ func LoadTarget(basePkg *pkg.LocalPackage) (*Target, error) {
        return target, nil
 }
 
+func (target *Target) GetBspYCfgOverride() *pkg.BspYCfgOverride {
+       return pkg.NewBspYCfgOverride(target.basePkg, &target.TargetY)
+}
+
 func (target *Target) TargetYamlPath() string {
        return fmt.Sprintf("%s/%s", target.basePkg.BasePath(), TARGET_FILENAME)
 }

Reply via email to