Skip to content

Commit acea85a

Browse files
committed
Avoid rebuilding the sketch if the sketch file is unchanged.
1 parent 16b2b20 commit acea85a

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

internal/arduino/builder/internal/preprocessor/ctags.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,20 @@ func PreprocessSketchWithCtags(
5555

5656
stdout, stderr := &bytes.Buffer{}, &bytes.Buffer{}
5757

58-
// Run GCC preprocessor
58+
// Check if the preprocessed file is already up-to-date
59+
unpreprocessedSourceFile := buildPath.Join("sketch", sketch.MainFile.Base()+".cpp.merged")
5960
sourceFile := buildPath.Join("sketch", sketch.MainFile.Base()+".cpp")
61+
if unpreprocessedStat, err := unpreprocessedSourceFile.Stat(); err != nil {
62+
return nil, fmt.Errorf("%s: %w", i18n.Tr("unable to open unpreprocessed source file"), err)
63+
} else if sourceStat, err := sourceFile.Stat(); err != nil {
64+
return nil, fmt.Errorf("%s: %w", i18n.Tr("unable to open source file"), err)
65+
} else if unpreprocessedStat.ModTime().Before(sourceStat.ModTime()) {
66+
fmt.Fprintln(stdout, i18n.Tr("Sketch is unchanged, skipping preprocessing."))
67+
res := &runner.Result{Stdout: stdout.Bytes(), Stderr: stderr.Bytes()}
68+
return res, nil
69+
}
70+
71+
// Run GCC preprocessor
6072
result := GCC(sourceFile, ctagsTarget, includes, buildProperties).Run(ctx)
6173
stdout.Write(result.Stdout)
6274
stderr.Write(result.Stderr)

internal/arduino/builder/sketch.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,21 @@ func (b *Builder) prepareSketchBuildPath() error {
5050
return err
5151
}
5252

53-
destFile := b.sketchBuildPath.Join(b.sketch.MainFile.Base() + ".cpp")
54-
if err := destFile.WriteFile([]byte(mergedSource)); err != nil {
55-
return err
53+
// Save the unpreprocessed merged source to a file named sketch.cpp.merged.
54+
destFileUnpreprocessed := b.sketchBuildPath.Join(b.sketch.MainFile.Base() + ".cpp.merged")
55+
oldUnpreprocessedSource, _ := destFileUnpreprocessed.ReadFile()
56+
57+
// If the merged source is unchanged, skip writing it.
58+
// This avoids unnecessary rebuilds and keeps the build path clean.
59+
if !bytes.Equal(oldUnpreprocessedSource, []byte(mergedSource)) {
60+
if err := destFileUnpreprocessed.WriteFile([]byte(mergedSource)); err != nil {
61+
return err
62+
}
63+
64+
destFile := b.sketchBuildPath.Join(b.sketch.MainFile.Base() + ".cpp")
65+
if err := destFileUnpreprocessed.CopyTo(destFile); err != nil {
66+
return err
67+
}
5668
}
5769

5870
if err := b.sketchCopyAdditionalFiles(b.sketchBuildPath, b.sourceOverrides); err != nil {

0 commit comments

Comments
 (0)