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)