diff --git a/newt/builder/build.go b/newt/builder/build.go index 651c7dc47..d2fc0c9e0 100644 --- a/newt/builder/build.go +++ b/newt/builder/build.go @@ -150,6 +150,10 @@ func (b *Builder) addPackage(rpkg *resolve.ResolvePackage) ( return bpkg, nil } +func (b *Builder) GetAutogeneratedLinkerIncludeDir() (string, error) { + return b.targetBuilder.BspPkg().GetAutogeneratedLinkerIncludePath() +} + func pkgTypeConflictErr(p1 *BuildPackage, p2 *BuildPackage) error { return util.FmtNewtError("Two %s packages in build: %s, %s", pkg.PackageTypeNames[p1.rpkg.Lpkg.Type()], @@ -470,6 +474,11 @@ func (b *Builder) link(elfName string, linkerScripts []string, } c.LinkerScripts = linkerScripts + c.AutogeneratedLinkerIncludeDir, err = b.GetAutogeneratedLinkerIncludeDir() + if err != nil { + return err + } + err = c.CompileElf(elfName, trimmedANames, keepSymbols, b.linkElf) if err != nil { return err diff --git a/newt/builder/cmake.go b/newt/builder/cmake.go index dabb2a99f..67d44f6fb 100644 --- a/newt/builder/cmake.go +++ b/newt/builder/cmake.go @@ -284,6 +284,8 @@ func (b *Builder) CMakeTargetWrite(w io.Writer, targetCompiler *toolchain.Compil lFlags = append(lFlags, "-T"+ld) } + lFlags = append(lFlags, "-L"+c.AutogeneratedLinkerIncludeDir) + var cFlags []string cFlags = append(cFlags, c.GetCompilerInfo().Cflags...) cFlags = append(cFlags, c.GetLocalCompilerInfo().Cflags...) @@ -365,7 +367,8 @@ func CmakeCompilerInfoWrite(w io.Writer, archiveFile string, bpkg *BuildPackage, } func (t *TargetBuilder) CMakeTargetBuilderWrite(w io.Writer, targetCompiler *toolchain.Compiler) error { - if err := t.PrepBuild(); err != nil { + var err error + if err = t.PrepBuild(); err != nil { return err } @@ -381,12 +384,15 @@ func (t *TargetBuilder) CMakeTargetBuilderWrite(w io.Writer, targetCompiler *too project.ResetDeps(t.AppList) targetCompiler.LinkerScripts = t.bspPkg.LinkerScripts + if targetCompiler.AutogeneratedLinkerIncludeDir, err = t.bspPkg.GetAutogeneratedLinkerIncludePath(); err != nil { + return err + } - if err := t.bspPkg.Reload(t.AppBuilder.cfg.SettingValues()); err != nil { + if err = t.bspPkg.Reload(t.AppBuilder.cfg.SettingValues()); err != nil { return err } - if err := t.AppBuilder.CMakeTargetWrite(w, targetCompiler); err != nil { + if err = t.AppBuilder.CMakeTargetWrite(w, targetCompiler); err != nil { return err } diff --git a/newt/pkg/bsp_package.go b/newt/pkg/bsp_package.go index 39e466695..46ecb7fb1 100644 --- a/newt/pkg/bsp_package.go +++ b/newt/pkg/bsp_package.go @@ -92,6 +92,16 @@ func (bsp *BspPackage) getAutogeneratedLinkerScriptPath() (string, error) { return path, nil } +func (bsp *BspPackage) GetAutogeneratedLinkerIncludePath() (string, error) { + defaultLinkerScriptPath := "bin/" + bsp.yov.Pkg.Name() + "/generated/link/include" + proj := interfaces.GetProject() + path, err := proj.ResolvePath(proj.Path(), defaultLinkerScriptPath) + if err != nil { + return "", err + } + return path, nil +} + // Interprets a setting as either a single linker script or a list of linker // scripts. func (bsp *BspPackage) resolveLinkerScriptSetting( diff --git a/newt/toolchain/compiler.go b/newt/toolchain/compiler.go index c63eabbf6..82ee88c15 100644 --- a/newt/toolchain/compiler.go +++ b/newt/toolchain/compiler.go @@ -70,8 +70,9 @@ type CompileCommand struct { } type Compiler struct { - objPathList map[string]bool - LinkerScripts []string + objPathList map[string]bool + LinkerScripts []string + AutogeneratedLinkerIncludeDir string // Needs to be locked whenever a mutable field in this struct is accessed // during a build. Currently, objPathList is the only such member. @@ -1040,6 +1041,9 @@ func (c *Compiler) CompileBinaryCmd(dstFile string, options map[string]bool, cmd = append(cmd, "-T") cmd = append(cmd, ls) } + cmd = append(cmd, "-L") + cmd = append(cmd, c.AutogeneratedLinkerIncludeDir) + if options["mapFile"] { cmd = append(cmd, "-Wl,-Map="+dstFile+".map") }