From 4cb3c903fcc7d993e725ac786d36730ed08ddf06 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 12 Sep 2023 20:41:02 +0200 Subject: [PATCH] introduce BuilderArtifacts to better isolate write operations --- arduino/builder/builder.go | 17 +++++++++++++++++ arduino/builder/core.go | 13 +++++++------ arduino/builder/libraries.go | 10 +++++----- arduino/builder/linker.go | 12 ++++++------ arduino/builder/sketch.go | 11 ++++++----- legacy/builder/builder.go | 32 ++++---------------------------- legacy/builder/types/context.go | 5 ----- 7 files changed, 45 insertions(+), 55 deletions(-) diff --git a/arduino/builder/builder.go b/arduino/builder/builder.go index 668e83496b3..ec6dbb99800 100644 --- a/arduino/builder/builder.go +++ b/arduino/builder/builder.go @@ -72,9 +72,24 @@ type Builder struct { // C++ Parsing lineOffset int + buildArtifacts *BuildArtifacts + *BuildOptionsManager } +// BuildArtifacts contains the result of various build +type BuildArtifacts struct { + // populated by BuildCore + coreArchiveFilePath *paths.Path + coreObjectsFiles paths.PathList + + // populated by BuildLibraries + librariesObjectFiles paths.PathList + + // populated by BuildSketch + sketchObjectFiles paths.PathList +} + // NewBuilder creates a sketch Builder. func NewBuilder( sk *sketch.Sketch, @@ -160,6 +175,8 @@ func NewBuilder( onlyUpdateCompilationDatabase: onlyUpdateCompilationDatabase, compilationDatabase: compilation.NewDatabase(buildPath.Join("compile_commands.json")), Progress: progressStats, + executableSectionsSize: []ExecutableSectionSize{}, + buildArtifacts: &BuildArtifacts{}, BuildOptionsManager: NewBuildOptionsManager( hardwareDirs, builtInToolsDirs, otherLibrariesDirs, builtInLibrariesDirs, buildPath, diff --git a/arduino/builder/core.go b/arduino/builder/core.go index 16e25cdf1f3..e02aeb72ce4 100644 --- a/arduino/builder/core.go +++ b/arduino/builder/core.go @@ -32,9 +32,9 @@ import ( ) // BuildCore fixdoc -func (b *Builder) BuildCore(actualPlatform *cores.PlatformRelease) (paths.PathList, *paths.Path, error) { +func (b *Builder) BuildCore(actualPlatform *cores.PlatformRelease) error { if err := b.coreBuildPath.MkdirAll(); err != nil { - return nil, nil, errors.WithStack(err) + return errors.WithStack(err) } if b.coreBuildCachePath != nil { @@ -45,16 +45,17 @@ func (b *Builder) BuildCore(actualPlatform *cores.PlatformRelease) (paths.PathLi // compileCore function). b.coreBuildCachePath = nil } else if err := b.coreBuildCachePath.MkdirAll(); err != nil { - return nil, nil, errors.WithStack(err) + return errors.WithStack(err) } } archiveFile, objectFiles, err := b.compileCore(actualPlatform) if err != nil { - return nil, nil, errors.WithStack(err) + return errors.WithStack(err) } - - return objectFiles, archiveFile, nil + b.buildArtifacts.coreObjectsFiles = objectFiles + b.buildArtifacts.coreArchiveFilePath = archiveFile + return nil } func (b *Builder) compileCore(actualPlatform *cores.PlatformRelease) (*paths.Path, paths.PathList, error) { diff --git a/arduino/builder/libraries.go b/arduino/builder/libraries.go index 0c39353426f..bf52c920ffa 100644 --- a/arduino/builder/libraries.go +++ b/arduino/builder/libraries.go @@ -37,20 +37,20 @@ var ( ) // BuildLibraries fixdoc -func (b *Builder) BuildLibraries(includesFolders paths.PathList, importedLibraries libraries.List) (paths.PathList, error) { +func (b *Builder) BuildLibraries(includesFolders paths.PathList, importedLibraries libraries.List) error { includes := f.Map(includesFolders.AsStrings(), cpp.WrapWithHyphenI) libs := importedLibraries if err := b.librariesBuildPath.MkdirAll(); err != nil { - return nil, errors.WithStack(err) + return errors.WithStack(err) } librariesObjectFiles, err := b.compileLibraries(libs, includes) if err != nil { - return nil, errors.WithStack(err) + return errors.WithStack(err) } - - return librariesObjectFiles, nil + b.buildArtifacts.librariesObjectFiles = librariesObjectFiles + return nil } func directoryContainsFile(folder *paths.Path) bool { diff --git a/arduino/builder/linker.go b/arduino/builder/linker.go index 5d88460fbfd..b69e71aaefe 100644 --- a/arduino/builder/linker.go +++ b/arduino/builder/linker.go @@ -25,7 +25,7 @@ import ( ) // Link fixdoc -func (b *Builder) Link(sketchObjectFiles, librariesObjectFiles, coreObjectsFiles paths.PathList, coreArchiveFilePath *paths.Path) error { +func (b *Builder) Link() error { if b.onlyUpdateCompilationDatabase { if b.logger.Verbose() { b.logger.Info(tr("Skip linking of final executable.")) @@ -34,21 +34,21 @@ func (b *Builder) Link(sketchObjectFiles, librariesObjectFiles, coreObjectsFiles } // TODO can we remove this multiple assignations? - objectFilesSketch := sketchObjectFiles - objectFilesLibraries := librariesObjectFiles - objectFilesCore := coreObjectsFiles + objectFilesSketch := b.buildArtifacts.sketchObjectFiles + objectFilesLibraries := b.buildArtifacts.librariesObjectFiles + objectFilesCore := b.buildArtifacts.coreObjectsFiles objectFiles := paths.NewPathList() objectFiles.AddAll(objectFilesSketch) objectFiles.AddAll(objectFilesLibraries) objectFiles.AddAll(objectFilesCore) - coreDotARelPath, err := b.buildPath.RelTo(coreArchiveFilePath) + coreDotARelPath, err := b.buildPath.RelTo(b.buildArtifacts.coreArchiveFilePath) if err != nil { return errors.WithStack(err) } - if err := b.link(objectFiles, coreDotARelPath, coreArchiveFilePath); err != nil { + if err := b.link(objectFiles, coreDotARelPath, b.buildArtifacts.coreArchiveFilePath); err != nil { return errors.WithStack(err) } diff --git a/arduino/builder/sketch.go b/arduino/builder/sketch.go index ddd0f60f2e7..dbab5b521bc 100644 --- a/arduino/builder/sketch.go +++ b/arduino/builder/sketch.go @@ -181,11 +181,11 @@ func writeIfDifferent(source []byte, destPath *paths.Path) error { } // BuildSketch fixdoc -func (b *Builder) BuildSketch(includesFolders paths.PathList) (paths.PathList, error) { +func (b *Builder) BuildSketch(includesFolders paths.PathList) error { includes := f.Map(includesFolders.AsStrings(), cpp.WrapWithHyphenI) if err := b.sketchBuildPath.MkdirAll(); err != nil { - return nil, errors.WithStack(err) + return errors.WithStack(err) } sketchObjectFiles, err := utils.CompileFiles( @@ -197,7 +197,7 @@ func (b *Builder) BuildSketch(includesFolders paths.PathList) (paths.PathList, e b.Progress, ) if err != nil { - return nil, errors.WithStack(err) + return errors.WithStack(err) } // The "src/" subdirectory of a sketch is compiled recursively @@ -212,12 +212,13 @@ func (b *Builder) BuildSketch(includesFolders paths.PathList) (paths.PathList, e b.Progress, ) if err != nil { - return nil, errors.WithStack(err) + return errors.WithStack(err) } sketchObjectFiles.AddAll(srcObjectFiles) } - return sketchObjectFiles, nil + b.buildArtifacts.sketchObjectFiles = sketchObjectFiles + return nil } // MergeSketchWithBootloader fixdoc diff --git a/legacy/builder/builder.go b/legacy/builder/builder.go index 8f178efa0b1..a1dd20a283e 100644 --- a/legacy/builder/builder.go +++ b/legacy/builder/builder.go @@ -63,12 +63,7 @@ func (s *Builder) Run(ctx *types.Context) error { }), types.BareCommand(func(ctx *types.Context) error { - sketchObjectFiles, err := ctx.Builder.BuildSketch(ctx.SketchLibrariesDetector.IncludeFolders()) - if err != nil { - return err - } - ctx.SketchObjectFiles = sketchObjectFiles - return nil + return ctx.Builder.BuildSketch(ctx.SketchLibrariesDetector.IncludeFolders()) }), types.BareCommand(func(ctx *types.Context) error { @@ -87,16 +82,7 @@ func (s *Builder) Run(ctx *types.Context) error { }), types.BareCommand(func(ctx *types.Context) error { - librariesObjectFiles, err := ctx.Builder.BuildLibraries( - ctx.SketchLibrariesDetector.IncludeFolders(), - ctx.SketchLibrariesDetector.ImportedLibraries(), - ) - if err != nil { - return err - } - ctx.LibrariesObjectFiles = librariesObjectFiles - - return nil + return ctx.Builder.BuildLibraries(ctx.SketchLibrariesDetector.IncludeFolders(), ctx.SketchLibrariesDetector.ImportedLibraries()) }), types.BareCommand(func(ctx *types.Context) error { return recipeByPrefixSuffixRunner(ctx, "recipe.hooks.libraries.postbuild", ".pattern", true) @@ -108,12 +94,7 @@ func (s *Builder) Run(ctx *types.Context) error { }), types.BareCommand(func(ctx *types.Context) error { - objectFiles, archiveFile, err := ctx.Builder.BuildCore(ctx.ActualPlatform) - - ctx.CoreObjectsFiles = objectFiles - ctx.CoreArchiveFilePath = archiveFile - - return err + return ctx.Builder.BuildCore(ctx.ActualPlatform) }), types.BareCommand(func(ctx *types.Context) error { @@ -126,12 +107,7 @@ func (s *Builder) Run(ctx *types.Context) error { }), types.BareCommand(func(ctx *types.Context) error { - return ctx.Builder.Link( - ctx.SketchObjectFiles, - ctx.LibrariesObjectFiles, - ctx.CoreObjectsFiles, - ctx.CoreArchiveFilePath, - ) + return ctx.Builder.Link() }), types.BareCommand(func(ctx *types.Context) error { diff --git a/legacy/builder/types/context.go b/legacy/builder/types/context.go index 851674e1d95..5b5494ed0c9 100644 --- a/legacy/builder/types/context.go +++ b/legacy/builder/types/context.go @@ -39,9 +39,4 @@ type Context struct { PackageManager *packagemanager.Explorer TargetPlatform *cores.PlatformRelease ActualPlatform *cores.PlatformRelease - - CoreArchiveFilePath *paths.Path - CoreObjectsFiles paths.PathList - LibrariesObjectFiles paths.PathList - SketchObjectFiles paths.PathList }