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 2016/11/10 22:38:49 UTC
[37/50] incubator-mynewt-newt git commit: newt - Allow BSP to specify
>1 linker script.
newt - Allow BSP to specify >1 linker script.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/8b428356
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/8b428356
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/8b428356
Branch: refs/heads/master
Commit: 8b428356d13727b836e23867dd091e9e9c3f72de
Parents: 5170736
Author: Christopher Collins <cc...@apache.org>
Authored: Mon Nov 7 15:10:45 2016 -0800
Committer: Christopher Collins <cc...@apache.org>
Committed: Mon Nov 7 15:12:46 2016 -0800
----------------------------------------------------------------------
newt/builder/build.go | 24 +++++++-------
newt/builder/targetbuild.go | 14 ++++-----
newt/pkg/bsp_package.go | 67 +++++++++++++++++++++++++++++++---------
newt/toolchain/compiler.go | 8 ++---
newt/toolchain/deps.go | 4 +--
5 files changed, 77 insertions(+), 40 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/8b428356/newt/builder/build.go
----------------------------------------------------------------------
diff --git a/newt/builder/build.go b/newt/builder/build.go
index abdba35..276a742 100644
--- a/newt/builder/build.go
+++ b/newt/builder/build.go
@@ -48,7 +48,7 @@ type Builder struct {
compilerInfo *toolchain.CompilerInfo
targetBuilder *TargetBuilder
cfg syscfg.Cfg
- linkerScript string
+ linkerScripts []string
buildName string
linkElf string
injectedSettings map[string]string
@@ -310,7 +310,7 @@ func (b *Builder) ExtractSymbolInfo() (error, *symbol.SymbolMap) {
return nil, syms
}
-func (b *Builder) link(elfName string, linkerScript string,
+func (b *Builder) link(elfName string, linkerScripts []string,
keepSymbols []string) error {
c, err := b.newCompiler(b.appPkg, b.FileBinDir(elfName))
@@ -327,9 +327,7 @@ func (b *Builder) link(elfName string, linkerScript string,
}
}
- if linkerScript != "" {
- c.LinkerScript = linkerScript
- }
+ c.LinkerScripts = linkerScripts
err = c.CompileElf(elfName, pkgNames, keepSymbols, b.linkElf)
if err != nil {
return err
@@ -454,14 +452,16 @@ func (b *Builder) Build() error {
return nil
}
-func (b *Builder) Link(linkerScript string) error {
- if err := b.link(b.AppElfPath(), linkerScript, nil); err != nil {
+func (b *Builder) Link(linkerScripts []string) error {
+ if err := b.link(b.AppElfPath(), linkerScripts, nil); err != nil {
return err
}
return nil
}
-func (b *Builder) KeepLink(linkerScript string, keepMap *symbol.SymbolMap) error {
+func (b *Builder) KeepLink(
+ linkerScripts []string, keepMap *symbol.SymbolMap) error {
+
keepSymbols := make([]string, 0)
if keepMap != nil {
@@ -469,14 +469,14 @@ func (b *Builder) KeepLink(linkerScript string, keepMap *symbol.SymbolMap) error
keepSymbols = append(keepSymbols, info.Name)
}
}
- if err := b.link(b.AppElfPath(), linkerScript, keepSymbols); err != nil {
+ if err := b.link(b.AppElfPath(), linkerScripts, keepSymbols); err != nil {
return err
}
return nil
}
-func (b *Builder) TestLink(linkerScript string) error {
- if err := b.link(b.AppTempElfPath(), linkerScript, nil); err != nil {
+func (b *Builder) TestLink(linkerScripts []string) error {
+ if err := b.link(b.AppTempElfPath(), linkerScripts, nil); err != nil {
return err
}
return nil
@@ -525,7 +525,7 @@ func (b *Builder) Test(p *pkg.LocalPackage) error {
testBpkg := b.PkgMap[p]
testFilename := b.TestExePath(testBpkg)
- if err := b.link(testFilename, "", nil); err != nil {
+ if err := b.link(testFilename, nil, nil); err != nil {
return err
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/8b428356/newt/builder/targetbuild.go
----------------------------------------------------------------------
diff --git a/newt/builder/targetbuild.go b/newt/builder/targetbuild.go
index b6e6fdd..e044b43 100644
--- a/newt/builder/targetbuild.go
+++ b/newt/builder/targetbuild.go
@@ -293,7 +293,7 @@ func (t *TargetBuilder) PrepBuild() error {
func (t *TargetBuilder) buildLoader() error {
/* Link the app as a test (using the normal single image linker script) */
- if err := t.AppBuilder.TestLink(t.bspPkg.LinkerScript); err != nil {
+ if err := t.AppBuilder.TestLink(t.bspPkg.LinkerScripts); err != nil {
return err
}
@@ -309,7 +309,7 @@ func (t *TargetBuilder) buildLoader() error {
}
/* perform a test link of the loader */
- if err := t.LoaderBuilder.TestLink(t.bspPkg.LinkerScript); err != nil {
+ if err := t.LoaderBuilder.TestLink(t.bspPkg.LinkerScripts); err != nil {
return err
}
@@ -353,18 +353,18 @@ func (t *TargetBuilder) Build() error {
return err
}
- linkerScript := ""
+ var linkerScripts []string
if t.LoaderBuilder == nil {
- linkerScript = t.bspPkg.LinkerScript
+ linkerScripts = t.bspPkg.LinkerScripts
} else {
if err := t.buildLoader(); err != nil {
return err
}
- linkerScript = t.bspPkg.Part2LinkerScript
+ linkerScripts = t.bspPkg.Part2LinkerScripts
}
/* Link the app. */
- if err := t.AppBuilder.Link(linkerScript); err != nil {
+ if err := t.AppBuilder.Link(linkerScripts); err != nil {
return err
}
@@ -506,7 +506,7 @@ func (t *TargetBuilder) RelinkLoader() (error, map[string]bool,
util.StatusMessage(util.VERBOSITY_VERBOSE,
"Migrating %d unused symbols into Loader\n", len(*preserveElf))
- err = t.LoaderBuilder.KeepLink(t.bspPkg.LinkerScript, preserveElf)
+ err = t.LoaderBuilder.KeepLink(t.bspPkg.LinkerScripts, preserveElf)
if err != nil {
return err, nil, nil
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/8b428356/newt/pkg/bsp_package.go
----------------------------------------------------------------------
diff --git a/newt/pkg/bsp_package.go b/newt/pkg/bsp_package.go
index c7bbdbb..d381da3 100644
--- a/newt/pkg/bsp_package.go
+++ b/newt/pkg/bsp_package.go
@@ -33,25 +33,26 @@ const BSP_YAML_FILENAME = "bsp.yml"
type BspPackage struct {
*LocalPackage
- CompilerName string
- Arch string
- LinkerScript string
- Part2LinkerScript string /* script to link app to second partition */
- DownloadScript string
- DebugScript string
- FlashMap flash.FlashMap
- BspV *viper.Viper
+ CompilerName string
+ Arch string
+ LinkerScripts []string
+ Part2LinkerScripts []string /* scripts to link app to second partition */
+ DownloadScript string
+ DebugScript string
+ FlashMap flash.FlashMap
+ BspV *viper.Viper
}
func (bsp *BspPackage) resolvePathSetting(
features map[string]bool, key string) (string, error) {
- outVal := newtutil.GetStringFeatures(bsp.BspV, features, key)
- if outVal == "" {
+ proj := interfaces.GetProject()
+
+ val := newtutil.GetStringFeatures(bsp.BspV, features, key)
+ if val == "" {
return "", nil
}
- proj := interfaces.GetProject()
- path, err := proj.ResolvePath(bsp.BasePath(), outVal)
+ path, err := proj.ResolvePath(bsp.BasePath(), val)
if err != nil {
return "", util.PreNewtError(err,
"BSP \"%s\" specifies invalid %s setting",
@@ -60,6 +61,43 @@ func (bsp *BspPackage) resolvePathSetting(
return path, nil
}
+// Interprets a setting as either a single linker script or a list of linker
+// scripts.
+func (bsp *BspPackage) resolveLinkerScriptSetting(
+ features map[string]bool, key string) ([]string, error) {
+
+ paths := []string{}
+
+ // Assume config file specifies a list of scripts.
+ vals := newtutil.GetStringSliceFeatures(bsp.BspV, features, key)
+ if vals == nil {
+ // Couldn't read a list of scripts; try to interpret setting as a
+ // single script.
+ path, err := bsp.resolvePathSetting(features, key)
+ if err != nil {
+ return nil, err
+ }
+
+ paths = append(paths, path)
+ } else {
+ proj := interfaces.GetProject()
+
+ // Read each linker script from the list.
+ for _, val := range vals {
+ path, err := proj.ResolvePath(bsp.BasePath(), val)
+ if err != nil {
+ return nil, util.PreNewtError(err,
+ "BSP \"%s\" specifies invalid %s setting",
+ bsp.Name(), key)
+ }
+
+ paths = append(paths, path)
+ }
+ }
+
+ return paths, nil
+}
+
func (bsp *BspPackage) Reload(features map[string]bool) error {
var err error
@@ -76,13 +114,13 @@ func (bsp *BspPackage) Reload(features map[string]bool) error {
bsp.Arch = newtutil.GetStringFeatures(bsp.BspV,
features, "bsp.arch")
- bsp.LinkerScript, err = bsp.resolvePathSetting(
+ bsp.LinkerScripts, err = bsp.resolveLinkerScriptSetting(
features, "bsp.linkerscript")
if err != nil {
return err
}
- bsp.Part2LinkerScript, err = bsp.resolvePathSetting(
+ bsp.Part2LinkerScripts, err = bsp.resolveLinkerScriptSetting(
features, "bsp.part2linkerscript")
if err != nil {
return err
@@ -126,7 +164,6 @@ func (bsp *BspPackage) Reload(features map[string]bool) error {
func NewBspPackage(lpkg *LocalPackage) (*BspPackage, error) {
bsp := &BspPackage{
CompilerName: "",
- LinkerScript: "",
DownloadScript: "",
DebugScript: "",
BspV: viper.New(),
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/8b428356/newt/toolchain/compiler.go
----------------------------------------------------------------------
diff --git a/newt/toolchain/compiler.go b/newt/toolchain/compiler.go
index e1c43a9..c139a28 100644
--- a/newt/toolchain/compiler.go
+++ b/newt/toolchain/compiler.go
@@ -57,8 +57,8 @@ type CompilerInfo struct {
}
type Compiler struct {
- ObjPathList map[string]bool
- LinkerScript string
+ ObjPathList map[string]bool
+ LinkerScripts []string
depTracker DepTracker
ccPath string
@@ -711,8 +711,8 @@ func (c *Compiler) CompileBinaryCmd(dstFile string, options map[string]bool,
/* so we don't get multiple global definitions of the same vartiable */
//cmd += " -Wl,--warn-common "
- if c.LinkerScript != "" {
- cmd += " -T " + c.LinkerScript
+ for _, ls := range c.LinkerScripts {
+ cmd += " -T " + ls
}
if options["mapFile"] {
cmd += " -Wl,-Map=" + dstFile + ".map"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/8b428356/newt/toolchain/deps.go
----------------------------------------------------------------------
diff --git a/newt/toolchain/deps.go b/newt/toolchain/deps.go
index e54c255..aad0dd6 100644
--- a/newt/toolchain/deps.go
+++ b/newt/toolchain/deps.go
@@ -363,8 +363,8 @@ func (tracker *DepTracker) LinkRequired(dstFile string,
}
// Check timestamp of the linker script and all input libraries.
- if tracker.compiler.LinkerScript != "" {
- objFiles = append(objFiles, tracker.compiler.LinkerScript)
+ for _, ls := range tracker.compiler.LinkerScripts {
+ objFiles = append(objFiles, ls)
}
for _, obj := range objFiles {
objModTime, err := util.FileModificationTime(obj)