Skip to content

Commit f1c5cc5

Browse files
remove sketch,libraries,core build path from Context
1 parent 9349db8 commit f1c5cc5

File tree

7 files changed

+113
-89
lines changed

7 files changed

+113
-89
lines changed

arduino/builder/builder.go

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,26 @@
1616
package builder
1717

1818
import (
19+
"errors"
1920
"fmt"
2021

2122
"github.com/arduino/arduino-cli/arduino/sketch"
2223
"github.com/arduino/go-paths-helper"
2324
"github.com/arduino/go-properties-orderedmap"
2425
)
2526

27+
// ErrSketchCannotBeLocatedInBuildPath fixdoc
28+
var ErrSketchCannotBeLocatedInBuildPath = errors.New("sketch cannot be located in build path")
29+
2630
// Builder is a Sketch builder.
2731
type Builder struct {
2832
sketch *sketch.Sketch
2933
buildProperties *properties.Map
3034

31-
buildPath *paths.Path
35+
buildPath *paths.Path
36+
sketchBuildPath *paths.Path
37+
coreBuildPath *paths.Path
38+
librariesBuildPath *paths.Path
3239

3340
// Parallel processes
3441
jobs int
@@ -79,13 +86,33 @@ func NewBuilder(
7986
}
8087
buildProperties.Merge(customBuildProperties)
8188

89+
sketchBuildPath, err := buildPath.Join("sketch").Abs()
90+
if err != nil {
91+
return nil, err
92+
}
93+
librariesBuildPath, err := buildPath.Join("libraries").Abs()
94+
if err != nil {
95+
return nil, err
96+
}
97+
coreBuildPath, err := buildPath.Join("core").Abs()
98+
if err != nil {
99+
return nil, err
100+
}
101+
102+
if buildPath.Canonical().EqualsTo(sk.FullPath.Canonical()) {
103+
return nil, ErrSketchCannotBeLocatedInBuildPath
104+
}
105+
82106
return &Builder{
83107
sketch: sk,
84108
buildProperties: buildProperties,
85-
coreBuildCachePath: coreBuildCachePath,
109+
buildPath: buildPath,
110+
sketchBuildPath: sketchBuildPath,
111+
coreBuildPath: coreBuildPath,
112+
librariesBuildPath: librariesBuildPath,
86113
jobs: jobs,
87114
customBuildProperties: append(requestBuildProperties, "build.warn_data_percentage=75"),
88-
buildPath: buildPath,
115+
coreBuildCachePath: coreBuildCachePath,
89116
}, nil
90117
}
91118

