diff --git a/src/arduino.cc/builder/includes_to_include_folders.go b/src/arduino.cc/builder/includes_to_include_folders.go index 1c52d8a2..9760fb64 100644 --- a/src/arduino.cc/builder/includes_to_include_folders.go +++ b/src/arduino.cc/builder/includes_to_include_folders.go @@ -140,8 +140,8 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library var library *types.Library for _, platform := range platforms { - if platform != nil && library == nil { - library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform)) + if platform != nil { + library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform, true)) } } @@ -150,6 +150,12 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library } if library == nil { + // reorder libraries to promote fully compatible ones + for _, platform := range platforms { + if platform != nil { + libraries = append(librariesCompatibleWithPlatform(libraries, platform, false), libraries...) + } + } library = libraries[0] } @@ -218,21 +224,34 @@ func findLibraryIn(libraries []*types.Library, library *types.Library) *types.Li return nil } -func libraryCompatibleWithPlatform(library *types.Library, platform *types.Platform) bool { +func libraryCompatibleWithPlatform(library *types.Library, platform *types.Platform) (bool, bool) { if len(library.Archs) == 0 { - return true + return true, true + } + if utils.SliceContains(library.Archs, constants.LIBRARY_ALL_ARCHS) { + return true, true } + return utils.SliceContains(library.Archs, platform.PlatformId), false +} + +func libraryCompatibleWithAllPlatforms(library *types.Library) bool { if utils.SliceContains(library.Archs, constants.LIBRARY_ALL_ARCHS) { return true } - return utils.SliceContains(library.Archs, platform.PlatformId) + return false } -func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types.Platform) []*types.Library { +func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types.Platform, reorder bool) []*types.Library { var compatibleLibraries []*types.Library for _, library := range libraries { - if libraryCompatibleWithPlatform(library, platform) { - compatibleLibraries = append(compatibleLibraries, library) + compatible, generic := libraryCompatibleWithPlatform(library, platform) + if compatible { + if !generic && len(compatibleLibraries) != 0 && libraryCompatibleWithAllPlatforms(compatibleLibraries[0]) && reorder == true { + //priority inversion + compatibleLibraries = append([]*types.Library{library}, compatibleLibraries...) + } else { + compatibleLibraries = append(compatibleLibraries, library) + } } }