Skip to content

Commit 3577d1b

Browse files
author
Federico Fissore
committed
Libraries in platforms were being chosen instead of those outside, keeping
users from customizing them. Fixes #38 Signed-off-by: Federico Fissore <[email protected]>
1 parent 46bd8e8 commit 3577d1b

File tree

2 files changed

+94
-19
lines changed

2 files changed

+94
-19
lines changed

Diff for: src/arduino.cc/builder/includes_to_include_folders.go

+55-18
Original file line numberDiff line numberDiff line change
@@ -125,27 +125,14 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library
125125
return
126126
}
127127

128-
if markedLibrariesContainOneOfCandidate(markImportedLibrary, libraries) {
128+
if markImportedLibraryContainsOneOfCandidates(markImportedLibrary, libraries) {
129129
return
130130
}
131131

132-
var library *types.Library
133-
134-
for _, platform := range platforms {
135-
if platform != nil && library == nil {
136-
librariesWithinSpecifiedPlatform := librariesWithinPlatform(libraries, platform)
137-
library = findBestLibraryWithHeader(header, librariesWithinSpecifiedPlatform)
138-
}
139-
}
140-
141-
for _, platform := range platforms {
142-
if platform != nil && library == nil {
143-
library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform))
144-
}
145-
}
132+
library := findLibraryOutsideAnyPlatform(header, libraries, platforms)
146133

147134
if library == nil {
148-
library = findBestLibraryWithHeader(header, libraries)
135+
library = findLibraryInPlatforms(header, libraries, platforms)
149136
}
150137

151138
if library == nil {
@@ -159,7 +146,57 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library
159146
markImportedLibrary[library] = true
160147
}
161148

