Skip to content

Commit 5f22a7a

Browse files
committed
Automatically include libraries in profile without discovery.
1 parent e6f187d commit 5f22a7a

File tree

4 files changed

+50
-14
lines changed

4 files changed

+50
-14
lines changed

commands/instances.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ func (s *arduinoCoreServerImpl) Init(req *rpc.InitRequest, stream rpc.ArduinoCor
381381
}
382382
lmb.AddLibrariesDir(librariesmanager.LibrariesDir{
383383
Path: libDir,
384-
Location: libraries.Unmanaged,
384+
Location: libraries.User,
385385
IsSingleLibrary: true,
386386
})
387387
continue

commands/service_compile.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,11 @@ func (s *arduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.Ardu
100100
return &cmderrors.CantOpenSketchError{Cause: err}
101101
}
102102

103+
profile := pme.GetProfile()
103104
fqbnIn := req.GetFqbn()
104105
if fqbnIn == "" && sk != nil {
105-
if pme.GetProfile() != nil {
106-
fqbnIn = pme.GetProfile().FQBN
106+
if profile != nil {
107+
fqbnIn = profile.FQBN
107108
} else {
108109
fqbnIn = sk.GetDefaultFQBN()
109110
}
@@ -217,7 +218,7 @@ func (s *arduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.Ardu
217218
var libsManager *librariesmanager.LibrariesManager
218219
if lm, err := instances.GetLibraryManager(req.GetInstance()); err != nil {
219220
return err
220-
} else if pme.GetProfile() != nil {
221+
} else if profile != nil {
221222
libsManager = lm
222223
}
223224

@@ -250,6 +251,7 @@ func (s *arduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.Ardu
250251
librariesDirs.Add(s.settings.LibrariesDir())
251252
libraryDirs := paths.NewPathList(req.GetLibrary()...) // Array of single-library directories
252253

254+
alwaysBuildProfileLibs := profile != nil
253255
sketchBuilder, err := builder.NewBuilder(
254256
ctx,
255257
sk,
@@ -273,6 +275,7 @@ func (s *arduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.Ardu
273275
libraryDirs,
274276
outStream, errStream, verbosity, req.GetWarnings(),
275277
progressCB,
278+
alwaysBuildProfileLibs,
276279
pme.GetEnvVarsForSpawnedProcess(),
277280
)
278281
if err != nil {

internal/arduino/builder/builder.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ func NewBuilder(
136136
customLibraryDirs paths.PathList,
137137
stdout, stderr io.Writer, verbosity logger.Verbosity, warningsLevel string,
138138
progressCB rpc.TaskProgressCB,
139+
alwaysBuildProfileLibs bool,
139140
toolEnv []string,
140141
) (*Builder, error) {
141142
buildProperties := properties.NewMap()
@@ -185,7 +186,7 @@ func NewBuilder(
185186
}
186187

187188
log := logger.New(stdout, stderr, verbosity, warningsLevel)
188-
libsResolver, libsLoadingWarnings, err := detector.LibrariesLoader(
189+
libsManager, libsResolver, libsLoadingWarnings, err := detector.LibrariesLoader(
189190
useCachedLibrariesResolution,
190191
librariesManager,
191192
builtInLibrariesDirs,
@@ -239,9 +240,10 @@ func NewBuilder(
239240
),
240241
diagnosticStore: diagnosticStore,
241242
libsDetector: detector.NewSketchLibrariesDetector(
242-
libsResolver,
243+
libsManager, libsResolver,
243244
useCachedLibrariesResolution,
244245
onlyUpdateCompilationDatabase,
246+
alwaysBuildProfileLibs,
245247
log,
246248
diagnosticStore,
247249
),

internal/arduino/builder/internal/detector/detector.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ type libraryResolutionResult struct {
5050

5151
// SketchLibrariesDetector todo
5252
type SketchLibrariesDetector struct {
53+
librariesManager *librariesmanager.LibrariesManager
5354
librariesResolver *librariesresolver.Cpp
5455
useCachedLibrariesResolution bool
5556
cache *detectorCache
5657
onlyUpdateCompilationDatabase bool
58+
alwaysBuildProfileLibs bool
5759
importedLibraries libraries.List
5860
librariesResolutionResults map[string]libraryResolutionResult
5961
includeFolders paths.PathList
@@ -65,20 +67,24 @@ type SketchLibrariesDetector struct {
6567

6668
// NewSketchLibrariesDetector todo
6769
func NewSketchLibrariesDetector(
70+
lm *librariesmanager.LibrariesManager,
6871
libsResolver *librariesresolver.Cpp,
6972
useCachedLibrariesResolution bool,
7073
onlyUpdateCompilationDatabase bool,
74+
alwaysBuildProfileLibs bool,
7175
logger *logger.BuilderLogger,
7276
diagnosticStore *diagnostics.Store,
7377
) *SketchLibrariesDetector {
7478
return &SketchLibrariesDetector{
79+
librariesManager: lm,
7580
librariesResolver: libsResolver,
7681
useCachedLibrariesResolution: useCachedLibrariesResolution,
7782
cache: newDetectorCache(),
7883
librariesResolutionResults: map[string]libraryResolutionResult{},
7984
importedLibraries: libraries.List{},
8085
includeFolders: paths.PathList{},
8186
onlyUpdateCompilationDatabase: onlyUpdateCompilationDatabase,
87+
alwaysBuildProfileLibs: alwaysBuildProfileLibs,
8288
logger: logger,
8389
diagnosticStore: diagnosticStore,
8490
}
@@ -134,10 +140,25 @@ func (l *SketchLibrariesDetector) ImportedLibraries() libraries.List {
134140
return l.importedLibraries
135141
}
136142

137-
// AppendImportedLibraries todo should rename this, probably after refactoring the
138-
// container_find_includes command.
139-
func (l *SketchLibrariesDetector) AppendImportedLibraries(library *libraries.Library) {
143+
// addAndBuildLibrary adds the given library to the imported libraries list and queues its source files
144+
// for further processing.
145+
func (l *SketchLibrariesDetector) addAndBuildLibrary(sourceFileQueue *uniqueSourceFileQueue, librariesBuildPath *paths.Path, library *libraries.Library) {
140146
l.importedLibraries = append(l.importedLibraries, library)
147+
if library.Precompiled && library.PrecompiledWithSources {
148+
// Fully precompiled libraries should have no dependencies to avoid ABI breakage
149+
if l.logger.VerbosityLevel() == logger.VerbosityVerbose {
150+
l.logger.Info(i18n.Tr("Skipping dependencies detection for precompiled library %[1]s", library.Name))
151+
}
152+
} else {
153+
for _, sourceDir := range library.SourceDirs() {
154+
l.queueSourceFilesFromFolder(
155+
sourceFileQueue,
156+
sourceDir.Dir, sourceDir.Recurse,
157+
library.SourceDir,
158+
librariesBuildPath.Join(library.DirName),
159+
library.UtilityDir)
160+
}
161+
}
141162
}
142163

143164
// PrintUsedAndNotUsedLibraries todo
@@ -284,6 +305,16 @@ func (l *SketchLibrariesDetector) findIncludes(
284305
l.queueSourceFilesFromFolder(sourceFileQueue, srcSubfolderPath, true /* recurse */, sketchBuildPath, sketchBuildPath)
285306
}
286307

308+
if l.alwaysBuildProfileLibs {
309+
for _, library := range l.librariesManager.FindAllInstalled() {
310+
if library.Location == libraries.User {
311+
l.logger.Info(i18n.Tr("The library %[1]s has been automatically added from sketch project.", library.Name))
312+
l.addAndBuildLibrary(sourceFileQueue, librariesBuildPath, library)
313+
l.addIncludeFolder(library.SourceDir)
314+
}
315+
}
316+
}
317+
287318
for !sourceFileQueue.Empty() {
288319
err := l.findMissingIncludesInCompilationUnit(ctx, sourceFileQueue, buildProperties, librariesBuildPath, platformArch)
289320
if err != nil {
@@ -452,7 +483,7 @@ func (l *SketchLibrariesDetector) findMissingIncludesInCompilationUnit(
452483
// Add this library to the list of libraries, the
453484
// include path and queue its source files for further
454485
// include scanning
455-
l.AppendImportedLibraries(library)
486+
l.addAndBuildLibrary(sourceFileQueue, librariesBuildPath, library)
456487
l.addIncludeFolder(library.SourceDir)
457488

458489
if library.Precompiled && library.PrecompiledWithSources {
@@ -556,7 +587,7 @@ func LibrariesLoader(
556587
librariesDirs paths.PathList,
557588
buildPlatform *cores.PlatformRelease,
558589
targetPlatform *cores.PlatformRelease,
559-
) (*librariesresolver.Cpp, []byte, error) {
590+
) (*librariesmanager.LibrariesManager, *librariesresolver.Cpp, []byte, error) {
560591
verboseOut := &bytes.Buffer{}
561592
lm := librariesManager
562593
if useCachedLibrariesResolution {
@@ -569,7 +600,7 @@ func LibrariesLoader(
569600

570601
if builtInLibrariesDir != nil {
571602
if err := builtInLibrariesDir.ToAbs(); err != nil {
572-
return nil, nil, err
603+
return nil, nil, nil, err
573604
}
574605
lmb.AddLibrariesDir(librariesmanager.LibrariesDir{
575606
Path: builtInLibrariesDir,
@@ -592,7 +623,7 @@ func LibrariesLoader(
592623

593624
librariesFolders := librariesDirs
594625
if err := librariesFolders.ToAbs(); err != nil {
595-
return nil, nil, err
626+
return nil, nil, nil, err
596627
}
597628
for _, folder := range librariesFolders {
598629
lmb.AddLibrariesDir(librariesmanager.LibrariesDir{
@@ -618,5 +649,5 @@ func LibrariesLoader(
618649

619650
allLibs := lm.FindAllInstalled()
620651
resolver := librariesresolver.NewCppResolver(allLibs, targetPlatform, buildPlatform)
621-
return resolver, verboseOut.Bytes(), nil
652+
return lm, resolver, verboseOut.Bytes(), nil
622653
}

0 commit comments

Comments
 (0)