@@ -108,3 +135,18 @@ func (b *Builder) CustomBuildProperties() []string {
108135
func (b *Builder) GetBuildPath() *paths.Path {
109136
return b.buildPath
110137
}
138+
139+
// GetSketchBuildPath returns the sketch build path
140+
func (b *Builder) GetSketchBuildPath() *paths.Path {
141+
return b.sketchBuildPath
142+
}
143+
144+
// GetCoreBuildPath returns the core build path
145+
func (b *Builder) GetCoreBuildPath() *paths.Path {
146+
return b.coreBuildPath
147+
}
148+
149+
// GetLibrariesBuildPath returns the libraries build path
150+
func (b *Builder) GetLibrariesBuildPath() *paths.Path {
151+
return b.librariesBuildPath
152+
}

arduino/builder/sketch_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestMergeSketchSources(t *testing.T) {
4848
}
4949
mergedSources := strings.ReplaceAll(string(mergedBytes), "%s", pathToGoldenSource)
5050

51-
b, err := NewBuilder(sk, nil, nil, false, nil, 0, nil)
51+
b, err := NewBuilder(sk, nil, paths.New("testdata"), false, nil, 0, nil)
5252
require.NoError(t, err)
5353

5454
offset, source, err := b.sketchMergeSources(nil)
@@ -63,7 +63,7 @@ func TestMergeSketchSourcesArduinoIncluded(t *testing.T) {
6363
require.NotNil(t, sk)
6464

6565
// ensure not to include Arduino.h when it's already there
66-
b, err := NewBuilder(sk, nil, nil, false, nil, 0, nil)
66+
b, err := NewBuilder(sk, nil, paths.New("testdata"), false, nil, 0, nil)
6767
require.NoError(t, err)
6868

6969
_, source, err := b.sketchMergeSources(nil)
@@ -80,7 +80,7 @@ func TestCopyAdditionalFiles(t *testing.T) {
8080
sk1, err := sketch.New(paths.New("testdata", t.Name()))
8181
require.Nil(t, err)
8282
require.Equal(t, sk1.AdditionalFiles.Len(), 1)
83-
b1, err := NewBuilder(sk1, nil, nil, false, nil, 0, nil)
83+
b1, err := NewBuilder(sk1, nil, paths.New("testdata"), false, nil, 0, nil)
8484
require.NoError(t, err)
8585

8686
// copy the sketch over, create a fake main file we don't care about it

commands/compile/compile.go

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package compile
1717

1818
import (
1919
"context"
20+
"errors"
2021
"fmt"
2122
"io"
2223
"sort"
@@ -37,7 +38,6 @@ import (
3738
"github.com/arduino/arduino-cli/i18n"
3839
"github.com/arduino/arduino-cli/internal/inventory"
3940
"github.com/arduino/arduino-cli/legacy/builder"
40-
"github.com/arduino/arduino-cli/legacy/builder/constants"
4141
"github.com/arduino/arduino-cli/legacy/builder/types"
4242
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
4343
paths "github.com/arduino/go-paths-helper"
@@ -170,26 +170,12 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
170170
coreBuildCachePath = buildCachePath.Join("core")
171171
}
172172

173-
sketchBuilder, err := bldr.NewBuilder(
174-
sk,
175-
boardBuildProperties,
176-
buildPath,
177-
req.GetOptimizeForDebug(),
178-
coreBuildCachePath,
179-
int(req.GetJobs()),
180-
req.GetBuildProperties(),
181-
)
182-
if err != nil {
183-
return nil, &arduino.InvalidArgumentError{Message: tr("Invalid build properties"), Cause: err}
184-
}
185-
186173
requiredTools, err := pme.FindToolsRequiredForBuild(targetPlatform, buildPlatform)
187174
if err != nil {
188175
return nil, err
189176
}
190177

191178
builderCtx := &types.Context{}
192-
builderCtx.Builder = sketchBuilder
193179
builderCtx.PackageManager = pme
194180
builderCtx.TargetBoard = targetBoard
195181
builderCtx.TargetPlatform = targetPlatform
@@ -205,10 +191,6 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
205191
builderCtx.OtherLibrariesDirs = paths.NewPathList(req.GetLibraries()...)
206192
builderCtx.OtherLibrariesDirs.Add(configuration.LibrariesDir(configuration.Settings))
207193

208-
builderCtx.CompilationDatabase = compilation.NewDatabase(
209-
sketchBuilder.GetBuildPath().Join("compile_commands.json"),
210-
)
211-
212194
builderCtx.BuiltInLibrariesDirs = configuration.IDEBuiltinLibrariesDir(configuration.Settings)
213195

214196
builderCtx.Clean = req.GetClean()
@@ -218,27 +200,31 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
218200
builderLogger := logger.New(outStream, errStream, req.GetVerbose(), req.GetWarnings())
219201
builderCtx.BuilderLogger = builderLogger
220202

221-
sketchBuildPath, err := buildPath.Join(constants.FOLDER_SKETCH).Abs()
222-
if err != nil {
223-
return r, &arduino.CompileFailedError{Message: err.Error()}
224-
}
225-
librariesBuildPath, err := buildPath.Join(constants.FOLDER_LIBRARIES).Abs()
226-
if err != nil {
227-
return r, &arduino.CompileFailedError{Message: err.Error()}
228-
}
229-
coreBuildPath, err := buildPath.Join(constants.FOLDER_CORE).Abs()
203+
sketchBuilder, err := bldr.NewBuilder(
204+
sk,
205+
boardBuildProperties,
206+
buildPath,
207+
req.GetOptimizeForDebug(),
208+
coreBuildCachePath,
209+
int(req.GetJobs()),
210+
req.GetBuildProperties(),
211+
)
230212
if err != nil {
213+
if strings.Contains(err.Error(), "invalid build properties") {
214+
return nil, &arduino.InvalidArgumentError{Message: tr("Invalid build properties"), Cause: err}
215+
}
216+
if errors.Is(err, bldr.ErrSketchCannotBeLocatedInBuildPath) {
217+
return r, &arduino.CompileFailedError{
218+
Message: tr("Sketch cannot be located in build path. Please specify a different build path"),
219+
}
220+
}
231221
return r, &arduino.CompileFailedError{Message: err.Error()}
232222
}
233-
builderCtx.SketchBuildPath = sketchBuildPath
234-
builderCtx.LibrariesBuildPath = librariesBuildPath
235-
builderCtx.CoreBuildPath = coreBuildPath
223+
builderCtx.Builder = sketchBuilder
236224

237-
if sketchBuilder.GetBuildPath().Canonical().EqualsTo(sk.FullPath.Canonical()) {
238-
return r, &arduino.CompileFailedError{
239-
Message: tr("Sketch cannot be located in build path. Please specify a different build path"),
240-
}
241-
}
225+
builderCtx.CompilationDatabase = compilation.NewDatabase(
226+
sketchBuilder.GetBuildPath().Join("compile_commands.json"),
227+
)
242228

243229
var libsManager *librariesmanager.LibrariesManager
244230
if pme.GetProfile() != nil {

legacy/builder/builder.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (s *Builder) Run(ctx *types.Context) error {
5151
}),
5252

5353
types.BareCommand(func(ctx *types.Context) error {
54-
ctx.LineOffset, _err = ctx.Builder.PrepareSketchBuildPath(ctx.SourceOverride, ctx.SketchBuildPath)
54+
ctx.LineOffset, _err = ctx.Builder.PrepareSketchBuildPath(ctx.SourceOverride, ctx.Builder.GetSketchBuildPath())
5555
return _err
5656
}),
5757

@@ -71,7 +71,7 @@ func (s *Builder) Run(ctx *types.Context) error {
7171

7272
types.BareCommand(func(ctx *types.Context) error {
7373
sketchObjectFiles, err := builder.SketchBuilder(
74-
ctx.SketchBuildPath,
74+
ctx.Builder.GetSketchBuildPath(),
7575
ctx.Builder.GetBuildProperties(),
7676
ctx.SketchLibrariesDetector.IncludeFolders(),
7777
ctx.OnlyUpdateCompilationDatabase,
@@ -98,14 +98,14 @@ func (s *Builder) Run(ctx *types.Context) error {
9898

9999
types.BareCommand(func(ctx *types.Context) error {
100100
return UnusedCompiledLibrariesRemover(
101-
ctx.LibrariesBuildPath,
101+
ctx.Builder.GetLibrariesBuildPath(),
102102
ctx.SketchLibrariesDetector.ImportedLibraries(),
103103
)
104104
}),
105105

106106
types.BareCommand(func(ctx *types.Context) error {
107107
librariesObjectFiles, err := builder.LibrariesBuilder(
108-
ctx.LibrariesBuildPath,
108+
ctx.Builder.GetLibrariesBuildPath(),
109109
ctx.Builder.GetBuildProperties(),
110110
ctx.SketchLibrariesDetector.IncludeFolders(),
111111
ctx.SketchLibrariesDetector.ImportedLibraries(),
@@ -133,7 +133,7 @@ func (s *Builder) Run(ctx *types.Context) error {
133133

134134
types.BareCommand(func(ctx *types.Context) error {
135135
objectFiles, archiveFile, err := builder.CoreBuilder(
136-
ctx.Builder.GetBuildPath(), ctx.CoreBuildPath, ctx.Builder.CoreBuildCachePath(),
136+
ctx.Builder.GetBuildPath(), ctx.Builder.GetCoreBuildPath(), ctx.Builder.CoreBuildCachePath(),
137137
ctx.Builder.GetBuildProperties(),
138138
ctx.ActualPlatform,
139139
ctx.OnlyUpdateCompilationDatabase, ctx.Clean,
@@ -236,7 +236,7 @@ func (s *Builder) Run(ctx *types.Context) error {
236236
types.BareCommand(func(ctx *types.Context) error {
237237
normalOutput, verboseOutput, err := ExportProjectCMake(
238238
mainErr != nil,
239-
ctx.Builder.GetBuildPath(), ctx.SketchBuildPath,
239+
ctx.Builder.GetBuildPath(), ctx.Builder.GetSketchBuildPath(),
240240
ctx.SketchLibrariesDetector.ImportedLibraries(),
241241
ctx.Builder.GetBuildProperties(),
242242
ctx.Builder.Sketch(),
@@ -319,7 +319,7 @@ func (s *Preprocess) Run(ctx *types.Context) error {
319319
}),
320320

321321
types.BareCommand(func(ctx *types.Context) error {
322-
ctx.LineOffset, _err = ctx.Builder.PrepareSketchBuildPath(ctx.SourceOverride, ctx.SketchBuildPath)
322+
ctx.LineOffset, _err = ctx.Builder.PrepareSketchBuildPath(ctx.SourceOverride, ctx.Builder.GetSketchBuildPath())
323323
return _err
324324
}),
325325

@@ -335,7 +335,7 @@ func (s *Preprocess) Run(ctx *types.Context) error {
335335
}
336336

337337
// Output arduino-preprocessed source
338-
preprocessedSketch, err := ctx.SketchBuildPath.Join(ctx.Builder.Sketch().MainFile.Base() + ".cpp").ReadFile()
338+
preprocessedSketch, err := ctx.Builder.GetSketchBuildPath().Join(ctx.Builder.Sketch().MainFile.Base() + ".cpp").ReadFile()
339339
if err != nil {
340340
return err
341341
}
@@ -378,9 +378,9 @@ func findIncludes(ctx *types.Context) types.BareCommand {
378378
ctx.Builder.GetBuildPath(),
379379
ctx.Builder.GetBuildProperties().GetPath("build.core.path"),
380380
ctx.Builder.GetBuildProperties().GetPath("build.variant.path"),
381-
ctx.SketchBuildPath,
381+
ctx.Builder.GetSketchBuildPath(),
382382
ctx.Builder.Sketch(),
383-
ctx.LibrariesBuildPath,
383+
ctx.Builder.GetLibrariesBuildPath(),
384384
ctx.Builder.GetBuildProperties(),
385385
ctx.TargetPlatform.Platform.Architecture,
386386
)

legacy/builder/test/builder_test.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package test
1717

1818
import (
1919
"fmt"
20+
"os"
2021
"path/filepath"
2122
"testing"
2223

@@ -25,7 +26,6 @@ import (
2526
"github.com/arduino/arduino-cli/arduino/builder/logger"
2627
"github.com/arduino/arduino-cli/arduino/cores/packagemanager"
2728
"github.com/arduino/arduino-cli/arduino/sketch"
28-
"github.com/arduino/arduino-cli/legacy/builder/constants"
2929
"github.com/arduino/arduino-cli/legacy/builder/types"
3030
"github.com/arduino/go-paths-helper"
3131
"github.com/stretchr/testify/require"
@@ -61,16 +61,7 @@ func prepareBuilderTestContext(t *testing.T, ctx *types.Context, sketchPath *pat
6161

6262
buildPath, err := paths.MkTempDir("", "test_build_path")
6363
require.NoError(t, err)
64-
sketchBuildPath, err := buildPath.Join(constants.FOLDER_SKETCH).Abs()
65-
require.NoError(t, err)
66-
librariesBuildPath, err := buildPath.Join(constants.FOLDER_LIBRARIES).Abs()
67-
require.NoError(t, err)
68-
coreBuildPath, err := buildPath.Join(constants.FOLDER_CORE).Abs()
69-
require.NoError(t, err)
70-
71-
ctx.SketchBuildPath = sketchBuildPath
72-
ctx.LibrariesBuildPath = librariesBuildPath
73-
ctx.CoreBuildPath = coreBuildPath
64+
require.NotNil(t, buildPath)
7465

7566
// Create a Package Manager from the given context
7667
// This should happen only on legacy arduino-builder.
@@ -94,9 +85,25 @@ func prepareBuilderTestContext(t *testing.T, ctx *types.Context, sketchPath *pat
9485
sk = s
9586
}
9687

88+
// This is an hack to avoid panic when the `NewBuilder` assert a condition on sketch path.
89+
// Since the test will be migrated soon in an E2E manner we temporary set the sketch to be empty.
90+
// so this assertion inside the Builder:
91+
// buildPath().Canonical().EqualsTo(sk.FullPath.Canonical())`
92+
// Doesn't fail
93+
if sk == nil {
94+
sk = &sketch.Sketch{
95+
MainFile: &paths.Path{},
96+
FullPath: paths.New(os.TempDir()),
97+
OtherSketchFiles: []*paths.Path{},
98+
AdditionalFiles: []*paths.Path{},
99+
RootFolderFiles: []*paths.Path{},
100+
Project: &sketch.Project{},
101+
}
102+
}
103+
97104
builderLogger := logger.New(nil, nil, false, "")
98105
ctx.BuilderLogger = builderLogger
99-
ctx.Builder, err = bldr.NewBuilder(sk, nil, nil, false, nil, 0, nil)
106+
ctx.Builder, err = bldr.NewBuilder(sk, nil, buildPath, false, nil, 0, nil)
100107
require.NoError(t, err)
101108
if fqbn != "" {
102109
ctx.FQBN = parseFQBN(t, fqbn)
@@ -116,10 +123,6 @@ func prepareBuilderTestContext(t *testing.T, ctx *types.Context, sketchPath *pat
116123
ctx.RequiredTools = requiredTools
117124
}
118125

119-
if sk != nil {
120-
require.False(t, ctx.Builder.GetBuildPath().Canonical().EqualsTo(sk.FullPath.Canonical()))
121-
}
122-
123126
if !stepToSkip[skipLibraries] {
124127
lm, libsResolver, _, err := detector.LibrariesLoader(
125128
false, nil,

0 commit comments

Comments
 (0)