162-
func markedLibrariesContainOneOfCandidate(markImportedLibrary map[*types.Library]bool, libraries []*types.Library) bool {
149+
func findLibraryInPlatforms(header string, libraries []*types.Library, platforms []*types.Platform) *types.Library {
150+
for _, platform := range platforms {
151+
if platform != nil {
152+
librariesWithinSpecifiedPlatform := librariesWithinPlatform(libraries, platform)
153+
library := findBestLibraryWithHeader(header, librariesWithinSpecifiedPlatform)
154+
if library != nil {
155+
return library
156+
}
157+
}
158+
}
159+
160+
return nil
161+
}
162+
163+
func findLibraryOutsideAnyPlatform(header string, libraries []*types.Library, platforms []*types.Platform) *types.Library {
164+
librariesOutsidePlatforms := librariesOutsideAnyPlatform(libraries, platforms)
165+
166+
for _, platform := range platforms {
167+
if platform != nil {
168+
library := findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(librariesOutsidePlatforms, platform))
169+
if library != nil {
170+
return library
171+
}
172+
}
173+
}
174+
175+
return findBestLibraryWithHeader(header, librariesOutsidePlatforms)
176+
}
177+
178+
func librariesOutsideAnyPlatform(libraries []*types.Library, platforms []*types.Platform) []*types.Library {
179+
allLibsAsMap := make(map[*types.Library]bool)
180+
for _, lib := range libraries {
181+
allLibsAsMap[lib] = true
182+
}
183+
for _, platform := range platforms {
184+
if platform != nil {
185+
librariesWithinSpecifiedPlatform := librariesWithinPlatform(libraries, platform)
186+
for _, libraryWithinPlatform := range librariesWithinSpecifiedPlatform {
187+
delete(allLibsAsMap, libraryWithinPlatform)
188+
}
189+
}
190+
}
191+
192+
librariesOutsidePlatforms := []*types.Library{}
193+
for lib, _ := range allLibsAsMap {
194+
librariesOutsidePlatforms = append(librariesOutsidePlatforms, lib)
195+
}
196+
return librariesOutsidePlatforms
197+
}
198+
199+
func markImportedLibraryContainsOneOfCandidates(markImportedLibrary map[*types.Library]bool, libraries []*types.Library) bool {
163200
for markedLibrary, _ := range markImportedLibrary {
164201
for _, library := range libraries {
165202
if markedLibrary == library {
@@ -211,7 +248,7 @@ func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types
211248
}
212249

213250
func librariesWithinPlatform(libraries []*types.Library, platform *types.Platform) []*types.Library {
214-
var librariesWithinSpecifiedPlatform []*types.Library
251+
librariesWithinSpecifiedPlatform := []*types.Library{}
215252
for _, library := range libraries {
216253
cleanPlatformFolder := filepath.Clean(platform.Folder)
217254
cleanLibraryFolder := filepath.Clean(library.SrcFolder)

Diff for: src/arduino.cc/builder/test/includes_to_include_folders_test.go

+39-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func TestIncludesToIncludeFoldersDuplicateLibs(t *testing.T) {
200200
context[constants.CTX_FQBN] = "my_avr_platform:avr:custom_yun"
201201
context[constants.CTX_SKETCH_LOCATION] = filepath.Join("user_hardware", "my_avr_platform", "avr", "libraries", "SPI", "examples", "BarometricPressureSensor", "BarometricPressureSensor.ino")
202202
context[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION] = "10600"
203-
context[constants.CTX_LIBRARIES_FOLDERS] = []string{"libraries", "downloaded_libraries"}
203+
context[constants.CTX_LIBRARIES_FOLDERS] = []string{"downloaded_libraries"}
204204
context[constants.CTX_VERBOSE] = false
205205

206206
commands := []types.Command{
@@ -225,6 +225,44 @@ func TestIncludesToIncludeFoldersDuplicateLibs(t *testing.T) {
225225
require.Equal(t, Abs(t, filepath.Join("user_hardware", "my_avr_platform", "avr", "libraries", "SPI")), importedLibraries[0].SrcFolder)
226226
}
227227

228+
func TestIncludesToIncludeFoldersDuplicateLibsWithConflictingLibsOutsideOfPlatform(t *testing.T) {
229+
DownloadCoresAndToolsAndLibraries(t)
230+
231+
context := make(map[string]interface{})
232+
233+
buildPath := SetupBuildPath(t, context)
234+
defer os.RemoveAll(buildPath)
235+
236+
context[constants.CTX_HARDWARE_FOLDERS] = []string{filepath.Join("..", "hardware"), "hardware", "downloaded_hardware", "user_hardware"}
237+
context[constants.CTX_TOOLS_FOLDERS] = []string{"downloaded_tools"}
238+
context[constants.CTX_FQBN] = "my_avr_platform:avr:custom_yun"
239+
context[constants.CTX_SKETCH_LOCATION] = filepath.Join("user_hardware", "my_avr_platform", "avr", "libraries", "SPI", "examples", "BarometricPressureSensor", "BarometricPressureSensor.ino")
240+
context[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION] = "10600"
241+
context[constants.CTX_LIBRARIES_FOLDERS] = []string{"downloaded_libraries", "libraries"}
242+
context[constants.CTX_VERBOSE] = true
243+
244+
commands := []types.Command{
245+
&builder.SetupHumanLoggerIfMissing{},
246+
247+
&builder.ContainerSetupHardwareToolsLibsSketchAndProps{},
248+
249+
&builder.ContainerMergeCopySketchFiles{},
250+
251+
&builder.ContainerFindIncludes{},
252+
}
253+
254+
for _, command := range commands {
255+
err := command.Run(context)
256+
NoError(t, err)
257+
}
258+
259+
importedLibraries := context[constants.CTX_IMPORTED_LIBRARIES].([]*types.Library)
260+
sort.Sort(ByLibraryName(importedLibraries))
261+
require.Equal(t, 1, len(importedLibraries))
262+
require.Equal(t, "SPI", importedLibraries[0].Name)
263+
require.Equal(t, Abs(t, filepath.Join("libraries", "SPI")), importedLibraries[0].SrcFolder)
264+
}
265+
228266
func TestIncludesToIncludeFoldersDuplicateLibs2(t *testing.T) {
229267
DownloadCoresAndToolsAndLibraries(t)
230268

0 commit comments

Comments
 (0)