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 35f4af9289a3cb5ffe19d8513c2b55bb72b7f4bd
Author: Christopher Collins <ccoll...@apache.org>
AuthorDate: Wed Oct 9 15:30:33 2019 -0700

    Pass pre-link artifacts to linker
    
    .a files produced by pre-link user scripts were not being passed to the
    linker.  This commit adds the pre-link "user source" directory to the
    list of directories to scan at link time.
    
    Note: Artifacts produced by pre-build scripts (not pre-link) do get used
    as intended.  At compile time, newt copies .a files from package source
    directories to their respective binary directories.  Since pre-link
    scripts run after compile time, this copy never happens for pre-link
    artifacts, so we need to tell newt where to look.
---
 newt/builder/build.go       | 61 +++++++++++++++++++++++++--------------------
 newt/builder/selftest.go    |  2 +-
 newt/builder/targetbuild.go | 34 ++++++++++++++++++++-----
 3 files changed, 63 insertions(+), 34 deletions(-)

diff --git a/newt/builder/build.go b/newt/builder/build.go
index d23d44d..7a25e76 100644
--- a/newt/builder/build.go
+++ b/newt/builder/build.go
@@ -90,9 +90,6 @@ func NewBuilder(
        if _, err := b.addUserPreBuildBpkg(); err != nil {
                return nil, err
        }
-       if _, err := b.addUserPreLinkBpkg(); err != nil {
-               return nil, err
-       }
 
        for api, rpkg := range apiMap {
                bpkg := b.PkgMap[rpkg]
@@ -400,22 +397,17 @@ func (b *Builder) ExtractSymbolInfo() (error, 
*symbol.SymbolMap) {
 }
 
 func (b *Builder) link(elfName string, linkerScripts []string,
-       keepSymbols []string) error {
+       keepSymbols []string, extraADirs []string) error {
 
        c, err := b.newCompiler(b.appPkg, b.FileBinDir(elfName))
        if err != nil {
                return err
        }
 
-       /* Always used the trimmed archive files. */
-       pkgNames := []string{}
-
+       // Calculate the list of directories containing source .a files.
+       var dirs []string
        for _, bpkg := range b.sortedBuildPackages() {
-               archiveNames, _ := filepath.Glob(b.PkgBinDir(bpkg) + "/*.a")
-               for i, archiveName := range archiveNames {
-                       archiveNames[i] = filepath.ToSlash(archiveName)
-               }
-               pkgNames = append(pkgNames, archiveNames...)
+               dirs = append(dirs, b.PkgBinDir(bpkg))
 
                // Collect lflags from all constituent packages.  Discard 
everything
                // from the compiler info except lflags; that is all that is 
relevant
@@ -426,9 +418,20 @@ func (b *Builder) link(elfName string, linkerScripts 
[]string,
                }
                c.AddInfo(&toolchain.CompilerInfo{Lflags: ci.Lflags})
        }
+       dirs = append(dirs, extraADirs...)
+
+       // Find all .a files in the input directories.
+       trimmedANames := []string{}
+       for _, dir := range dirs {
+               fullANames, _ := filepath.Glob(dir + "/*.a")
+               for i, archiveName := range fullANames {
+                       fullANames[i] = filepath.ToSlash(archiveName)
+               }
+               trimmedANames = append(trimmedANames, fullANames...)
+       }
 
        c.LinkerScripts = linkerScripts
-       err = c.CompileElf(elfName, pkgNames, keepSymbols, b.linkElf)
+       err = c.CompileElf(elfName, trimmedANames, keepSymbols, b.linkElf)
        if err != nil {
                return err
        }
@@ -555,13 +558,6 @@ func (b *Builder) addUserPreBuildBpkg() (*BuildPackage, 
error) {
                UserPreBuildDir(b.targetPkg.rpkg.Lpkg.FullName()))
 }
 
-// addUserPreLinkBpkg adds the pseudo user build package to the builder.  The
-// user build package contains inputs emitted by external scripts.
-func (b *Builder) addUserPreLinkBpkg() (*BuildPackage, error) {
-       return b.addPseudoBpkg("user-pre-link",
-               UserPreLinkDir(b.targetPkg.rpkg.Lpkg.FullName()))
-}
-
 // Runs build jobs while any remain.  On failure, signals the other workers to
 // stop via the stop channel.  On error, the error object is signaled via the
 // results channel.  On successful completion, nil is signaled via the results
@@ -693,15 +689,17 @@ func (b *Builder) Build() error {
        return nil
 }
 
-func (b *Builder) Link(linkerScripts []string) error {
-       if err := b.link(b.AppElfPath(), linkerScripts, nil); err != nil {
+func (b *Builder) Link(linkerScripts []string, extraADirs []string) error {
+       if err := b.link(b.AppElfPath(), linkerScripts, nil,
+               extraADirs); err != nil {
+
                return err
        }
        return nil
 }
 
-func (b *Builder) KeepLink(
-       linkerScripts []string, keepMap *symbol.SymbolMap) error {
+func (b *Builder) KeepLink(linkerScripts []string, keepMap *symbol.SymbolMap,
+       extraADirs []string) error {
 
        keepSymbols := make([]string, 0)
 
@@ -710,16 +708,25 @@ func (b *Builder) KeepLink(
                        keepSymbols = append(keepSymbols, info.Name)
                }
        }
-       if err := b.link(b.AppElfPath(), linkerScripts, keepSymbols); err != 
nil {
+
+       if err := b.link(b.AppElfPath(), linkerScripts, keepSymbols,
+               extraADirs); err != nil {
+
                return err
        }
+
        return nil
 }
 
-func (b *Builder) TentativeLink(linkerScripts []string) error {
-       if err := b.link(b.AppTentativeElfPath(), linkerScripts, nil); err != 
nil {
+func (b *Builder) TentativeLink(linkerScripts []string,
+       extraADirs []string) error {
+
+       if err := b.link(b.AppTentativeElfPath(), linkerScripts, nil,
+               extraADirs); err != nil {
+
                return err
        }
+
        return nil
 }
 
diff --git a/newt/builder/selftest.go b/newt/builder/selftest.go
index 1fb4cc3..1ff1aae 100644
--- a/newt/builder/selftest.go
+++ b/newt/builder/selftest.go
@@ -33,7 +33,7 @@ import (
 
 func (b *Builder) SelfTestLink(rpkg *resolve.ResolvePackage) error {
        testPath := b.TestExePath()
-       if err := b.link(testPath, nil, nil); err != nil {
+       if err := b.link(testPath, nil, nil, nil); err != nil {
                return err
        }
 
diff --git a/newt/builder/targetbuild.go b/newt/builder/targetbuild.go
index db337e5..bbc35ff 100644
--- a/newt/builder/targetbuild.go
+++ b/newt/builder/targetbuild.go
@@ -325,6 +325,22 @@ func (t *TargetBuilder) validateAndWriteCfg() error {
        return nil
 }
 
+// extraADirs returns a slice of extra directories that should be used at link
+// time.  .a files in these directores are used as input to the link (in
+// addition to .a files produced by building packages).
+func (t *TargetBuilder) extraADirs() []string {
+       return []string{
+               // Artifacts generated by pre-link user scripts.
+               UserPreLinkSrcDir(t.target.FullName()),
+       }
+
+       // Note: we don't include the pre-build source directory in this list.  
At
+       // compile time, newt copies .a files from package source directories to
+       // their respective binary directories.  Since pre-link scripts run 
after
+       // compile time, this copy never happens for pre-link artifacts, so we 
need
+       // to tell newt where to look.
+}
+
 func (t *TargetBuilder) PrepBuild() error {
        if err := t.ensureResolved(); err != nil {
                return err
@@ -395,8 +411,12 @@ func (t *TargetBuilder) PrepBuild() error {
 }
 
 func (t *TargetBuilder) buildLoader() error {
-       /* Tentatively link the app (using the normal single image linker 
script) */
-       if err := t.AppBuilder.TentativeLink(t.bspPkg.LinkerScripts); err != 
nil {
+       /* Tentatively link the app (using the normal single image linker
+        * script)
+        */
+       if err := t.AppBuilder.TentativeLink(t.bspPkg.LinkerScripts,
+               t.extraADirs()); err != nil {
+
                return err
        }
 
@@ -412,7 +432,9 @@ func (t *TargetBuilder) buildLoader() error {
        }
 
        /* Tentatively link the loader */
-       if err := t.LoaderBuilder.TentativeLink(t.bspPkg.LinkerScripts); err != 
nil {
+       if err := t.LoaderBuilder.TentativeLink(t.bspPkg.LinkerScripts,
+               t.extraADirs()); err != nil {
+
                return err
        }
 
@@ -554,7 +576,7 @@ func (t *TargetBuilder) Build() error {
        }
 
        /* Link the app. */
-       if err := t.AppBuilder.Link(linkerScripts); err != nil {
+       if err := t.AppBuilder.Link(linkerScripts, t.extraADirs()); err != nil {
                return err
        }
 
@@ -685,8 +707,8 @@ 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.LinkerScripts, preserveElf)
-
+       err = t.LoaderBuilder.KeepLink(t.bspPkg.LinkerScripts, preserveElf,
+               t.extraADirs())
        if err != nil {
                return err, nil, nil
        }

Reply via email to